2

sys.dm_fts_parser に与えられた 2 つの類似した文字列が異なる結果をもたらすことを理解するのに非常に苦労しています

select * from sys.dm_fts_parser('"0 CAD"', 0, null, 0) 

「0 CAD」が 1 トークンであると考えているようです (2 トークンを返します)。

select * from sys.dm_fts_parser('"0 cad"', 0, null, 0) 

3 つのトークンを返します - 正しく

もっと重要で、さらに紛らわしいのは、その理由です

select * from Table where contains(*,"point 5 CAD")動作し、 select * from Table where contains(*,"point 5 cad")失敗する

検索された列に「ポイント 5 CAD」が含まれている場合 -

フルテキスト インデックス ビルダーは、インデックス設定に基づいてノイズ ワード ("5" など) を無視するか、含める必要があります。
両方を試しましたが、なぜ「nnnn CAD」が特別なのか説明できません

http://msdn.microsoft.com/en-us/library/ms142583.aspxによると、全文は大文字と小文字を区別しないと想定されていることに注意してください。

私は何が欠けていますか?

編集:SQL 2012 11.0.2218を使用

4

4 に答える 4

3

私のチームも、この奇妙なトークン化動作に遭遇しました。私たちの修正は、クエリと検索テキストにLOWERを適用することでした。

Haroon が以前に特定したように、この問題は、トークナイザーが数字に近い特定の大文字の通貨コードを特定し、それらを異なる方法で処理することから発生したようです。これは、次のクエリによって示されます。

SELECT * FROM sys.dm_fts_parser ('"syp 123"', 1033, 0, 0) -- Works fine
SELECT * FROM sys.dm_fts_parser ('"SYP 123"', 1033, 0, 0) -- Doesn't work

この動作を示す 1 ~ 4 文字の文字の組み合わせをすべて特定するスクリプトを作成しました。

DECLARE @CurrencyCodes TABLE (CurrencyCode varchar(4), TokenCount int)
DECLARE @Start int = 65 -- A
DECLARE @End int = 90 -- Z

DECLARE @A int, @B int, @C int, @D int

SET @A = @Start
WHILE NOT (@A > @End) BEGIN
    INSERT INTO @CurrencyCodes VALUES (CHAR(@A), NULL)
    SET @B = @Start
    WHILE NOT (@B > @End) BEGIN
        INSERT INTO @CurrencyCodes VALUES (CHAR(@A) + CHAR(@B), NULL)
        SET @C = @Start
        WHILE NOT (@C > @End) BEGIN
            INSERT INTO @CurrencyCodes VALUES (CHAR(@A) + CHAR(@B) + CHAR(@C), NULL)
                SET @D = @Start
                WHILE NOT (@D > @End) BEGIN
                    INSERT INTO @CurrencyCodes VALUES (CHAR(@A) + CHAR(@B) + CHAR(@C) + CHAR(@D), NULL)
                    SET @D = @D + 1
                END
            SET @C = @C + 1
        END
        SET @B = @B + 1
    END
    SET @A = @A + 1
END

UPDATE @CurrencyCodes SET TokenCount = (SELECT COUNT(1) FROM sys.dm_fts_parser ('"' + CurrencyCode + '123,456"', 1033, 0, 0))

SELECT CurrencyCode FROM @CurrencyCodes WHERE TokenCount = 2

そのクエリから、次の 273 コードのいずれかに問題があることがわかりました。

ADF ADP AED AFA AFN ALK ALL AMD ANG AOA AON AOR ARA ARL ARM ARP ARS ATS AUD AWG AZM AZN BAM BBD BDT BEC BEF BEL BGJ BGK BGL BGN BHD BIF BMD BND BOB BOP BOV BRB BRC BRE BRL BRN BRR BRZ BSD BTN BWP BYR BZD CAD CDF CFP CHE CHF CHW CLF CLP CNX CNY COP COU CRC CSD CSJ CSK CUP CVE CYP CZK DDM DEM DJF DKK DM DOP DZD ECS ECV EEK EGP EQE ERN ESA ESB ESP ETB EUR EURO FF FIM FJD FKP FRF GBP GEL GHC GHS GIP GMD GNE GNF GRD GTQ GWP GYD HKD HNL HRK HTG HUF IDR IEP ILP ILR ILS INR IQD IRR ISJ ISK ITL JMD JOD JPY KES KGS KHR KMF KPW KRW KWD KYD KZT LAJ LAK LBP LKR LRD LSL LTL LUF LVL LYD MAD MAF MCF MDL MGA MGF MKD MKN MMK MNT MOP MRO MTL MUR MVQ MVR MWK MXN MXP MXV MYR MZM MZN NAD NGN NIO NLG NOK NPR NZD OMR PAB PEH PEI PEN PGK PHP PKR PLN PLZ PTE PYG QAR ROL RON RSD RUB RUR RWF SAR SBD SCR SDD SDG SEK SGD SHP SIT SKK SLL SML SOS SRD SRG STD SUR SVC SYP SZL THB TJR TJS TMM TND TOP TPE TRL TRY TTD TWD TZS UAH UAK UGS UGX USD USN USS UYI UYN UYU UZS VAL VEB VEF VNC VND VUV WST XAF XAG XAU XBA XBB XBC XBD XCD XDR XEC XEU XFO XFU XOF XPD XPF XPT XTS YDD YER YUD YUM ZAL ZAR ZMK ZRN ZRZ ZWC ZWD
于 2014-02-12T23:23:32.197 に答える
1

SQL 2008 を使用する場合

select * from sys.dm_fts_parser('"0 CAD"', 0, null, 0) - gives 2 tokens   
select * from sys.dm_fts_parser('"0 CAD"', 1033, null, 0) - gives 3 tokens   

SQL 2012 (11.0.3218) の場合:

select * from sys.dm_fts_parser('"0 CAD"', 1033, null, 0) - gives 2 tokens

SQL 2012 では、Microsoft は新しいワード ブレーカー (バージョン 14.0.4763.1000) http://msdn.microsoft.com/en-us/library/gg509108.aspxを導入しました。

ワークブレーカーは 3 文字の ISO 4217 通貨コードを認識するようになり、3 文字のコードの前に数字がある場合、それは分割されません。

于 2014-01-23T00:05:20.830 に答える