[Предварительная версия] Полнотекстовый инвертированный индекс
Начиная с версии 1.5.0, Selena поддерживает полнотекстовые инвертированные индексы, которые могут разбивать текст на отдельные слова и создавать запись индекса для каждого слова, показывающую отношение между словом и соответствующим номером строки в файле данных. Для полнотекстового поиска Selena запрашивает инвертированный индекс на основе ключевых слов поиска, быстро находя строки данных, соответствующие ключевым словам.
Полнотекстовый инвертированный индекс пока не поддерживается в таблицах Primary Key и кластерах с общими данными.
Обзор
Selena хранит свои базовые данные в файлах данных, организованных по столбцам. Каждый файл данных содержит полнотекстовый инвертированный индекс на основе индексированных столбцов. Значения в индексированных столбцах токенизируются на отдельные слова. Каждое слово после токенизации рассматривается как запись индекса, сопоставляемая с номером строки, где появляется слово. В настоящее время поддерживаются методы токенизации для английской токенизации, китайской токенизации, многоязычной токенизации и без токенизации.
Например, если строка данных содержит "hello world" и её номер строки 123, полнотекстовый инвертированный индекс создает записи индекса на основе этого результата токенизации и номера строки: hello->123, world->123.
Во время полнотекстового поиска Selena может найти записи индекса, содержащие ключевые слова поиска, используя полнотекстовые инвертированные индексы, а затем быстро найти номера строк, где появляются ключевые слова, значительно сокращая количество строк данных, которые необходимо сканировать.
Осно вные операции
Создание полнотекстового инвертированного индекса
Перед созданием полнотекстового инвертированного индекса необходимо включить параметр конфигурации FE enable_experimental_gin.
ADMIN SET FRONTEND CONFIG ("enable_experimental_gin" = "true");
Также полнотекстовый инвертированный индекс может быть создан только в таблице Duplicate Key, и свойство таблицы replicated_storage должно быть false.
Создание полнотекстового инвертированного индекса при создании таблицы
Создание полнотекстового инвертированного индекса для столбца v с английской токенизацией.
CREATE TABLE `t` (
`k` BIGINT NOT NULL COMMENT "",
`v` STRING COMMENT "",
INDEX idx (v) USING GIN("parser" = "english")
) ENGINE=OLAP
DUPLICATE KEY(`k`)
DISTRIBUTED BY HASH(`k`) BUCKETS 1
PROPERTIES (
"replicated_storage" = "false"
);
- Параметр
parserуказывает метод токенизации. Поддерживаемые значения и описания следующие:none(по умолчанию): без токенизации. Вся строка данных в индексированном столбце рассматривается как единый элемент индекса при построении полнотекстового инвертированного индекса.english: английская токенизация. Этот метод токенизации обычно разделяет по любому неалфавитному символу. Также заглавные английские буквы преобразуются в строчные. Поэтому ключевые слова в условиях запроса должны быть строчными английскими, а не заглавными английскими, чтобы использовать полнотекстовый инвертированный индекс для поиска строк данных.chinese: китайская токенизация. Этот метод токенизации использует CJK Analyzer в CLucene для токенизации.standard: многоязычная токенизация. Этот метод токенизации обеспечивает токенизацию на основе грамматики (основанную на алгоритме сегментации текста Unicode) и хорошо работает для большинства языков и случаев смешанных языков, таких как китайский и английский. Например, этот метод токенизации может различать китайский и английский, когда эти два языка сосуществуют. После токенизации английского он преобразует заглавные английские буквы в строчные. Поэтому ключевые слова в условиях запроса должны быть строчными английскими, а не заглавными английскими, чтобы использовать полнотекстовый инвертированный индекс для поиска строк данных.
- Тип данных индексированного столбца должен быть CHAR, VARCHAR или STRING.
Добавление полнотекстового инвертированного индекса после создания таблицы
После создания таблицы можно добавить полнотекстовый инвертированный индекс, используя ALTER TABLE ADD INDEX или CREATE INDEX.
ALTER TABLE t ADD INDEX idx (v) USING GIN('parser' = 'english');
CREATE INDEX idx ON t (v) USING GIN('parser' = 'english');
Управление полнотекстовым инвертированным индексом
Просмотр полнотекстового инвертированного индекса
Выполните SHOW CREATE TABLE для просмотра полнотекстовых инвертированных индексов.
MySQL [example_db]> SHOW CREATE TABLE t\G
Удаление полнотекстового инвертированного индекса
Выполните ALTER TABLE ADD INDEX или DROP INDEX для удаления полнотекстовых инвертированных индексов.
DROP INDEX idx on t;
ALTER TABLE t DROP index idx;
Ускорение запросов с помощью полнотекстового инвертированного индекса
После создания полнотекстового инвертированного индекса необходимо убедиться, что системная переменная enable_gin_filter включена, чтобы инвертированный индекс мог ускорять запросы. Также необходимо учитывать, токенизированы ли значения столбца индекса, чтобы определить, какие запросы могут быть ускорены.