Перейти к основному содержимому
Версия: 2.0.x

N-gram bloom filter индекс

N-gram bloom filter индекс - это специальный Bloom filter индекс, который обычно используется для ускорения LIKE запросов и скорости вычисления функций ngram_search и ngram_search_case_insensitive.

N-gram bloom filter индекс подходит только для колонок строкового типа (STRING, CHAR или VARCHAR). Разница между N-gram bloom filter индексом и Bloom filter индексом заключается в том, что N-gram bloom filter индекс сначала токенизирует строки, а затем записывает полученные подстроки в Bloom filter индекс. Например, значение определенной индексированной колонки - это строка Technical. Для традиционного Bloom filter индекса вся строка Technical будет непосредственно записана в индекс. Однако для N-gram bloom filter индекса с указанным gram_num равным 4, строка Technical будет сначала токенизирована в следующие подстроки:

"Tech", "echn", "chni", "hnic", "nica", "ical"

И затем каждая из этих шести подстрок записывается в Bloom filter индекс.

Примечания по использованию

  • Для таблицы Duplicate Key или Primary Key вы можете создавать N-gram bloom filter индексы для всех колонок (строковых типов). Для таблицы Aggregate или Unique Key вы можете создавать N-gram bloom filter индексы только для key колонок (строковых типов).
  • N-gram bloom filter индексы могут быть созданы только для колонок строковых типов (CHAR, STRING и VARCHAR).
  • Чтобы определить, использует ли запрос N-gram bloom filter индекс, вы можете проверить поле BloomFilterFilterRows в профиле запроса.
  • Для одной колонки может быть создан только один тип индекса (Bloom Filter или N-gram Bloom Filter).

Основные операции

Создание N-gram bloom filter индекса

CREATE TABLE test.table1
(
k1 CHAR(10),
k2 CHAR(10),
v1 INT SUM,
INDEX index_name (k2) USING NGRAMBF ("gram_num" = "4",
"bloom_filter_fpp" = "0.05") COMMENT ''
)
ENGINE = olap
AGGREGATE KEY(k1, k2)
DISTRIBUTED BY HASH(k1);

Параметры, связанные с N-gram bloom filter индексом:

ПараметрОбязательныйОписание
index_nameДаИмя индекса. Имена индексов должны быть уникальными в пределах таблицы.
column_nameДаИмя колонки, для которой создается индекс. Можно указать только одно имя колонки. В примере выше это k2.
gram_numНетДлина подстроки после токенизации строки в индексируемой колонке. Значение по умолчанию - 2.
bloom_filter_fppНетВероятность ложноположительного срабатывания Bloom filter в диапазоне от 0.0001 до 0.05. Значение по умолчанию - 0.05. Меньшее значение обеспечивает лучшую фильтрацию, но требует больших накладных расходов на хранение.
case_sensitiveНетЧувствителен ли этот индекс к регистру. Значение по умолчанию - true.
COMMENTНетКомментарий к индексу.

Описание других параметров, связанных с созданием таблицы, см. в CREATE TABLE.

Просмотр N-gram bloom filter индекса

Вы можете просмотреть все индексы таблицы, используя SHOW CREATE TABLE или SHOW INDEX FROM table. Поскольку создание индекса выполняется асинхронно, вы сможете увидеть соответствующий индекс только после успешного создания индекса.

SHOW CREATE TABLE table1;
SHOW INDEX FROM table1;

Изменение N-gram bloom filter индекса

Вы можете добавлять и удалять N-gram bloom filter индекс с помощью оператора ALTER TABLE.

  • Выполните следующий оператор, чтобы добавить новый N-gram bloom filter индекс new_index_name для колонки k1 в таблицу table1.

    ALTER TABLE table1
    ADD INDEX new_index_name(k1) USING NGRAMBF ("gram_num" = "4",
    "bloom_filter_fpp" = "0.05") COMMENT '';
  • Выполните следующий оператор, чтобы удалить N-gram bloom filter индекс new_index_name из таблицы table1.

ALTER TABLE table1 DROP INDEX new_index_name;
примечание

Изменение индекса является асинхронной операцией. Вы можете просмотреть прогресс этой операции, выполнив SHOW ALTER TABLE. Одновременно можно выполнять только одну задачу изменения индекса для таблицы.

Запросы, которые могут быть ускорены

LIKE запросы

N-gram bloom filter индекс может ускорить LIKE запросы, если gram_num достаточно мал (меньше длины строки, для которой выполняется запрос). В противном случае N-gram bloom filter индекс не может ускорить LIKE запросы.

Например, если gram_num равен 4, и оператор запроса SELECT * FROM table WHERE col1 LIKE "%abc", N-Gram Bloom filter индекс не ускорит этот запрос, потому что запрашиваемая строка abc имеет только три символа, что меньше значения 4 параметра gram_num. Если условие запроса WHERE col1 LIKE "%abcd" или WHERE col1 LIKE "%abcde%", N-Gram Bloom filter индекс ускорит запрос.

Когда функция ngram_search используется в запросе, если колонка, указанная в функции, имеет N-gram bloom filter индекс, и gram_num, указанный в функции, соответствует gram_num N-gram bloom filter индекса, индекс автоматически отфильтрует данные с похожестью строк 0, значительно ускоряя процесс выполнения функции.

ngram_search_case_insensitive

Использование этой функции такое же, как у ngram_search, за исключением того, что эта функция чувствительна к регистру. Поэтому требуется, чтобы параметр case_sensitive был установлен в false при создании N-gram bloom filter индекса.

CREATE TABLE test.table1
(
k1 CHAR(10),
k2 CHAR(10),
v1 INT SUM,
INDEX index_name (k2) USING NGRAMBF ("gram_num" = "4",
"bloom_filter_fpp" = "0.05",
"case_sensitive" = "false") COMMENT ''
)
ENGINE = olap
AGGREGATE KEY(k1, k2)
DISTRIBUTED BY HASH(k1);

Если индекс уже создан и его параметр case_sensitive установлен в true, вы можете изменить параметр этого индекса на false, используя:

ALTER TABLE table1
ADD INDEX new_index_name(k1) USING NGRAMBF ("gram_num" = "4",
"bloom_filter_fpp" = "0.05",
"case_sensitive" = "false") COMMENT '';