Операторы полнотекстового поиска и ускорения запросов
В этом документе представлены операторы запросов, поддерживаемые инвертированным индексом Apache Doris. Они разделены на две категории:
- Операторы полнотекстового поиска: для нечёткого сопоставления текстовых полей, например по ключевым словам, фразам, префиксам и регулярным выражениям.
- Ускорение запросов с помощью инвертированного индекса: для точной фильтрации структурированных полей, например проверки равенства, попадания в диапазон, принадлежности множеству и операций с массивами.
Операторы полнотекстового поиска
В следующей таблице перечислены все операторы полнотекстового поиска и типичные сценарии их использования:
| Оператор | Типичный сценарий | Правило сопоставления |
|---|---|---|
MATCH_ANY | Поиск по ключевым словам с логикой «OR» | Совпадение хотя бы по одному ключевому слову |
MATCH_ALL | Поиск по ключевым словам с логикой «AND» | Должны совпасть все ключевые слова |
MATCH_PHRASE | Строгий поиск по фразе | Термы идут подряд и в заданном порядке |
MATCH_PHRASE (с параметром slop) | Поиск по фразе с допустимыми отклонениями | Допускаются промежутки между термами |
MATCH_PHRASE (строгий порядок) | Поиск по фразе с фиксированным порядком термов | Порядок термов фиксирован в пределах допустимых промежутков |
MATCH_PHRASE_PREFIX | Подсказки при вводе / дополнение по префиксу | Последний терм сопоставляется по префиксу |
MATCH_REGEXP | Сопоставление термов по регулярному выражению | Регулярное выражение применяется к результатам токенизации |
MATCH_PHRASE_EDGE | Нечёткое сопоставление по краям фразы | Суффикс первого терма + точное совпадение средних термов + префикс последнего терма |
Поиск по ключевым словам: MATCH_ANY / MATCH_ALL
Подходит для сценария «дано несколько ключевых слов, нужно найти документы, содержащие эти слова».
-
MATCH_ANY: находит строки, содержащие хотя бы одно из ключевых слов.
SELECT * FROM table_name WHERE content MATCH_ANY 'keyword1 keyword2'; -
MATCH_ALL: находит строки, содержащие все ключевые слова одновременно.
SELECT * FROM table_name WHERE content MATCH_ALL 'keyword1 keyword2';
Поиск по фразам: семейство MATCH_PHRASE
Подходит для точного сопоставления фраз, когда «ключевые слова должны идти подряд или сохранять заданный порядок термов».
Строгое сопоставление фраз
Требует, чтобы термы шли подряд и в заданном порядке. Чтобы включить ускорение с помощью индекса, задайте "support_phrase" = "true" в свойствах индекса.
SELECT * FROM table_name WHERE content MATCH_PHRASE 'keyword1 keyword2';
Сопоставление фраз с параметром slop
Допускает до slop слов между ключевыми словами; порядок термов может меняться.
-- Allow up to 3 words between keyword1 and keyword2
SELECT * FROM table_name WHERE content MATCH_PHRASE 'keyword1 keyword2 ~3';
Сопоставление фраз со строгим порядком термов
Сочетание + с параметром slop задаёт фиксированный порядок термов.
SELECT * FROM table_name WHERE content MATCH_PHRASE 'keyword1 keyword2 ~3+';
Сопоставление по префиксу и краям фразы
Подходит для таких сценариев, как «подсказки при вводе» и «нечёткое сопоставление по префиксу/суффиксу».
MATCH_PHRASE_PREFIX
Сопоставление фраз, при котором последнее слово сопоставляется по префиксу. Если задано только одно слово, выполняется сопоставление по префиксу этого слова.
-- The last word matches by prefix
SELECT * FROM table_name WHERE content MATCH_PHRASE_PREFIX 'keyword1 key';
-- A single word degenerates into a prefix match
SELECT * FROM table_name WHERE content MATCH_PHRASE_PREFIX 'keyword1';
MATCH_PHRASE_EDGE
Сопоставление по краям фразы со следующими правилами:
- Первое слово сопоставляется по суффиксу
- Для слов в середине требуется точное совпадение
- Последнее слово сопоставляется по префиксу
- Термы должны идти подряд
SELECT * FROM table_name WHERE content MATCH_PHRASE_EDGE 'search engine optim';
Сопоставление по регулярному выражению: MATCH_REGEXP
Выполняет сопоставление по регулярному выражению для термов, полученных при токенизации.
SELECT * FROM table_name WHERE content MATCH_REGEXP '^key_word.*';
Указание анализатора с помощью USING ANALYZER
Если для одного столбца созданы несколько инвертированных индексов с разными анализаторами, с помощью предложения USING ANALYZER можно указать анализатор, который будет использоваться при выполнении запроса.
Синтаксис
SELECT * FROM table_name WHERE column MATCH 'keywords' USING ANALYZER analyzer_name;
Поддерживаемые операторы
Все операторы MATCH поддерживают предложение USING ANALYZER:
MATCH/MATCH_ANYMATCH_ALLMATCH_PHRASEMATCH_PHRASE_PREFIXMATCH_PHRASE_EDGEMATCH_REGEXP
Встроенные анализаторы
| Имя | Описание |
|---|---|
none | Точное совпадение без токенизации |
standard | Стандартная токенизация |
chinese | Токенизация китайского текста |
Примеры использования
-- Use the standard analyzer (tokenizes the text)
SELECT * FROM articles WHERE content MATCH 'hello world' USING ANALYZER std_analyzer;
-- Use the keyword analyzer (exact match, no tokenization)
SELECT * FROM articles WHERE content MATCH 'hello world' USING ANALYZER kw_analyzer;
-- Combined with MATCH_PHRASE
SELECT * FROM articles WHERE content MATCH_PHRASE 'hello world' USING ANALYZER std_analyzer;
-- Use built-in analyzers
SELECT * FROM articles WHERE content MATCH 'hello' USING ANALYZER standard;
SELECT * FROM articles WHERE content MATCH 'hello' USING ANALYZER none;
Примечания
- Если индекс для указанного анализатора не построен, запрос автоматически выполняется без использования индекса (результаты остаются корректными, но производительность ниже).
- Если анализатор не указан, система использует любой доступный индекс.
Ускорение запросов с помощью инвертированного индекса
Помимо полнотекстового поиска, инвертированный индекс также ускоряет точную фильтрацию структурированных полей. Поддерживаются следующие операторы и функции:
| Категория | Оператор / функция |
|---|---|
| Равенство и принадлежность множеству | =, !=, IN, NOT IN |
| Диапазон | >, >=, <, <=, BETWEEN |
| Проверка на NULL | IS NULL, IS NOT NULL |
| Массив | array_contains, array_overlaps |
Примеры использования:
-- Range query
SELECT * FROM t WHERE price >= 100 AND price < 200;
-- Set query
SELECT * FROM t WHERE tags IN ('a', 'b', 'c');
-- Array query
SELECT * FROM t WHERE array_contains(attributes, 'color');