Оценка релевантности
При выполнении полнотекстовых запросов (например, с 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 |
+------+-----------------------------------+---------+--------------+-----------+
Условия активации
Для расчёта оценок запрос должен соответствовать всем трём условиям:
- В предложении
SELECTявно вызывается функцияscore(). - Предложение
WHEREсодержит хотя бы одно условиеMATCH_*. - Запрос является запросом Top-N, а сортировка
ORDER BYвыполняется по результатуscore().
Поддерживаемые типы индексов
| Тип индекса | Поддержка оценки | Описание |
|---|---|---|
| Инвертированный индекс с токенизацией | Да | Позволяет вычислять оценки релевантности BM25 |
| Инвертированный индекс без токенизации | Нет | Поддерживает только точное совпадение; оценки не вычисляются |
Поддерживаемые типы запросов
MATCH_ANYMATCH_ALLMATCH_PHRASEMATCH_PHRASE_PREFIXSEARCH
Алгоритм 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 | Параметры настройки алгоритма |
Параметры
| Параметр | По умолчанию | Описание |
|---|---|---|
k1 | 1.2 | Определяет степень влияния частоты термина на оценку |
b | 0.75 | Определяет степень нормализации по длине записи |
boost | 1.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: Почему мой запрос не возвращает оценки?
Последовательно проверьте:
- Вызывается ли функция
score()вSELECT. - Содержит ли предложение
WHEREусловиеMATCH_*. - Выполняется ли сортировка
ORDER BYпоscore(). - Является ли индекс инвертированным индексом с токенизацией.
Вопрос 2: В чём разница между BM25 и TF-IDF?
BM25 развивает модель TF-IDF, добавляя два улучшения: насыщение частоты термина и нормализацию по длине. Благодаря этому оценки длинных и коротких текстов становятся более сбалансированными, а алгоритм — более устойчивым.
Вопрос 3: Можно ли сравнивать оценки разных запросов?
Это не рекомендуется. Оценки BM25 зависят от конкретных терминов запроса и распределения данных в таблице. Абсолютные значения оценок разных запросов несопоставимы. Сравнивайте относительные величины только в наборе результатов одного и того же запроса.