当前位置:网站首页 > 技术博客 > 正文

倒排索引原理和实现



倒排索引,是信息检索领域常用的索引技术,将文本分成一个个词,构建 词 -> 文档编号 的索引,可以快速查找一个词在哪些文档出现。

从 2.0.0 版本开始,Doris 支持倒排索引,可以用来进行文本类型的全文检索、普通数值日期类型的等值范围查询,快速从海量数据中过滤出满足条件的行。

在 Doris 的倒排索引实现中,Table 的一行对应一个文档、一列对应文档中的一个字段,因此利用倒排索引可以根据关键词快速定位包含它的行,达到 WHERE 子句加速的目的。

与 Doris 中其他索引不同的是,在存储层倒排索引使用独立的文件,跟数据文件一一对应、但物理存储上文件相互独立。这样的好处是可以做到创建、删除索引不用重写数据文件,大幅降低处理开销。

倒排索引的使用范围很广泛,可以加速等值、范围、全文检索(关键词匹配、短语系列匹配等)。一个表可以有多个倒排索引,查询时多个倒排索引的条件可以任意组合。

倒排索引的功能简要介绍如下:

1. 加速字符串类型的全文检索

  • 支持关键词检索,包括同时匹配多个关键字 、匹配任意一个关键字
  • 支持短语查询
    • 支持指定词距
    • 支持短语+前缀
  • 支持分词正则查询
  • 支持英文、中文以及 Unicode 多种分词

2. 加速普通等值、范围查询,覆盖原来 BITMAP 索引的功能,代替 BITMAP 索引

  • 支持字符串、数值、日期时间类型的 =, !=, >, >=, <, <= 快速过滤
  • 支持字符串、数字、日期时间数组类型的 =, !=, >, >=, <, <=

3. 支持完善的逻辑组合

  • 不仅支持 AND 条件加速,还支持 OR NOT 条件加速
  • 支持多个条件的任意 AND OR NOT 逻辑组合

4. 灵活高效的索引管理

  • 支持在创建表上定义倒排索引
  • 支持在已有的表上增加倒排索引,而且支持增量构建倒排索引,无需重写表中的已有数据
  • 支持删除已有表上的倒排索引,无需重写表中的已有数据

在建表语句中 COLUMN 的定义之后是索引定义:

语法说明如下:

1. 是必须的, 是建索引的列名,必须是前面列定义中出现过的, 是索引名字,必须表级别唯一,建议命名规范:列名前面加前缀

2. 是必须的,用于指定索引类型是倒排索引

3. 是可选的,用于指定倒排索引的额外属性,目前支持的属性如下:

4. 是可选的,用于指定索引注释

1. ADD INDEX

支持 和 两种语法,参数跟建表时索引定义相同

2. BUILD INDEX

操作只是新增了索引定义,这个操作之后的新写入数据会生成倒排索引,而存量数据需要使用 触发:

通过 查看 进度:

通过 取消 :

如果想检查分词实际效果或者对一段文本进行分词行为,可以使用 TOKENIZE 函数进行验证。

TOKENIZE 函数的第一个参数是待分词的文本,第二个参数是创建索引指定的分词参数。

用 HackerNews 100 万条数据展示倒排索引的创建、全文检索、普通查询,包括跟无索引的查询性能进行简单对比。

通过 Stream Load 导入数据

SQL 运行 count() 确认导入数据成功

01 全文检索

  • 用 匹配计算 comment 中含有 'OLAP' 的行数,耗时 0.18s
  • 用基于倒排索引的全文检索 计算 comment 中含有'OLAP'的行数,耗时 0.02s,加速 9 倍,在更大的数据集上效果会更加明显

    这里结果条数的差异,是因为倒排索引对 comment 分词后,还会对词进行进行统一成小写等归一化处理,因此 比 的结果多一些

  • 同样的对比统计 'OLTP' 出现次数的性能,0.07s vs 0.01s,由于缓存的原因 和 都有提升,倒排索引仍然有 7 倍加速
  • 同时出现 'OLAP' 和 'OLTP' 两个词,0.13s vs 0.01s,13 倍加速

    要求多个词同时出现时(AND 关系)使用 'keyword1 keyword2 ...'

  • 任意出现 'OLAP' 和 'OLTP' 其中一个词,0.12s vs 0.01s,12 倍加速

    只要求多个词任意一个或多个出现时(OR 关系)使用 'keyword1 keyword2 ...'

02 普通等值、范围查询

  • DataTime 类型的列范围查询
  • 为 timestamp 列增加一个倒排索引
  • 查看索引创建进度,通过 FinishTime 和 CreateTime 的差值,可以看到 100 万条数据对 timestamp 列建倒排索引只用了 1s
  • 索引创建后,范围查询用同样的查询方式,Doris 会自动识别索引进行优化,但是这里由于数据量小性能差别不大
  • 在数值类型的列 Parent 进行类似 timestamp 的操作,这里查询使用等值匹配
  • 对字符串类型的 建立不分词的倒排索引,等值查询也可以利用索引加速

版权声明


相关文章:

  • xujc在线编译系统2024-11-29 12:30:00
  • logistic逻辑回归分析2024-11-29 12:30:00
  • layer and layer2024-11-29 12:30:00
  • 黑客工具资源网2024-11-29 12:30:00
  • yolov5的激活函数2024-11-29 12:30:00
  • sigmoid激活函数作用2024-11-29 12:30:00
  • 网络攻防战是什么2024-11-29 12:30:00
  • 备忘录形式是什么样的2024-11-29 12:30:00
  • debian镜像下载2024-11-29 12:30:00
  • 电脑阅读软件多种格式哪个好用2024-11-29 12:30:00