2013-06-04 2 views
1

Nous avoir un temps vraiment difficile de trouver deux chaînes semblables donnés à sys.dm_fts_parser donne des résultats différentssys.dm_fts_parser sql texte intégral

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

semble penser que « 0 CAD » est un jeton (retour 2 jeton)

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

renvoie 3 jetons - correctement

plus important et encore plus déroutant est pourquoi

select * from Table where contains(*,"point 5 CAD") œuvres et select * from Table where contains(*,"point 5 cad") échoue

où la colonne recherchée contient « point 5 CAD » -

Si pas le plein générateur de l'index de texte soit ignorer les mots de bruit (par exemple "5") en fonction du paramètre d'index ou l'inclure.
Nous avons essayé les deux et ne peux pas expliquer pourquoi « nnnn CAD » est quelque chose de note spéciale

que le texte intégral est supposé être insensible à la casse selon http://msdn.microsoft.com/en-us/library/ms142583.aspx

Qu'est-ce que je manque?

Edit: Utilisation de SQL 2012 11.0.2218

Répondre

1

Lors de l'utilisation de SQL 2008

select * from sys.dm_fts_parser (' "0 CAD"', 0, null, 0) - donne 2 jetons select * from sys.dm_fts_parser (' » 0 CAD " », 1033, null, 0) - donne 3 jetons

sur SQL 2012 (11.0.3218):
select * from sys.dm_fts_parser (' "0 CAD"', 1033, null, 0) - donne 2 jetons

Dans SQL 2012 Microsoft a introduit un nouveau lexical (version 14.0.4763.1000) http://msdn.microsoft.com/en-us/library/gg509108.aspx

Il semble que le disjoncteur de travail reconnaît désormais 3 caractères ISO 4217 Codes de devises, et s'il y a un certain nombre avant le code 3 char il n'est pas cassé.

2

Vous devez utiliser l'identifiant de locale (lcid) du disjoncteur de mot. Ainsi, vous devez remplacer le deuxième argument à 1033

SELECT * 
FROM sys.dm_fts_parser('"0 CAD"', 1033, null, 0) 

renvoie 3 jetons

SELECT * 
FROM sys.dm_fts_parser('"0 cad"', 1033, null, 0) 

renvoie 3 jetons

Il faut aussi choisir l'anglais comme langue mot-breaker pour chaque colonne.

USE [YourDB] 
GO 
ALTER FULLTEXT INDEX ON [dbo].[YourTable] DROP ([YourColumn]) 
GO 
USE [YourDB] 
GO 
ALTER FULLTEXT INDEX ON [dbo].[YourTable] ADD ([YourColumn] LANGUAGE [English]) 
GO 
+0

Salut Alex - J'ai essayé avec 1033 et j'ai toujours 2 jetons pour les majuscules "CAD" et 3 quand j'ai des "cad" minuscules. Connaissez-vous un paramètre pouvant affecter le cas? Aussi ce que je ne peux pas comprendre ce qui est spécial avec le mot "CAD". Les autres mots "CAT", "DOG" "COW" n'ont aucun problème. Enfin si j'essaie "XXXXX CAD" où XXXXX est alpha je ne vois aucun problème. – Haroon

2

Mon équipe a également rencontré ce comportement bizarre de la segmentation. Notre correction consistait à appliquer LOWER à la requête et au texte recherché.

En tant que Haroon previously identified, le problème semble provenir du tokenizer qui identifie certains codes de devise majuscules à proximité de numéros et les traite différemment. Ceci est illustré par la requête suivante:

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 

Nous avons écrit un script qui identifie toutes les combinaisons de caractères 1-4 lettre qui présentent ce comportement:

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 

De cette requête, nous avons constaté que nous aurons problèmes avec l'un des codes suivants: 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 
0

je quelque chose comme ça ..

Select * FROM sys.dm_fts_parser (N ' " '+ @ + P_SEARCHSTRING'"', 1033, 0, 0) où display_term NOT LIKE '% nn'

Il évite tous les jetons commençant par 'nn'

Questions connexes