跳到主要内容
版本:Candidate-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_num4 的 N-gram bloom filter 索引,字符串 Technical 将首先被分词为以下子字符串:

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

然后将这六个子字符串分别写入 Bloom filter 索引。

使用注意事项

  • 对于 Duplicate Key 或 Primary Key 表,可以为所有列(字符串类型)创建 N-gram bloom filter 索引。对于聚合表或更新表,只能在键列(字符串类型)上创建 N-gram bloom filter 索引。
  • 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_fppBloom filter 的误报率,范围从 0.0001 到 0.05。默认值为 0.05。较小的值提供更好的过滤效果,但会增加存储开销。
case_sensitive此索引是否区分大小写。默认值为 true
COMMENT索引注释。

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

查看 N-gram bloom filter 索引

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

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