Значительная разница между содержит и содержит таблицы?
У меня полнотекстовый индекс, созданный для столбца типа varchar(max) с включенным файловым потоком. Файловый поток содержит такие данные, как JPG, TIF, PDF и XML (хотя, как я полагаю, это в основном не имеет отношения к вопросу).
У меня есть два запроса, которые я создал для поиска по индексу.
Полнотекстовый поиск # 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'
Полнотекстовый поиск № 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'
Единственное существенное различие между двумя полнотекстовыми поисками состоит в том, что запрос № 1 использует "содержит", а запрос № 2 использует "содержит".
Моя проблема в том, что два запроса не всегда дают одинаковые результаты. Например, если бы я выполнял поиск по фразе "Независимые подрядчики", запрос № 1 дал бы набор результатов из 10 различных документов (PDF и XML), в то время как запрос № 2 дал бы только набор результатов 6. Это, кажется, Правило: запрос № 1 всегда дает несколько больше, чем запрос № 2, а запрос № 2 всегда дает точно такие же совпадения, что и запрос № 1.
Запрос № 1 - поиск по "Независимым подрядчикам" дает:
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
Запрос № 2 - поиск по "Независимым подрядчикам" дает:
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
1 ответ
CONTAINSTABLE
:
top_n_by_rank
Указывает, что возвращаются только самые ранжированные совпадения в порядке убывания. Применяется только в том случае, если задано целочисленное значение n. Если top_n_by_rank объединяется с другими параметрами, запрос может вернуть меньше строк, чем количество строк, которые фактически соответствуют всем предикатам.
Попробуйте запустить w/o a top и посмотрите, соответствует ли он CONTAINS
,