Ограничение ранжированных результирующих наборов (компонент Full-Text Search)

Функции CONTAINSTABLE и FREETEXTTABLE возвращают столбец с именем RANK, содержащий порядковые номера от 0 до 1000 (ранжирующие значения). Эти значения используются для ранжирования возвращенных строк согласно их соответствию критерию выбора. Ранжирующие значения указывают только относительный порядок релевантности строк в результирующем наборе, при этом чем меньше значение, тем меньше релевантность. Фактические значения несущественны и, как правило, различны для каждого выполнения запроса.

ПримечаниеПримечание

Запросы, использующие предикаты CONTAINS и FREETEXT, не возвращают ранжирующие значения.

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

SQL Server упорядочивает соответствия по рангу и возвращает заданное число строк. Это может привести к значительному повышению производительности. Например, запрос, обычно возвращающий 100 000 строк из таблицы с миллионом строк, обрабатывается гораздо быстрее, если запросить всего 100 строк с наивысшими ранжирующими значениями.

ПримечаниеПримечание

Сведения о том, каким образом полнотекстовый поиск создает ранжирующие значения, см. в разделе Как ранжируются результаты поискового запроса (полнотекстовый поиск).

Примеры

Пример А. Поиск только трех соответствий с максимальным рангом

В следующем примере инструкция CONTAINSTABLE используется для возвращения только трех строк с максимальным рангом.

USE Northwind;
GO
SELECT   K.RANK, CompanyName, ContactName, Address
FROM      Customers AS C
         INNER JOIN
         CONTAINSTABLE(Customers,Address, 'ISABOUT ("des*",
            Rue WEIGHT(0.5),
            Bouchers WEIGHT(0.9))', 3) AS K
         ON C.CustomerID = K.[KEY];
GO

Ниже приводится результирующий набор.

RANK CompanyName          ContactName       address            
---- ------------         -----------       -------            
123  Bon app'             Laurence Lebihan  12, rue des Bouchers 
65   Du monde entier      Janine Labrune    67, rue des Cinquante Otages 
15   France restauration  Carine Schmitt    54, rue Royale     

Пример Б. Поиск десяти соответствий с максимальным рангом

В следующем примере инструкция CONTAINSTABLE используется для возвращения 10 строк (имя и описание категории товаров) с максимальным рангом, где столбец Description содержит слова «sweet and savory» рядом со словами «sauces» или «candies».

SELECT FT_TBL.Description, 
   FT_TBL.CategoryName, 
   KEY_TBL.RANK
FROM Categories AS FT_TBL INNER JOIN
   CONTAINSTABLE (Categories, Description, 
      '("sweet and savory" NEAR sauces) OR
      ("sweet and savory" NEAR candies)'
      , 10
   ) AS KEY_TBL
   ON FT_TBL.CategoryID = KEY_TBL.[KEY];
GO

В этом разделе

  • Как ранжируются результаты поискового запроса (полнотекстовый поиск)
    Описывает, каким образом полнотекстовый поиск создает ранжирующие значения, возвращаемые запросом, включая часто используемые термины и статистические значения, существенные для вычисления ранга, для устранения проблем при вычислении ранга и при ранжировании результатов функций CONTAINSTABLE и FREETEXTTABLE.