Ограничение ранжированных результирующих наборов (компонент 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.