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

Операторы полнотекстового поиска и ускорения запросов

В этом документе представлены операторы запросов, поддерживаемые инвертированным индексом 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_ANY
  • MATCH_ALL
  • MATCH_PHRASE
  • MATCH_PHRASE_PREFIX
  • MATCH_PHRASE_EDGE
  • MATCH_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
Проверка на NULLIS 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');