Doris:倒排索引

目录

一、倒排索引介绍

二、倒排索引语法

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.分词效果只对新插入的数据生效

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

m0_37559973

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值