differenza significativa tra contiene e CONTAINSTABLE?
-
25-09-2019 - |
Domanda
Ho un indice full-text creato su una colonna di tipo varchar (max) con filestream abilitato. Il FileStream contiene dati come JPG di, TIF di, PDF e XML di (anche se questo è per lo più irrilevante per la questione, credo).
Ho due domande che ho creato che mi permettono di cercare sul indice.
ricerca full-text # 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'
ricerca full-text # 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'
L'unica differenza significativa tra i due ricerche full-text è di query # 1 usi contiene e query # 2 utilizza CONTAINSTABLE.
Il mio problema è che le due interrogazioni non sempre producono gli stessi risultati. Ad esempio, se io per cercare la frase "imprenditori indipendenti", interrogare # 1 porterebbe a un set di risultati di 10 documenti diversi (PDF e XML di), mentre interrogazione 2 # sarebbe cedere solo un set di risultati di 6. Questo sembra essere la regola: query # 1 produce sempre un poco più di interrogazione 2 #, e Query 2 # produce sempre esattamente le stesse partite che interrogazione 1 # fa.
Domanda # 1 - Ricerca su "contractors Indipendenti" si ottiene:
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
Domanda # 2 - una ricerca sulle "appaltatori Indipendenti" si ottiene:
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
Soluzione
top_n_by_rank
Specifica che solo il nhighest partite classificate, in ordine decrescente, vengono restituiti. Si applica solo quando un intero valore n è specificato. Se top_n_by_rank è combinato con altri parametri, la query potrebbe tornare meno righe rispetto al numero di righe che in realtà corrispondere tutte le predicati.
Prova in esecuzione w / o un top e vedere se corrisponde CONTAINS
.