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

Инвертированный индекс (текстовый поиск)

Текстовый поиск находит в наборе данных документы, содержащие заданные термины или фразы, и ранжирует результаты по релевантности.

Метод поискаПреимуществоСценарии применения
Текстовый поиск«Найти точно»: управляемое и объяснимое точное сопоставление, обеспечивающее предсказуемое нахождение ключевых слов и соблюдение условий фильтрацииПоиск по ключевым словам, сопоставление фраз, булева фильтрация
Векторный поиск«Искать шире»: использует семантическое сходство для расширения охвата поискаСемантический поиск, приближённое сопоставление

В приложениях на основе генеративного ИИ, особенно в сценариях генерации с дополнением на основе поиска (RAG), текстовый и векторный поиск дополняют друг друга:

  • Сочетают семантический охват с лексической точностью
  • Повышают полноту поиска, обеспечивая точность и объяснимость результатов
  • Вместе создают надёжную основу поиска, предоставляя большим языковым моделям более точный и релевантный контекст
Создание инвертированных индексов V1 запрещено начиная с версии 4.1.5

Для новых индексов используйте V2 или V3. Существующие таблицы V1 по-прежнему доступны для чтения, но добавлять инвертированные индексы или обновлять формат хранения индекса на месте с помощью ALTER TABLE нельзя; вместо этого пересоздайте таблицу. После обновления FE не сможет запуститься, если фактическое значение его параметра inverted_index_storage_format останется V1. Заранее обновите fe.conf и fe_custom.conf. См. Обновление до 4.1.5.

Развитие текстового поиска в Doris​

В версии 2.0.0 в Doris появился инвертированный индекс для высокопроизводительного полнотекстового поиска. По мере расширения сценариев поиска и усложнения запросов Doris продолжал развивать возможности текстового поиска в последующих выпусках.

ЭтапВерсияОсновные возможности
Базовый этап2.0+Добавлены инвертированные индексы на уровне столбцов, базовые операторы полнотекстового поиска (MATCH_ANY, MATCH_ALL) и токенизаторы для разных языков, обеспечивающие эффективный поиск по ключевым словам в больших наборах данных
Расширение функциональностиот 2.x до 3.xРасширен набор операторов: добавлены сопоставление фраз (MATCH_PHRASE), префиксный поиск (MATCH_PHRASE_PREFIX) и сопоставление по регулярным выражениям (MATCH_REGEXP); в версии 3.1 появилась пользовательская токенизация
Развитие возможностей4.0+Добавлены оценка релевантности BM25 и функция SEARCH как единая точка входа для запросов, обеспечивающие ранжирование по релевантности текста и гибридное ранжирование

Основные улучшения в 4.0+:

  • Оценка релевантности BM25: функция score() ранжирует результаты по релевантности текста; её оценки можно сочетать с оценками векторного сходства для гибридного ранжирования.
  • Функция SEARCH: предоставляет единый DSL для запросов с поддержкой поиска по нескольким столбцам и сочетаний булевых условий, упрощая построение сложных запросов и дополнительно повышая их производительность.

Основные возможности текстового поиска в Doris​

1. Широкий набор операторов текстового поиска​

Doris предоставляет набор операторов полнотекстового поиска, охватывающих различные способы поиска: от простого сопоставления ключевых слов до сложных запросов по фразам.

Основные операторы, поддерживаемые в текущей версии:

ОператорОписаниеТипичные сценарии
MATCH_ANY / MATCH_ALLСовпадение с любым термином (OR) и со всеми терминами (AND)Обычный поиск по ключевым словам
MATCH_PHRASEТочное сопоставление фразы с возможностью настроить slop и порядок словПоиск слов с учётом расстояния между ними
MATCH_PHRASE_PREFIXСопоставление по префиксу фразыАвтодополнение, поиск по мере ввода
MATCH_REGEXPСопоставление на основе регулярных выраженийПоиск текста по шаблону

Эти операторы можно использовать отдельно или объединять с помощью функции SEARCH() для построения сложных логических запросов. Например (здесь используется таблица docs, созданная в разделе Быстрый старт ниже):

-- Exact phrase search
SELECT * FROM docs WHERE content MATCH_PHRASE 'inverted index';

-- Prefix search
SELECT * FROM docs WHERE content MATCH_PHRASE_PREFIX 'data ware';

Все операторы


2. Пользовательская токенизация (3.1+)​

В текстовом поиске способ токенизации напрямую определяет точность и полноту поиска. Начиная с версии 3.1 Doris поддерживает пользовательские анализаторы, позволяющие гибко настраивать конвейер токенизации под задачи бизнеса.

Пользовательская токенизация позволяет детально управлять обработкой текста, комбинируя компоненты следующих трёх типов:

  • Символьный фильтр (char_filter): заменяет, удаляет или нормализует символы до токенизации
  • Токенизатор (tokenizer): задаёт алгоритм токенизации. Поддерживает такие типы, как standard, ngram, edge_ngram, keyword и icu, для обработки текстов на разных языках и с разной структурой
  • Фильтр токенов (token_filter): например, lowercase, word_delimiter и ascii_folding, используемые для нормализации и дополнительной обработки результатов токенизации
-- Example: Define a custom analyzer
CREATE INVERTED INDEX ANALYZER IF NOT EXISTS keyword_lowercase
PROPERTIES (
"tokenizer" = "keyword",
"token_filter" = "asciifolding, lowercase"
);

-- Use the custom analyzer when creating a table
CREATE TABLE docs (
id BIGINT,
content TEXT,
INDEX idx_content (content) USING INVERTED PROPERTIES(
"analyzer" = "keyword_lowercase",
"support_phrase" = "true"
)
);

Подробнее о пользовательской токенизации


3. Оценка релевантности BM25 (4.0+)​

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

Основные характеристики BM25:

  • Вероятностная модель, основанная на частоте термина (TF), обратной частоте документов (IDF) и длине документа
  • Хорошо работает как с короткими, так и с длинными текстами
  • Стратегия взвешивания настраивается с помощью параметров k1 и b
SELECT id, title, score() AS relevance
FROM docs
WHERE content MATCH_ANY 'real-time OLAP analytics'
ORDER BY relevance DESC
LIMIT 10;

Подробнее о механизме оценки


4. Функция SEARCH: единая точка входа для запросов (4.0+)​

Функция SEARCH() предоставляет единый синтаксис текстового поиска, поддерживает поиск по нескольким столбцам и сочетания булевых условий, позволяя компактнее записывать сложные запросы:

SELECT id, title, score() AS relevance
FROM docs
WHERE SEARCH('title:Machine AND tags:ANY(database sql)')
ORDER BY relevance DESC
LIMIT 20;

Полное руководство по функции SEARCH


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

Шаг 1: создайте таблицу с инвертированными индексами​

CREATE TABLE docs (
id BIGINT,
title STRING,
content STRING,
category STRING,
tags ARRAY<STRING>,
created_at DATETIME,
-- Text search indexes
INDEX idx_title(title) USING INVERTED PROPERTIES ("parser" = "chinese"),
INDEX idx_content(content) USING INVERTED PROPERTIES ("parser" = "chinese", "support_phrase" = "true"),
INDEX idx_category(category) USING INVERTED,
INDEX idx_tags(tags) USING INVERTED
)
DUPLICATE KEY(id)
DISTRIBUTED BY HASH(id) BUCKETS 10
PROPERTIES ("replication_num" = "1");

Шаг 2: выполните текстовые запросы​

-- Simple keyword search
SELECT * FROM docs WHERE content MATCH_ANY 'apache doris';

-- Phrase search
SELECT * FROM docs WHERE content MATCH_PHRASE 'full-text search';

-- Boolean query with SEARCH
SELECT * FROM docs
WHERE SEARCH('title:apache AND (category:database OR tags:ANY(sql nosql))');

-- Relevance-based ranking
SELECT id, title, score() AS relevance
FROM docs
WHERE content MATCH_ANY 'real-time analytics OLAP'
ORDER BY relevance DESC
LIMIT 10;

Гибридный поиск: текстовый + векторный​

В приложениях RAG сочетание текстового поиска с векторным сходством позволяет находить более полный набор результатов:

-- Hybrid retrieval: semantic similarity + keyword filtering
SELECT id, title, score() AS text_relevance
FROM docs
WHERE
-- Vector filter for semantic similarity
cosine_distance(embedding, [0.1, 0.2, ...]) < 0.3
-- Text filter for keyword constraints
AND SEARCH('title:search AND content:engine AND category:technology')
ORDER BY text_relevance DESC
LIMIT 10;

Управление инвертированными индексами​

Создание индекса​

-- Create at table creation time
CREATE TABLE t (
content STRING,
INDEX idx(content) USING INVERTED PROPERTIES ("parser" = "chinese")
);

-- Create on an existing table
CREATE INDEX idx_content ON docs(content) USING INVERTED PROPERTIES ("parser" = "chinese");

-- Build the index for existing data
BUILD INDEX idx_content ON docs;

Удаление индекса​

DROP INDEX idx_content ON docs;

Просмотр индексов​

SHOW CREATE TABLE docs;
SHOW INDEX FROM docs;

Дополнительные материалы​

Основная документация​

Углублённое изучение​