Полнотекстовый индекс
Полнотекстовые индексы в строковых таблицах создаются с помощью того же синтаксиса, что и вторичные индексы, при указании fulltext_plain или fulltext_relevance в качестве типа индекса. Подмножество доступного для полнотекстовых индексов синтаксиса:
CREATE TABLE `<table_name>` (
...
INDEX `<index_name>`
GLOBAL
[SYNC]
USING fulltext_plain | fulltext_relevance
ON ( <text_column> )
[COVER ( <cover_columns> )]
[WITH ( <parameter_name> = <parameter_value>[, ...])]
[, ...]
)
Где:
<index_name>- уникальное имя индекса для доступа к даннымSYNC- указывает на синхронную запись данных в индекс. Это единственная доступная на данный момент опция, явно указывать не обязательно.<text_column>- одна колонка таблицы с текстовым содержимым (на данный момент поддерживается только одна индексируемая колонка)<cover_columns>- список дополнительных колонок создаваемой таблицы, которые будут сохранены в индексе для возможности их извлечения без обращения к основной таблице<parameter_name>и<parameter_value>- список параметров в формате ключ-значение:
- общие параметры для всех полнотекстовых индексов:
tokenizer- тип токенизатора (standard,whitespaceилиkeyword)use_filter_lowercase- фильтр приведения к нижнему регистру (trueилиfalse)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)use_filter_ngram- фильтр N-грамм (trueилиfalse)use_filter_edge_ngram- фильтр краевых N-грамм (trueилиfalse)filter_ngram_min_length- минимальная длина N-граммы (положительное целое)filter_ngram_max_length- максимальная длина N-граммы (положительное целое, (\ge)filter_ngram_min_length)
Важно
Поддерживается только для строковых таблиц. Поддержка функциональности для колоночных таблиц находится в разработке.
Примеры
Базовый пример
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)
)
Пример с 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)
)