Перейти к содержимому
Последнее обновление

Оценка релевантности

При выполнении полнотекстовых запросов (например, с MATCH_ANY, MATCH_ALL, MATCH_PHRASE и другими операторами) часто требуется сортировать результаты по «степени соответствия», чтобы наиболее релевантные записи возвращались первыми. Doris поддерживает оценку релевантности: каждой строке присваивается числовая оценка на основе условий запроса. Чем выше оценка, тем выше релевантность.

В настоящее время Doris по умолчанию использует алгоритм BM25 (Best Matching 25) для оценки релевантности.

Типичные сценарии использования:

  • Поисковые приложения: получение списка наиболее релевантных документов по ключевым словам
  • Анализ журналов: сортировка по релевантности для быстрого поиска записей журнала, наиболее точно соответствующих ключевым словам
  • Рекомендация контента: отбор приоритетного контента на основе сходства текстов
  • Поиск в базе знаний: получение возможных ответов, упорядоченных по релевантности вопросу

Быстрый старт​

Следующий пример показывает, как включить оценку релевантности в запросе и отсортировать результаты по оценке:

SELECT *,
score() AS relevance
FROM search_demo
WHERE content MATCH_ANY 'text search test'
ORDER BY relevance DESC
LIMIT 10;

При выполнении запроса Doris вычисляет оценку каждой строки с помощью алгоритма BM25 и возвращает 10 наиболее релевантных записей:

+------+-----------------------------------+---------+--------------+-----------+
| id | content | author | publish_date | relevance |
+------+-----------------------------------+---------+--------------+-----------+
| 1 | Full text search engine test demo | Alice | 2024-01-01 | 2.915228 |
| 7 | Text processing techniques | Grace | 2024-01-07 | 1.341931 |
| 5 | Performance test framework | Eve | 2024-01-05 | 1.341931 |
| 3 | Advanced search algorithms | Charlie | 2024-01-03 | 1.341931 |
+------+-----------------------------------+---------+--------------+-----------+

Условия активации​

Для расчёта оценок запрос должен соответствовать всем трём условиям:

  1. В предложении SELECT явно вызывается функция score().
  2. Предложение WHERE содержит хотя бы одно условие MATCH_*.
  3. Запрос является запросом Top-N, а сортировка ORDER BY выполняется по результату score().

Поддерживаемые типы индексов​

Тип индексаПоддержка оценкиОписание
Инвертированный индекс с токенизациейДаПозволяет вычислять оценки релевантности BM25
Инвертированный индекс без токенизацииНетПоддерживает только точное совпадение; оценки не вычисляются

Поддерживаемые типы запросов​

  • MATCH_ANY
  • MATCH_ALL
  • MATCH_PHRASE
  • MATCH_PHRASE_PREFIX
  • SEARCH

Алгоритм BM25​

BM25 — алгоритм оценки релевантности текста, основанный на вероятностной модели. Он выполняет взвешенный расчёт для результатов поиска, совместно учитывая три фактора: частоту термина (TF), обратную частоту документов (IDF) и длину записи. По сравнению с традиционной моделью TF-IDF алгоритм BM25 более устойчив, лучше поддаётся настройке и эффективно уравновешивает различия в оценках длинных и коротких текстов.

Основная формула​

score = IDF × (tf × (k1 + 1)) / (tf + k1 × (1 - b + b × |d| / avgdl))

Переменные в формуле имеют следующие значения:

ПеременнаяЗначение
tfКоличество вхождений термина запроса в текущую строку
IDFОбратная частота документов, характеризующая редкость термина
|d|Длина текущей строки (количество токенов после токенизации)
avgdlСредняя длина всех строк в таблице
k1, bПараметры настройки алгоритма

Параметры​

ПараметрПо умолчаниюОписание
k11.2Определяет степень влияния частоты термина на оценку
b0.75Определяет степень нормализации по длине записи
boost1.0Весовой коэффициент на уровне запроса

Вспомогательная статистика​

IDF   = log(1 + (N - n + 0.5) / (n + 0.5))
avgdl = total_terms / total_rows

Здесь:

  • N: общее количество строк в таблице
  • n: количество строк, содержащих термин запроса

Если запрос содержит несколько терминов, итоговая оценка равна сумме оценок всех терминов.

Длина записи и свойство norms​

Свойство индекса norms и параметр конфигурации BE inverted_index_skip_norms_for_variant поддерживаются начиная с Doris 4.1.5.

Значение |d| берётся из norms, для хранения которых требуется один байт на строку для каждого индексируемого поля, включая строки без значения в этом поле. Индексы с токенизацией по умолчанию записывают norms ("norms" = "true"); индексы без токенизации этого не делают. Для индексов, используемых только для фильтрации, задайте "norms" = "false", чтобы сэкономить место:

INDEX idx_content(content) USING INVERTED PROPERTIES("parser" = "english", "norms" = "false")

Подпути VARIANT наследуют свойство norms индекса, при этом затраты на хранение составляют rows × paths байт. Если задать для параметра конфигурации BE inverted_index_skip_norms_for_variant (по умолчанию false, можно изменять во время работы) значение true, norms отключаются для всех индексов путей VARIANT независимо от свойства индекса.

Отключение norms не влияет на фильтрацию MATCH_*, но функция score() возвращает ошибку, если читает хотя бы один сегмент без norms. Эти настройки влияют на вновь записываемые сегменты; существующие сегменты остаются без изменений, пока compaction не перезапишет их. Перед изменением этих настроек обновите все BE до версии, которая их поддерживает.

Интерпретация результатов​

Понимание результатов оценки помогает точнее использовать ранжирование по релевантности:

ХарактеристикаОписание
Диапазон оценокПоложительное число без фиксированной верхней границы; обычно важна только относительная величина, а не абсолютное значение
Запрос с несколькими терминамиЕсли в запросе несколько терминов, общая оценка равна сумме оценок отдельных терминов
Влияние длиныПри одинаковых совпадающих терминах более короткая запись получает немного более высокую оценку
Отсутствие совпадающего терминаЕсли термин запроса не встречается в таблице, соответствующая оценка равна 0

Часто задаваемые вопросы​

Вопрос 1: Почему мой запрос не возвращает оценки?

Последовательно проверьте:

  1. Вызывается ли функция score() в SELECT.
  2. Содержит ли предложение WHERE условие MATCH_*.
  3. Выполняется ли сортировка ORDER BY по score().
  4. Является ли индекс инвертированным индексом с токенизацией.

Вопрос 2: В чём разница между BM25 и TF-IDF?

BM25 развивает модель TF-IDF, добавляя два улучшения: насыщение частоты термина и нормализацию по длине. Благодаря этому оценки длинных и коротких текстов становятся более сбалансированными, а алгоритм — более устойчивым.

Вопрос 3: Можно ли сравнивать оценки разных запросов?

Это не рекомендуется. Оценки BM25 зависят от конкретных терминов запроса и распределения данных в таблице. Абсолютные значения оценок разных запросов несопоставимы. Сравнивайте относительные величины только в наборе результатов одного и того же запроса.