Différence significative entre contient et CONTAINSTABLE?
-
25-09-2019 - |
Question
J'ai un index de texte intégral créé sur une colonne de type varchar (max) avec filestream activé. Le filestream contient des données telles que JPG de, TIF de, les PDF et XML de (bien que ce soit la plupart du temps rien à voir avec la question, je crois).
J'ai deux questions que j'ai créé qui me permettent d'effectuer des recherches sur l'indice.
Recherche plein texte # 1 -
select
parentObj.ObjectID as 'GroupingID',
parentObj.Name as 'Grouping',
childObj.ObjectID as 'FileObjID',
childObj.Name as 'FileName',
fs.FileStreamID
from dbo.dat_FileStream fs
inner join dbo.dat_Object childObj
on fs.ObjectID = childObj.ObjectID
inner join dbo.dat_Collection c
on fs.ObjectID = c.ObjectID
inner join dbo.dat_Object parentObj
on c.ParentID = parentObj.ObjectID
where contains(FileStreamData, @srchTerm)
and parentObj.ObjectTypeID = 1
ORDER BY 'Grouping'
Recherche plein texte # 2 -
select
KEY_TBL.RANK,
parentObj.ObjectID as 'GroupingID',
parentObj.Name as 'Grouping',
childObj.ObjectID as 'FileObjID',
childObj.Name as 'FileName',
fs.FileStreamID
from dbo.dat_FileStream fs
inner join containstable(dbo.dat_FileStream, FileStreamData, @srchTerm, 1000) as KEY_TBL
on fs.FileStreamID = KEY_TBL.[KEY]
inner join dbo.dat_Object childObj
on fs.ObjectID = childObj.ObjectID
inner join dbo.dat_Collection c
on fs.ObjectID = c.ObjectID
inner join dbo.dat_Object parentObj
on c.ParentID = parentObj.ObjectID
where parentObj.ObjectTypeID = 1
ORDER BY 'Grouping'
La seule différence significative entre les deux recherches en texte intégral est la requête # 1 contient des utilisations et requête # 2 utilise CONTAINSTABLE.
Mon problème est que les deux requêtes ne donnent pas toujours les mêmes résultats. Par exemple, si je recherche sur l'expression « entrepreneurs indépendants », requête n ° 1 produirait un jeu de résultats de 10 différents documents (format PDF et XML pour), alors que la requête n ° 2 produirait seulement un ensemble de résultat de 6. Cela semble être la règle: requête n ° 1 donne toujours un peu plus que la requête n ° 2, et la requête n ° 2 donne toujours les mêmes correspondances exactes que la requête n ° 1 fait.
Requête # 1 - recherche sur "entrepreneurs indépendants", on obtient:
4262 AAA-00-12 4561 AAA-00-12.pdf 4235
4316 AAA-00-15 4753 AAA-00-15.pdf 4427
4316 AAA-00-15 4754 AAA-00-15.xml 4428
3873 AAA-00-19 4784 AAA-00-19.pdf 4458
3903 AAA-00-22 6795 AAA-00-22.pdf 6459
3953 AAA-00-24 6899 AAA-00-24.pdf 6563
3953 AAA-00-24 6900 AAA-00-24.xml 6564
4842 AAA-00-9 4905 AAA-00-9.pdf 4577
4842 AAA-00-9 4906 AAA-00-9.xml 4578
4057 AAA-0001 4260 AAA-0001.pdf 3936
Requête # 2 - recherche sur "entrepreneurs indépendants", on obtient:
19 4262 AAA-00-12 4561 AAA-00-12.pdf 4235
126 4316 AAA-00-15 4754 AAA-00-15.xml 4428
126 4316 AAA-00-15 4753 AAA-00-15.pdf 4427
116 3873 AAA-00-19 4784 AAA-00-19.pdf 4458
125 3903 AAA-00-22 6795 AAA-00-22.pdf 6459
57 3953 AAA-00-24 6900 AAA-00-24.xml 6564
57 3953 AAA-00-24 6899 AAA-00-24.pdf 6563
La solution
top_n_by_rank
Indique que seuls les matchs classés nhighest, dans l'ordre décroissant, sont retournés. S'applique uniquement lorsqu'une valeur nombre entier, n, est spécifié. Si top_n_by_rank est combiné avec d'autres paramètres, la requête pourrait revenir moins de lignes que le nombre de lignes qui correspondent en fait tous les prédicats.
Essayez d'exécuter w / o un haut et voir si elle correspond à CONTAINS
.