2010-11-17 30 views
4

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 

Répondre

3

CONTAINSTABLE:

top_n_by_rank

Indique que seules les correspondances les plus élevées, dans l'ordre décroissant, sont renvoyées . S'applique uniquement lorsqu'une valeur entière , n, est spécifiée. Si top_n_by_rank est combiné avec d'autres paramètres , la requête peut renvoyer moins de lignes que le nombre de lignes qui correspondent réellement à tous les prédicats .

Essayez d'exécuter w/o un haut et voir si elle correspond à CONTAINS.

+0

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

+2

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