J'ai un index de texte intégral créé sur une colonne de type varchar (max) avec filestream activé. Le flux de fichiers contient des données telles que JPG, TIF, PDF et XML (bien que ce soit en grande partie sans rapport avec la question, je crois).Différence entre contains et containstable?
J'ai deux requêtes que j'ai créées et qui me permettent d'effectuer une recherche sur l'index.
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 utilisations contains et query # 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 devais effectuer une recherche sur l'expression «entrepreneurs indépendants», la requête 1 produirait un ensemble de résultats de 10 documents différents (PDF et XML), alors que la requête 2 ne donnerait qu'un ensemble de résultats de 6. Cela semble être la règle: la requête # 1 donne toujours un peu plus que la requête # 2, et la requête # 2 donne toujours les mêmes correspondances que la requête # 1.
Requête # 1 - recherche sur "entrepreneurs indépendants" des rendements:
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" des rendements:
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
C'est fait! Je ne comprends toujours pas pourquoi le top_n_by_rank retourne moins de résultats cependant. Je suppose que "combiné avec d'autres paramètres" signifie les autres paramètres qui sont donnés au containstable. Merci pour votre temps et votre contribution; Je l'apprécie. – Jagd
OK, voici ce que j'ai trouvé. Si je fais une recherche sur le terme 'entrepreneur' et que j'ai top_n_by_rank sur 1000 alors tous les résultats à RANK 13 ou moins ne sont pas retournés, ** même si mon ensemble de résultats total est bien inférieur à 1000 articles retournés! vraiment ne pas arriver ici. Si le total du jeu de résultats est inférieur à 1000 alors ne devrais-je pas tout me retourner, quel que soit le RANG de n'importe quel article? – Jagd