Полнотекстовый индекс
Полнотекстовые индексы в строковых таблицах создаются с помощью того же синтаксиса, что и вторичные индексы, при указании fulltext_plain или fulltext_relevance в качестве типа индекса. Подмножество доступного для полнотекстовых индексов синтаксиса:
CREATE TABLE `<table_name>` (
...
INDEX `<index_name>`
GLOBAL
[SYNC]
USING fulltext_plain | fulltext_relevance
ON ( [<prefix_columns>,] <text_column> )
[COVER ( <cover_columns> )]
WITH ( <parameter_name> = <parameter_value>[, ...])
[, ...]
)
Где:
<index_name>- уникальное имя индекса для доступа к даннымSYNC- указывает на синхронную запись данных в индекс. Это единственная доступная на данный момент опция, явно указывать не обязательно.<prefix_columns>- необязательные колонки фильтрации для полнотекстового индекса с фильтрацией; в запросе требуется равенство для каждой колонки префикса<text_column>- одна колонка типаStringилиUtf8, указанная последней вON<cover_columns>- список дополнительных колонок создаваемой таблицы, которые будут сохранены в индексе для возможности их извлечения без обращения к основной таблице<parameter_name>и<parameter_value>- список параметров в формате ключ-значение:
- общие параметры для всех полнотекстовых индексов:
analyzer- готовый анализатор:standard(стандартный токенизатор, нижний регистр и удаление английских стоп-слов),snowball(стандартный токенизатор, нижний регистр, удаление стоп-слов и лемматизация Snowball; требуетсяlanguage) илиkeyword(весь текст становится одним токеном с сохранением регистра)tokenizer- тип токенизатора (standard,whitespace,alphanumericилиkeyword)use_filter_lowercase- фильтр приведения к нижнему регистру (trueилиfalse)use_filter_stopwords- удаление частотных слов, напримерtheиand(trueилиfalse). Поддерживаются английский и русский языки; еслиlanguageне указан, используется английскийuse_filter_length- фильтр по длине токена (trueилиfalse); при значенииtrueтокены корочеfilter_length_minили длиннееfilter_length_maxне индексируютсяfilter_length_min- минимальная длина токена (положительное целое); применяется только приuse_filter_length=truefilter_length_max- максимальная длина токена (положительное целое); применяется только приuse_filter_length=trueuse_filter_snowball- фильтр лемматизации Snowball (trueилиfalse)language- язык или список языков через запятую для лемматизатора Snowball. Пробелы вокруг запятых допустимы, например"english, russian". Готовый анализаторsnowballдополнительно удаляет стоп-слова, поэтому вместе с ним можно указать толькоenglishиrussianuse_filter_ngram- фильтр N-грамм (trueилиfalse)use_filter_edge_ngram- фильтр краевых N-грамм (trueилиfalse)filter_ngram_min_length- минимальная длина N-граммы (положительное целое)filter_ngram_max_length- максимальная длина N-граммы (положительное целое)
Важно
Поддерживается только для строковых таблиц. Поддержка функциональности для колоночных таблиц находится в разработке.
Примеры
Базовый пример
CREATE TABLE articles (
id Uint64,
title String,
body String,
INDEX ft_idx GLOBAL USING fulltext_relevance
ON (body) COVER (title)
WITH (
tokenizer=standard,
use_filter_lowercase=true
),
PRIMARY KEY (id)
)
Лемматизация для нескольких языков
Готовый анализатор Snowball выполняет лемматизацию и позволяет искать формы английских и русских слов в одной текстовой колонке. В language можно перечислить несколько поддерживаемых языков через запятую, в том числе с пробелами:
CREATE TABLE documents (
id Uint64,
body Utf8,
PRIMARY KEY (id),
INDEX ft_idx GLOBAL USING fulltext_relevance ON (body)
WITH (analyzer="snowball", language="english, russian")
);
Пример с N-граммами
N-граммы позволяют находить подстроки внутри слов. При использовании фильтра N-грамм каждое слово разбивается на все возможные подстроки заданной длины. Например, слово "search" с параметрами filter_ngram_min_length=3 и filter_ngram_max_length=5 будет разбито на: "sea", "ear", "arc", "rch" (3-граммы), "sear", "earc", "arch" (4-граммы), "searc", "earch" (5-граммы). Это позволяет находить документы по частичному совпадению в любой части слова.
CREATE TABLE products (
id Uint64,
name String,
description String,
INDEX ft_ngram_idx GLOBAL USING fulltext_plain
ON (name)
WITH (
tokenizer=standard,
use_filter_lowercase=true,
use_filter_ngram=true,
filter_ngram_min_length=3,
filter_ngram_max_length=5
),
PRIMARY KEY (id)
)
Пример с краевыми N-граммами
Краевые N-граммы (edge n-grams) создают подстроки только от начала слова. Например, слово "search" с параметрами filter_ngram_min_length=2 и filter_ngram_max_length=10 будет разбито на: "se", "sea", "sear", "searc", "search". Это особенно полезно для реализации функции автодополнения (autocomplete), когда нужно находить слова, начинающиеся с введённого пользователем префикса.
CREATE TABLE users (
id Uint64,
username String,
email String,
INDEX ft_edge_ngram_idx GLOBAL USING fulltext_plain
ON (username)
WITH (
tokenizer=standard,
use_filter_lowercase=true,
use_filter_edge_ngram=true,
filter_ngram_min_length=2,
filter_ngram_max_length=10
),
PRIMARY KEY (id)
)