Значительная разница между содержит и содержит таблицы? - PullRequest
5 голосов
/ 17 ноября 2010

У меня полнотекстовый индекс, созданный для столбца типа 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'

Единственная существенная разница между двумя полнотекстовымиsearch is query # 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 Ответ

3 голосов
/ 17 ноября 2010

CONTAINSTABLE:

top_n_by_rank

Указывает, что возвращаются только самые ранжированные совпадения в порядке убывания.Применяется только тогда, когда задано целочисленное значение n. Если top_n_by_rank объединяется с другими параметрами, запрос может вернуть меньше строк, чем количество строк, которые фактически соответствуют всем предикатам.

Попробуйте выполнить без top и посмотритеэто соответствует CONTAINS.

...