索引是加速数据库查询的重要方法。云原生多模数据库 Lindorm宽表引擎除了支持高性能原生二级索引,也支持一种新的索引类型,称为搜索索引(SearchIndex),搜索索引主要面向复杂的多维查询场景,能够覆盖分词、模糊查询、聚合分析、排序翻页等场景。本文介绍搜索索引的功能和应用场景。
功能介绍
搜索索引是宽表的一个特性,在开发使用体验上与高性能原生二级索引保持一致,您可以使用SQL为宽表创建搜索索引。示例如下,为dt表的c1, c2, c3列创建搜索索引idx
,c1, c2, c3列没有顺序要求,c3指定按照IK分词器进行分词。
CREATE INDEX idx USING SEARCH ON dt(c1, c2, c3(type=text, analyzer=ik));
搜索索引可以满足以下业务需求:
多维组合查询。c1, c2, c3列的随机组合,快速返回查询数据。
SELECT * FROM dt WHERE c1=?; SELECT * FROM dt WHERE c2=? AND c3=?;
分词查询。c3列为分词字段,可以通过等值查询相关性高的结果集。例如查询c3列中包含功能介绍、功能或者介绍的数据。
SELECT * FROM dt WHERE c3='功能介绍';
聚合分析。支持COUNT、SUM、MIN、MAX、AVG等聚合函数。
排序分页。支持任意索引列的排序(ORDER BY语句)。
架构介绍
SearchIndex是宽表引擎和搜索引擎深度融合后提供的新型索引。整体数据流如下图。在此架构下,宽表引擎、LTS和搜索引擎都是以独立服务的方式存在,您可以分别对各个引擎进行管理。如果搜索引擎处理能力不足,只需要扩容搜索引擎。如果LTS同步能力不足,可以单独扩容LTS。宽表引擎、LTS和搜索引擎可以针对不同的使用场景选择不同的机型,独立的部署形态大幅提升了系统的稳定性。
数据写入的流程如下:
数据写入至Lindorm宽表引擎,原始数据记录在宽表WAL中,写入结果返回客户端。
数据同步服务LTS实时监听宽表WAL,筛选出宽表WAL中带有SearchIndex的表,并将筛选的数据写入至搜索引擎。
搜索引擎收到数据后实时构建倒排索引。
数据查询的流程如下:
查询操作发送至Lindorm宽表引擎,计算层自动进行查询编译,基于优化器选择合适的SearchIndex。
查询重定向至搜索引擎,查询满足条件的数据。
汇总搜索引擎的数据,如果需要会自动回查宽表中的数据进行补齐,最后查询结果返回客户端。
应用场景
在宽表引擎和搜索索引配合下,不但可以提供高并发低延迟的KV查询,而且能够提供丰富的多维查询、分词查询、聚合分析等。如果您的业务有以下两个场景的需求,建议使用搜索索引。
架构改造
如果您当前的业务架构中使用了HBase、MySQL或者MongoDB,同时也在使用搜索引擎Elasticsearch或者Solr。那么可以通过SearchIndex的一体化解决方案替换多个系统组合的架构。
业务选型
金融行业,账单场景,详情请参见收钱吧订单查询&搜索。
物流行业,订单场景,详情请参见申通快递迁移Oracle到Lindorm。
常见问题
Q:搜索索引与二级索引有什么区别?
A:二级索引是Lindorm宽表内置的特性,不需要开通即可使用,查询场景适合较为固定的业务需求,默认二级索引个数最多5个。搜索索引是宽表引擎与搜索引擎深度融合的特性,需要单独开通购买,核心功能为倒排索引和列存,适合较为复杂的多维查询,索引列个数最多1000个。
Q:数据写入后大概多久可以通过搜索索引查询?
A:搜索索引的数据一致性默认为最终一致,成功写入至宽表的数据,索引数据可以在1~15秒内可见。