Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Полнотекстовый поиск в Microsoft SQL Server может формировать рейтинг (или ранжирующее значение), который указывает на релевантность возвращенных данных. Такое построчное ранжирующее значение можно рассматривать как критерий упорядочивания, который используется для сортировки результирующих наборов по релевантности.
Примечание. |
|---|
| Ранжирующее значение указывает на релевантность данных только в конкретном запросе и не относится к другим запросам. |
Статистические данные для ранжирования
При построении индекса собираются статистические данные, которые будут использоваться в ранжировании. Процесс построения полнотекстового каталога не приводит напрямую к созданию одной индексной структуры. Служба полнотекстового поиска (Microsoft) для SQL Server (MSFTESQL) по мере индексирования данных создает промежуточные индексы. Затем MSFTESQL по мере необходимости выполняет слияние этих индексов. Этот процесс может повторяться много раз. После этого служба MSFTESQL выполняет «главное слияние», объединяющее все промежуточные индексы в один большой главный индекс.
Статистические данные собираются на каждом уровне промежуточных индексов. Слияние этих данных производится при слиянии индексов. Некоторые статистические значения могут формироваться только в процессе создания главного индекса.
При вычислении ранга для каждого результирующего набора запроса некоторые статистические данные могут браться из небольших промежуточных индексов, удовлетворяющих запросу, а некоторые — из главного индекса. Это зависит от того, было ли выполнено слияние промежуточных индексов. Если слияние промежуточных индексов не выполнялось, точность статистических данных ранжирования может быть различной. По этой причине один и тот же запрос в разное время может возвращать различные результаты ранжирования по мере добавления, изменения и удаления данных, а также по мере слияния небольших индексов.
Чтобы свести к минимуму размер индекса и сложность вычислений, статистические данные часто округляются.
В следующем списке приводятся часто используемые термины и статистические значения, важные для вычисления ранга.
- Свойство
Полнотекстовый индексированный столбец строки.
- Документ
Сущность, возвращаемая в запросах. В SQL Server ей соответствует строка. Документ может иметь несколько свойств точно так же, как и строка может иметь несколько полнотекстовых индексированных столбцов.
- Индекс
Один инвертированный индекс одного или нескольких документов. Может полностью находиться в памяти или храниться на диске. Многие статистические данные относятся к конкретному индексу, в котором было обнаружено соответствие.
- Полнотекстовый каталог
Коллекция промежуточных индексов, которые для запросов считаются одной сущностью. Каталоги являются организационными единицами, видимыми администратору SQL Server.
- Слово, лексема или элемент
Единица проверки соответствия в средстве полнотекстового поиска. Потоки текста из документов формируются в слова или в лексемы согласно правилам конкретного языка.
- Вхождение
Смещение слова в свойстве документа, определенное средством разбиения по словам. Первое слово имеет вхождение в позиции 1, следующее — в позиции 2 и т.д. Чтобы избежать ложных срабатываний в запросах по сходству и запросах фраз, в конце предложения и абзаца используется увеличенный промежуток между вхождениями.
- Ключ каталога
Комбинация слова и свойства, содержащего это слово.
- HitCount
Количество вхождений значения ключа в строку.
- IndexedRowCount
Общее число индексированных строк. Вычисляется на основе счетчиков в промежуточных индексах. Точность этого числа может быть различной.
- KeyRowCount
Общее число строк в полнотекстовом каталоге, содержащем конкретный ключ.
- MaxOccurrence
Наибольшее число вхождений для конкретного свойства в строке, хранящееся в полнотекстовом каталоге.
- MaxQueryRank
Максимальный ранг (1000), возвращаемый службой MSFTESQL.
Проблемы при вычислении ранга
Процесс вычисления ранга зависит от нескольких факторов. Средства разбиения по словам в различных языках по-разному разбивают текст на лексемы. Например, строку «dog-house» одно средство разбиения по словам может разбить на «dog» и «house», а другое — на «dog-house». Это означает, что соответствие и ранжирование будут зависеть от заданного языка, потому что в разных языках различаются не только слова, но и длина документа. Разница в длине документа может повлиять на ранжирование во всех запросах.
Такие статистические данные, как IndexRowCount, могут различаться в широких пределах. Например, если каталог имеет 2 миллиарда строк в главном индексе, то новый документ индексируется хранящимся в памяти индексом. Поэтому ранги для этого документа, вычисленные на основе количества документов в индексе, хранящемся в памяти, могут отличаться от рангов для документов из главного индекса. По этой причине рекомендуется после любого заполнения, приводящего к большому числу индексированных или переиндексированных строк, выполнять объединение индексов в главный индекс с помощью DDL-инструкции ALTER FULLTEXT CATALOG... REORGANIZE. Служба MSFTESQL также автоматически объединит индексы на основе таких параметров, как количество промежуточных индексов и их размер.
Значения MaxOccurrence нормализуются в один из 32 диапазонов. Это означает, например, что документ длиной 50 слов обрабатывается так же, как и документ из 100 слов. Ниже приводится таблица, которая используется для нормализации. Поскольку размеры документов лежат в диапазоне между соседними значениями таблицы, равными 32 и 128, они фактически обрабатываются как документ одной длины: 128 (32 < docLength <= 128).
{ 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 };
В случаях, когда параметр top_n_by_rank используется с новым, предварительно вычисленным параметром ранжирования, во время вычисления может выполняться некоторое дополнительное округление, поэтому эти значения могут несколько отличаться в зависимости от того, включен ли параметр предварительного вычисления.
Ранжирование CONTAINSTABLE
StatisticalWeight = Log2( ( 2 + IndexedRowCount ) / KeyRowCount )
Rank = min( MaxQueryRank, HitCount * 16 * StatisticalWeight / MaxOccurrence )
Фразовые соответствия ранжируются как отдельные ключи, за исключением того, что значение KeyRowCount (количество строк, содержащих эту фразу) является приближением — оно может быть неточным и выше фактического значения.
Ранжирование 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] ContainsRankKey2 )
+ ( Σ[key=1 to n] WeightKey2 ) - ( WeightedSum ) )
Ранжирование FREETEXT
Ранжирование FREETEXT основано на формуле ранжирования OKAPI BM25. Запросы FREETEXT добавляют к запросу флективные формы, полученные по исходным словам запроса. Эти слова обрабатываются как отдельные и независимые, не относящиеся к словам, от которых они произведены. Синонимы, сформированные с помощью тезауруса, обрабатываются как отдельные, независимые и равновесные термины. Каждое слово в запросе вносит свой вклад в ранжирование.
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.
См. также
Другие ресурсы
Функция CONTAINSTABLE (Transact-SQL)
FREETEXTTABLE (Transact-SQL)
Примечание.