索引是加速数据库查询的重要方法。云原生多模数据库Lindorm宽表引擎除了支持高性能原生二级索引,也支持一种新的索引类型,称为搜索索引(SearchIndex),搜索索引主要面向复杂的多维查询场景,能够覆盖分词、模糊查询、聚合分析、排序翻页等场景。本文介绍搜索索引的功能和应用场景。

功能介绍

搜索索引是宽表的一个特性,在开发使用体验上与高性能原生二级索引保持一致,您可以使用SQL为宽表创建搜索索引。示例如下,为dt表的c1, c2, c3列创建搜索索引idx,c1, c2, c3列没有顺序要求,c3指定按照IK分词器进行分词。
CREATE SEARCH INDEX idx 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和搜索引擎可以针对不同的使用场景选择不同的机型,独立的部署形态大幅提升了系统的稳定性。数据流
数据写入的流程如下:
  1. 数据写入至Lindorm宽表引擎,原始数据记录在宽表WAL中,写入结果返回客户端。
  2. 数据同步服务LTS实时监听宽表WAL,筛选出宽表WAL中带有SearchIndex的表,并将筛选的数据写入至搜索引擎。
  3. 搜索引擎收到数据后实时构建倒排索引。
数据查询的流程如下:
  1. 查询操作发送至Lindorm宽表引擎,计算层自动进行查询编译,基于优化器选择合适的SearchIndex。
  2. 查询重定向至搜索引擎,查询满足条件的数据。
  3. 汇总搜索引擎的数据,如果需要会自动回查宽表中的数据进行补齐,最后查询结果返回客户端。

应用场景

在宽表引擎和搜索索引配合下,不但可以提供高并发低延迟的KV查询,而且能够提供丰富的多维查询、分词查询、聚合分析等。如果您的业务有以下两个场景的需求,建议使用搜索索引。
  • 架构改造

    如果您当前的业务架构中使用了HBase、MySQL或者MongoDB,同时也在使用搜索引擎Elasticsearch或者Solr。那么可以通过SearchIndex的一体化解决方案替换多个系统组合的架构。

  • 业务选型

常见问题

  • Q:搜索索引与二级索引有什么区别?

    A:二级索引是Lindorm宽表内置的特性,不需要开通即可使用,查询场景适合较为固定的业务需求,默认二级索引个数最多5个。搜索索引是宽表引擎与搜索引擎深度融合的特性,需要单独开通购买,核心功能为倒排索引和列存,适合较为复杂的多维查询,索引列个数最多1000个。

  • Q:数据写入后大概多久可以通过搜索索引查询?

    A:搜索索引的数据一致性默认为最终一致,成功写入至宽表的数据,索引数据可以在1~15秒内可见。如果您将搜索索引的数据一致性设置为强一致模型,成功写入至宽表的数据,索引数据实时可见。