Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Область применения: SQL Server
База данных SQL Azure Управляемый экземпляр SQL Azure
Функции CONTAINSTABLE и FREETEXTTABLE возвращают столбец с именем RANK , содержащий порядковые значения от 0 до 1 000 (значения ранга). Эти значения ранжируют строки в зависимости от того, насколько они соответствуют критериям отбора. Ранжирующие значения указывают только относительный порядок релевантности строк в результирующем наборе, при этом чем меньше значение, тем меньше релевантность. Фактические значения неважны и обычно меняются каждый раз при выполнении запроса.
Примечание.
CONTAINS И FREETEXT предикаты не возвращают значения ранжирования.
Количество элементов, соответствующих условию поиска, часто большое. Чтобы запросы CONTAINSTABLE или FREETEXTTABLE не возвращали слишком много совпадений, используйте необязательный параметр top_n_by_rank. Он возвращает только подмножество строк.
top_n_by_rank — это целое число, n, которое указывает, что возвращаются только n самых высокоранговых совпадений в убывающем порядке. Если параметр top_n_by_rank скомбинирован с другими параметрами, то запрос может вернуть меньше строк, чем фактически соответствует всем предикатам.
SQL Server Database Engine упорядочивает совпадения по рангу и возвращает только до указанного количества строк. Например, запрос, который обычно возвращает 100 000 строк из таблицы из 1 000 000 строк, обрабатывается быстрее, если запрашиваются только верхние 100 строк.
Примеры использования RANK для ограничения результатов поиска
Пример A: Поиск только трех лучших соответствий
В следующем примере используется CONTAINSTABLE для возврата только трёх лучших совпадений.
USE AdventureWorks2025;
GO
SELECT K.RANK,
AddressLine1,
City
FROM Person.Address AS A
INNER JOIN CONTAINSTABLE (Person.Address, AddressLine1, 'ISABOUT ("des*",
Rue WEIGHT(0.5),
Bouchers WEIGHT(0.9))', 3) AS K
ON A.AddressID = K.[KEY];
GO
Вот результаты.
RANK Address City
----------- -------------------------------- ------------------------------
172 9005, rue des Bouchers Paris
172 5, rue des Bouchers Orleans
172 5, rue des Bouchers Metz
Пример B. Поиск пяти лучших совпадений
В следующем примере используется CONTAINSTABLE для возврата описания первых пяти продуктов, где столбец Description содержит слово "алюминий" рядом со словом light или словом lightweight.
USE AdventureWorks2025;
GO
SELECT FT_TBL.ProductDescriptionID,
FT_TBL.Description,
KEY_TBL.RANK
FROM Production.ProductDescription AS FT_TBL
INNER JOIN CONTAINSTABLE (Production.ProductDescription,
Description, '(light NEAR aluminum) OR (lightweight NEAR aluminum)', 5) AS KEY_TBL
ON FT_TBL.ProductDescriptionID = KEY_TBL.[KEY];
GO
Как ранжируются результаты поиска
Полнотекстовый поиск может генерировать необязательный балл (или значение ранга), который показывает релевантность данных, возвращаемых полнотекстовым запросом. Это значение ранга рассчитывается для каждой строки и может использоваться как критерий порядка для сортировки результатов заданного запроса по релевантности. Ранжирующие значения показывают только относительный порядок релевантности строк в результирующем наборе. Фактические значения несущественны и, как правило, различны для каждого выполнения запроса. Значение ранжирования не имеет никакого значения между запросами.
Статистика ранжирования
Когда вы создаёте индекс, система собирает статистику для ранжирования. Создание полнотекстового каталога напрямую не создаёт единую структуру индекса. Вместо этого Full-Text Engine создаёт промежуточные индексы при индексировании данных. Затем средство полнотекстового поиска выполняет слияние этих индексов в больший индекс по мере необходимости. Этот процесс может повторяться много раз. После этого средство полнотекстового поиска выполняет "мастер-слияние", объединяющее все промежуточные индексы в один большой главный индекс.
Статистические данные собираются на каждом уровне промежуточных индексов. Слияние этих данных производится при слиянии индексов. Некоторые статистические значения могут формироваться только в процессе объединения мастер-данных.
Хотя ядро СУБД ранжирует набор результатов запросов, он использует статистику из крупнейшего промежуточного индекса. Это использование зависит от того, объединены ли промежуточные индексы. В результате статистика ранжирования может отличаться в точности, если промежуточные индексы не объединены. Эта разница в точности объясняет, почему один и тот же запрос может возвращать разные результаты ранжирования со временем при добавлении, изменении и удалении полнотекстовых индексных данных, а также слияния меньших индексов.
Чтобы свести к минимуму размер индекса и сложность вычислений, статистические данные часто округляются.
В следующем списке содержатся некоторые часто используемые термины и статистические значения, важные для вычисления ранга.
| Термин / значение | Описание |
|---|---|
| Свойство | Полнотекстовый индексированный столбец в строке. |
| Документ | Сущность, возвращаемая в запросах. В ядро СУБД это соответствует строке. Документ может иметь несколько свойств точно так же, как и строка может иметь несколько полнотекстовых индексированных столбцов. |
| Указатель | Один инвертированный индекс одного или нескольких документов. Это может быть полностью в памяти или на диске. Многие статистические данные относятся к конкретному индексу, в котором было обнаружено соответствие. |
| Полнотекстовый каталог | Коллекция промежуточных индексов, которые для запросов считаются одной сущностью. Каталоги — это то, что администраторы рассматривают как единицу организации. |
| Слово, токен или элемент | Единица сопоставления в полнотекстовом движке. Потоки текста из документов токенизируются в слова или токены с помощью языковых разрывателей слов. |
| Наличие | Смещение слова в свойстве документа, определенное средством разбиения по словам. Первое слово находится на позиции 1, следующее — на позиции 2 и так далее. Чтобы избежать ложноположительных результатов во фразовых запросах и запросах с учетом близости, конец предложения и конец абзаца создают большие разрывы между вхождениями. |
| TermFrequency | Количество раз, когда значение ключа повторяется подряд. |
| IndexedRowCount | Общее число индексированных строк. Это значение вычисляется на основе количественных показателей, хранящихся в промежуточных индексах. Точность этого числа может быть различной. |
| KeyRowCount | Общее число строк в полнотекстовом каталоге, содержащем конкретный ключ. |
| MaxOccurrence | Наибольшее число вхождений для конкретного свойства в строке, хранящееся в полнотекстовом каталоге. |
| MaxQueryRank | Максимальный ранг, 1000, возвращаемый модулем полнотекстового поиска. |
Проблемы с вычислением ранга
На процесс вычисления ранга влияет множество факторов. Средства разбиения текста на слова в разных языках работают по-разному. Например, один разбиватель слов разбивает строку «dog-house» на «dog» и «house», а другой рассматривает её как «dog-house». Сопоставление и ранжирование варьируются в зависимости от выбранного языка, потому что различаются не только слова, но и длина документа. Разница в длине документа может повлиять на ранжирование во всех запросах.
Такие статистические данные, как IndexRowCount , могут различаться в широких пределах. Например, если в каталоге 2 миллиарда строк в главном индексе, один новый документ индексируется в промежуточный индекс в памяти, и ранжирование этого документа на основе количества документов в индексе памяти может быть смещено по сравнению с рангами документов из главного индекса. По этой причине после любого заполнения, в результате которого индексируется или переиндексируется большое количество строк, объедините индексы в главный индекс с помощью инструкции Transact-SQL ALTER FULLTEXT CATALOG ... REORGANIZE. Подсистема полнотекстового текста также автоматически объединяет индексы на основе параметров, таких как число и размер промежуточных индексов.
ЗначенияMaxOccurrence нормализуются в один из 32 диапазонов. Эта нормализация означает, например, что документ длиной 50 слов рассматривается так же, как и документ длиной 100 слов. В следующей таблице приведена нормализация. Поскольку длина документа находится в диапазоне между смежными значениями таблицы 32 и 128, они эффективно обрабатываются как имеющие ту же длину, 128 (32 = 128 <docLength<).
{ 16, 32, 128, 256, 512, 725, 1024, 1450, 2048, 2896, 4096, 5792, 8192, 11585,
16384, 23170, 28000, 32768, 39554, 46340, 55938, 65536, 92681, 131072, 185363,
262144, 370727, 524288, 741455, 1048576, 2097152, 4194304 };
Ранг CONTAINSTABLE
РанжированиеCONTAINSTABLE использует следующий алгоритм:
StatisticalWeight = Log2( ( 2 + IndexedRowCount ) / KeyRowCount )
Rank = min( MaxQueryRank, HitCount * 16 * StatisticalWeight / MaxOccurrence )
Совпадения фраз ранжируются так же, как и отдельные ключи, за исключением того, что KeyRowCount (количество строк с фразой) — это оценочное значение, которое может быть неточным и превышать фактическое число.
Ранг NEAR
CONTAINSTABLE поддерживает запросы на два или более терминов поиска в близости друг от друга с помощью NEAR параметра. Ранжирующее значение для каждой из возвращаемых строк зависит от нескольких параметров. Одним из основных факторов ранжирования является общее количество совпадений (или попаданий) по отношению к длине документа. Таким образом, например, если у документа из 100 слов и документа из 900 слов будет идентичный набор совпадений, то документ из 100 слов получит более высокий ранг.
Общая длина каждого совпадения в строке также влияет на ранжирование этой строки на основе расстояния между первым и последним поисковыми терминами этого совпадения. Чем меньше расстояние, тем больше попадание увеличивает ранжирующее значение строки. Если полнотекстовый запрос не задаёт максимальное расстояние в виде целого числа, то документ, содержащий только совпадения, расстояние между которыми превышает 100 логических терминов, имеет ранг 0.
Ранг ISABOUT
CONTAINSTABLE поддерживает запросы к взвешанным терминам с помощью ISABOUT параметра.
ISABOUT — это запрос векторного пространства в традиционной терминологии получения информации. В качестве алгоритма ранжирования по умолчанию используется широко известная формула Жаккарда. Ранжирование вычисляется для каждого термина в запросе, а затем объединяется, как описано в следующем алгоритме.
ContainsRank = same formula used for CONTAINSTABLE ranking of a single term (above).
Weight = the weight specified in the query for each term. Default weight is 1.
WeightedSum = Σ[key=1 to n] ContainsRankKey * WeightKey
Rank = ( MaxQueryRank * WeightedSum ) / ( ( Σ[key=1 to n] ContainsRankKey^2 )
+ ( Σ[key=1 to n] WeightKey^2 ) - ( WeightedSum ) )
Ранг FREETEXTTABLE
РанжированиеFREETEXTTABLE основано на формуле ранжирования OKAPI BM25.
FREETEXTTABLE Запросы добавляют слова к запросу посредством инфлективной генерации (флективных форм исходных слов запроса). Эти слова рассматриваются как отдельные слова без особого отношения к словам, из которых они были созданы. Синонимы, сформированные с помощью тезауруса, обрабатываются как отдельные, независимые и взвешенные выражения. Каждое слово в запросе вносит свой вклад в ранжирование.
Rank = Σ[Terms in Query] w ( ( ( k1 + 1 ) tf ) / ( K + tf ) ) * ( ( k3 + 1 ) qtf / ( k3 + qtf ) ) )
Where:
w is the Robertson-Sparck Jones weight.
In simplified form, w is defined as:
w = log10 ( ( ( r + 0.5 ) * ( N - R + r + 0.5 ) ) / ( ( R - r + 0.5 ) * ( n - r + 0.5 ) )
N is the number of indexed rows for the property being queried.
n is the number of rows containing the word.
K is ( k1 * ( ( 1 - b ) + ( b * dl / avdl ) ) ).
dl is the property length, in word occurrences.
avdl is the average length of the property being queried, in word occurrences.
k1, b, and k3 are the constants 1.2, 0.75, and 8.0, respectively.
tf is the frequency of the word in the queried property in a specific row.
qtf is the frequency of the term in the query.