目录
一、倒排索引介绍
二、倒排索引语法
2.1建表时创建倒排索引
2.2 已有表增加倒排索引
2.3 删除索引
三、使用倒排索引
3.1 创建带有倒排索引的表
3.2 插入数据
3.3利用倒排索引查询
3.4 自定义分词
一、倒排索引介绍
倒排索引,是信息检索领域常用的索引技术,将文本分成一个个词,构建 词 -> 文档编号 的索引,可以快速查找一个词在哪些文档出现。从 2.0.0 版本开始,Doris 支持倒排索引,可以用来进行文本类型的全文检索、普通数值日期类型的等值范围查询,快速从海量数据中过滤出满足条件的行。
二、倒排索引语法
2.1建表时创建倒排索引
在新建表时创建索引同时使用USING INVERTED指定索引类型为倒排索引,语法如下:
CREATE TABLE table_name
(
column_name1 TYPE1,
column_name2 TYPE2,
column_name3 TYPE3,
INDEX idx_name1(column_name1) USING INVERTED [PROPERTIES(...)] ,
INDEX idx_name2(column_name2) USING INVERTED [PROPERTIES(...)]
)
table_properties;
PROPERTIES 是可选的,用于指定倒排索引的额外属性,主要支持以下属性:
1. parser:指定分词器(english、chinese、unicode)
- `english` 是英文分词,适合被索引列是英文的情况,用空格和标点符号分词,性能高
- `chinese` 是中文分词,适合被索引列主要是中文的情况,性能比 English 分词低
- `unicode` 是多语言混合类型分词,适用于中英文混合、多语言混合的情况。它能够对邮箱前缀和后缀、IP 地址以及字符数字混合进行分词,并且可以对中文按字符分词。
- 默认不指定代表不分词
2. parser_mode:用于指定分词的模式,目前 parser = chinese 时支持如下几种模式:
- fine_grained:细粒度模式,倾向于分出比较短、较多的词,比如 '武汉市长江大桥' 会分成 '武汉', '武汉市', '市长', '长江', '长江大桥', '大桥' 6 个词
- coarse_grained:粗粒度模式,倾向于分出比较长、较少的词,,比如 '武汉市长江大桥' 会分成 '武汉市' '长江大桥' 2 个词
- 默认 coarse_grained
3. lower_case:是否将分词进行小写转换,从而在匹配的时候实现忽略大小写
- true: 转换小写
- false:不转换小写
- 从 2.1.2 版本开始默认为 true,自动转小写,之前的版本默认为 false
2.2 已有表增加倒排索引
1.添加索引:支持CREATE INDEX 和 ALTER TABLE ADD INDEX 两种语法,参数跟建表时索引定义相同。
-- 语法 1
CREATE INDEX idx_name ON table_name(column_name) USING INVERTED [PROPERTIES(...)] [COMMENT 'your comment'];
-- 语法 2
ALTER TABLE table_name ADD INDEX idx_name(column_name) USING INVERTED [PROPERTIES(...)] [COMMENT 'your comment'];
2.构建索引:CREATE / ADD INDEX 操作只是新增了索引定义,这个操作之后的新写入数据会生成倒排索引,而存量数据需要使用 BUILD INDEX 触发:
-- 语法 1,默认给全表的所有分区 BUILD INDEX
BUILD INDEX index_name ON table_name;
-- 语法 2,可指定 Partition,可指定一个或多个
BUILD INDEX index_name ON table_name PARTITIONS(partition_name1, partition_name2);-- 通过 SHOW BUILD INDEX 查看 BUILD INDEX 进度
SHOW BUILD INDEX [FROM db_name];
-- 示例 1,查看所有的 BUILD INDEX 任务进展
SHOW BUILD INDEX;
-- 示例 2,查看指定 table 的 BUILD INDEX 任务进展
SHOW BUILD INDEX where TableName = "table1";-- 通过 CANCEL BUILD INDEX 取消 BUILD INDEX
CANCEL BUILD INDEX ON table_name;
CANCEL BUILD INDEX ON table_name (job_id1,jobid_2,...);
2.3 删除索引
-- 语法 1
DROP INDEX idx_name ON table_name;
-- 语法 2
ALTER TABLE table_name DROP INDEX idx_name;
三、使用倒排索引
3.1 创建带有倒排索引的表
CREATE TABLE tb_test
(
`id` BIGINT NOT NULL AUTO_INCREMENT,
`comment` String,
INDEX idx_comment (`comment`) USING INVERTED PROPERTIES("parser" = "chinese", "parser_mode" = "coarse_grained")
)
UNIQUE KEY(`id`)
DISTRIBUTED BY HASH(`id`) BUCKETS 10
PROPERTIES ("replication_num" = "1");
3.2 插入数据
insert into tb_test(comment) values('我喜欢上班'),('上班使我快乐'),('我喜欢写代码');
3.3利用倒排索引查询
1.全文检索关键词匹配
-- MATCH_ANY 匹配任意一个关键字
select count() from tb_test where comment MATCH_ANY '上班';
-- MATCH_ANY 支持多个关键字,用空格分隔
select count() from tb_test where comment MATCH_ANY '上班 喜欢';
-- MATCH_ALL 同时匹配多个关键字
select count() from tb_test where comment MATCH_ALL '上班 喜欢';
3.4 自定义分词
Doris的倒排索引会对词组进行分词的,比如“喜欢写代码”,会对其分词为“喜欢”、“写”和“代码”,此时用match_any会匹配到包含这三个词语中任意一个的结果: “我喜欢上班”和“我喜欢写代码” 。对于某些特定组合如果不想让其进行分词,可以在be/dict/user.dict.utf8中加上这个特定组合,比如我加入“喜欢写代码”这个词组会被视为一个整体,不再对其进行分词。
注意1.需要重启be生效;2.分词效果只对新插入的数据生效