2010-09-07 2 views
2

J'utilise une requête CONTAINSTABLE avec le moteur d'indexation de texte intégral de MS SQL Server pour rechercher dans une colonne textuelle; .: par exemple Comment obtenir la position du match dans une recherche de texte intégral FORMSOF INFULATIONAL?

SELECT * 
FROM MyTable 
INNER MERGE JOIN CONTAINSTABLE(MyTable, sDescription, 'FORMSOF(INFLECTIONAL, "brains")') 
    AS TBL1 ON TBL1.[key]=MyTable.ixKey 

Cela fait un excellent travail de trouver des lignes avec une description comprenant un mot comme « cerveau » (par exemple « cerveau », « brained »). Cependant, lorsque je montre ces résultats à l'utilisateur, je voudrais mettre en évidence le mot qui correspond à leur requête (tout comme Google). Mais je ne peux pas simplement chercher le terme recherché dans les résultats: si le résultat contient "cerveau", je ne peux évidemment pas mettre en évidence "cerveau".

Est-ce que SQL Server peut me dire où se trouve la correspondance de texte intégral dans la colonne (le mot ou le caractère)? Sinon, puis-je lancer manuellement le stemmer pour obtenir toutes les formes du terme de recherche? Je pourrais mettre en évidence chacun d'eux individuellement, alors.

Répondre

3

SQL Server 2008 inclut une fonction permettant d'obtenir les formes fléchies d'un mot ou d'une expression à l'aide de l'analyseur du moteur de recherche de texte intégral: sys.dm_fts_parser.

SELECT display_term, source_term, occurrence FROM sys.dm_fts_parser('FORMSOF(INFLECTIONAL, "brains")', 1033, 0, 0) 

obtient une table comme:

display_term | source_term | occurrence 
--------------------------------------- 
brain  | brains  | 1 
brains  | brains  | 1 
brained  | brained  | 1 

(. Travailler avec des phrases de requête est un peu plus de travail, car il infléchit chaque mot séparément, mais il est pas trop difficile de mettre les choses ensemble)

Maintenant, je peux juste mettre en évidence une occurrence de l'une des formes fléchies. C'est un peu plus de travail que si SQL Server vient de me dire où sont les correspondances FTS, mais ça ira.

0

La valeur dans la colonne résultat expansion_type l'indique. Un type d'expansion de 2 est INFLECTIONAL, un 4 indique l'expansion du mot-clé thesaurus:

FORMSOF(THESAURUS, "Co") 
source_term display_term expansion_type 
Co co 0 
Co company 4 

FORMSOF(INFLECTIONAL, "Dog") 
source_term display_term expansion_type 
Dog dog 0 
Dog dogs 2 
Dog dogged 2 
Dog dogging 2 

SQL 

SELECT 
source_term, 
display_term, 
expansion_type 
FROM sys.dm_fts_parser (FORMSOF(INFLECTIONAL, "Dog"), 1033, 0, 0) 
order by source_term, expansion_type 
Questions connexes