跳到主要内容
版本: 最新版本-3.5

N-gram Bloom filter 索引

N-gram Bloom Filter 索引是一种特殊的 Bloom Filter 索引,通常用于加速 LIKE 查询以及 ngram_searchngram_search_case_insensitive 函数的计算速度。

N-gram Bloom Filter 索引仅适用于字符串(STRINGCHARVARCHAR)类型的列。N-gram Bloom Filter 索引与 Bloom Filter 索引的区别在于,N-gram Bloom Filter 索引首先对字符串进行分词,然后将生成的子字符串写入 Bloom Filter 索引。例如,某个索引列的值是一个字符串 Technical。对于传统的 Bloom Filter 索引,整个字符串 Technical 会直接写入索引。但是,对于 gram_num 指定为 4 的 N-gram Bloom Filter 索引,字符串 Technical 首先会被分词为以下子字符串:

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

然后,这些六个子字符串中的每一个都会写入 Bloom Filter 索引。

使用说明

  • 对于 Duplicate Key 或 Primary Key 表,您可以为所有字符串类型的列创建 N-gram Bloom Filter 索引。对于 Aggregate 表或 Unique Key 表,您只能在字符串类型的 Key 列上创建 N-gram Bloom Filter 索引。
  • N-gram Bloom Filter 索引只能为字符串类型(CHAR、STRING 和 VARCHAR)的列创建。
  • 要确定查询是否命中了 N-gram Bloom Filter 索引,您可以检查查询 Profile 中的 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_fppBloom Filter 的误判率,范围从 0.0001 到 0.05。默认值为 0.05。较小的值提供更好的过滤效果,但会产生更大的存储开销。
case_sensitive此索引是否区分大小写。默认值为 true
COMMENT索引注释。

有关与表创建相关的其他参数的说明,请参见 CREATE TABLE

查看 N-gram Bloom Filter 索引

您可以使用 SHOW CREATE TABLESHOW INDEX FROM table 查看表的所有索引。由于索引创建是异步的,因此只有在索引成功创建后才能看到相应的索引。

SHOW CREATE TABLE table1;
SHOW INDEX FROM table1;

修改 N-gram Bloom Filter 索引

您可以使用 ALTER TABLE 语句添加和删除 N-gram Bloom Filter 索引。

  • 执行以下语句,为表 table1 的列 k1 添加一个新的 N-gram Bloom Filter 索引 new_index_name

    ALTER TABLE table1 
    ADD INDEX new_index_name(k1) USING NGRAMBF ("gram_num" = "4",
    "bloom_filter_fpp" = "0.05") COMMENT '';
  • 执行以下语句,从表 table1 中删除 N-gram Bloom Filter 索引 new_index_name

ALTER TABLE table1 DROP INDEX new_index_name;
注意

修改索引是一个异步操作。您可以通过执行 SHOW ALTER TABLE 来查看此操作的进度。每次只能在一个表中运行一个任务来更改索引。

可以加速的查询

LIKE 查询

如果 gram_num 足够小(小于要查询的字符串的长度),则 N-gram Bloom Filter 索引可以加速 LIKE 查询。否则,N-gram Bloom Filter 索引无法加速 LIKE 查询。

例如,如果 gram_num4,并且查询语句为 SELECT * FROM table WHERE col1 LIKE "%abc",则 N-Gram Bloom Filter 索引将不会加速此查询,因为查询的字符串为 abc,只有三个字符,小于 gram_num 的值 4。如果查询条件为 WHERE col1 LIKE "%abcd"WHERE col1 LIKE "%abcde%",则 N-Gram Bloom Filter 索引将加速查询。

当在查询中使用 ngram_search 函数时,如果函数中指定的列具有 N-gram Bloom Filter 索引,并且函数中指定的 gram_num 与 N-gram Bloom Filter 索引的 gram_num 匹配,则索引将自动过滤掉字符串相似度为 0 的数据,从而显著加快函数执行过程。

ngram_search_case_insensitive

此函数的使用方法与 ngram_search 相同,不同之处在于此函数区分大小写。因此,创建 N-gram Bloom Filter 索引时,需要将 case_sensitive 设置为 false

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 '';