大数跨境
0
0

重塑检索链路,阿里云PolarDB IMCI列存全文索引能力剖析

重塑检索链路,阿里云PolarDB IMCI列存全文索引能力剖析 阿里云瑶池数据库
2025-11-06
0
导读:有效提升模糊搜索场景查询性能

1. 背景

随着互联网+AI的快速发展,现代应用系统中对非结构化文本数据的存储和高效检索需求日益迫切。全文索引(Full-Text Index)作为一种高效处理文本搜索的技术,在模糊匹配、内容搜索与多模态检索等方面发挥关键作用。
传统关系型数据库(如 MySQL 与 PostgreSQL 等)一般也提供全文索引功能,但并非采用主流倒排索引技术,往往存在以下问题:
  1. 性能瓶颈:并发查询能力差,频繁更新场景下严重影响写入性能;
  2. 功能有限:不支持复杂的分词策略(如中文分词)。
为弥补传统数据库全文索引的不足,许多系统选择 Elasticsearch 或 OpenSearch 等作为独立的全文搜索引擎,通过数据同步实现高效的文本检索,然而作为外接组件也存在一些显著缺点:
  1. 实时性与一致性挑战:ES 与 DB 间需要同步数据,难于满足数据实时性,也不支持 ACID 事务而无法保证索引更新与数据库操作的原子性;
  2. 查询语义割裂:需要编写 SQL 查询和 ES 查询逻辑,业务代码耦合度高。
  3. 成本上升且架构复杂:额外计算资源且数据冗余存储成本高,增加构架复杂性也提升系统维护难度。
为了解决上述痛点,PolarDB IMCI(In-Memory Column Index)提出了一套全新的解决方案 —— 数据库内置列存全文索引,有效提升电商商品搜索、日志分析、文档与知识库检索、用户行为和画像分析等模糊搜索场景查询性能,同时结合内置向量索引提供多模态混合检索能力,致力于为开发者提供包括在线事务、实时分析、全文检索与向量检索等一体化数据平台。

2. 倒排索引

阿里云瑶池旗下的云原生数据库 PolarDB 列存倒排技术主要涉及到分词器、SPIMI 构建算法、倒排表压缩算法 RBM 与词典有限状态转换算法 FST 等。

2.1 分词器

PolarDB 列存全文索引支持 token、ngram、jieba 与 ik 及 json 等多种分词器,还提供 dbms_imci.fts_tokenize 等工具来测试分词效果与管理自定义词典等。

2.2 倒排列表 

▶︎ 倒排表
倒排表(Postings List)直观来说就是文档ID集合,其关键技术点在于极致压缩与高效计算。
在 PolarDB 列存全文索引中,倒排表存储的是包含某个词项的所有列存索引的行号集合与其对应的词频(可选)及文档频率(可选),每一词项对应一个倒排表。
▶︎ RBM 算法
倒排表的压缩算法主要有 FOR(Frame Of Reference)和 RBM(RoaringBitMap)算法,其中位图压缩 RBM 算法应用更加广泛,如 ES 等。RBM 作为一种高性能的压缩位图数据结构,其采用不同类型的容器来处理稀疏与稠密数值数组,在保证较高压缩率的同时提供极快的集合运算;详见 Better bitmap performance with Roaring bitmaps。
PolarDB 列存倒排表 RBM 算法基于 CRoaring [1] 扩展开发,针对不同数目进行定制化,支持落盘时空间整理、计算时 simd 加速、查询时大小值预过滤与迭代器优化等。
[1] https://github.com/RoaringBitmap/CRoaring

2.3 词项字典 

▶︎ 词典
倒排索引的核心思想是利用词典来快速查找词项所对应的倒排表,常用词典实现方案有字典树、B+树与FST等。
▶︎ FST 算法
FST(Finite State Transducer)有限状态转换算法能够较好保证时间和空间复杂度的均衡,应用比较广泛,如 ES 等。FST 算法完整描述参见 Direct Construction of Minimal Acyclic Subsequential Transducers 论文。
PolarDB IMCI 全文索引采用 FST 算法来构建词典,其用于记录词项到倒排表的地址相对偏移。以 "I am Chinese, and I love China." 文档列表为例,按序输入 China、Chinese 与 love 词项列表与其偏移地址(5、10 与 15)构建出词典。

2.4 倒排构建 

▶︎ SPIMI 算法
倒排构建主要是对文档进行分词并生成倒排表和词典,常用构建算法有基于块的排序索引算法 BSBI 和基于分片散列表的内存式单遍扫描索引构建算法 SPIMI。
SPIMI 算法采用 “单次扫描+内存分块+块级写盘+最终合并” 的方式,在内存有限的条件下快速构建高质量的倒排索引,避免全局排序,是信息检索系统中经典且高效的索引构建算法;详见 Efficient single-pass index construction for text databases。PolarDB 列存全文索引采用 SPIMI 算法构建倒排索引。
▶︎ 倒排构建
PolarDB 全文索引构建时会不断读取对应列的列存数据,接着对每一行数据进行分词得到词项集合,然后将每一词项和对应行号添加到散列表并累加内存统计值,当超过段大小阈值时则将散列表中词项和倒排表构建出词典,不断重复以上操作直到处理完所有列存数据。散列表构建词典主要流程是先对散列表按词项排序,接着将散列表中全部倒排表落盘并记录各自偏移地址,然后按序将词项和对应偏移地址依次添加到 FST 算法构建词典,最后压缩词典落盘并记录该段信息到元数据。
PolarDB 列存全文索引得益于局部构建方式与标记删除设计方案,频繁更新不会触发全局重建,只需构建增量,更新时仅标记删除其成本较低,不会影响写入性能。此外,后台异步合并操作也会生成更紧凑的倒排索引。

2.5 倒排检索 

▶︎ 倒排查询
PolarDB 列存全文索引支持 match 函数、加速 like 与 json 操作等。
查询时存在 FtsTableScan 算子与 match 表达式两种执行方式,列存优化阶段根据采集信息估算出过滤率来选择执行方式。若选择算子执行方式,列存优化器会将 match 函数改写为 FtsTableScan + Filter 算子。
▶︎ 倒排检索
PolarDB 列存倒排索引是由倒排段构成,倒排段有独立的元数据、词典与一系列倒排表等,其中元数据常驻内存,词典采用 LRU 缓存。 倒排检索以倒排段为单元,查询时会遍历每个倒排段,从元数据中获取到词典起始地址,然后读取词典数据并构造出词典对象,接着用词典查找该词项,若找到则得到倒排表的相对地址,最后叠加倒排表的起始地址则可读取出倒排表。

3. 性能测试

3.1 数据集

ESRally 是 Elastic 官方提供的 Elasticsearch 基准测试与压测工具,http_logs 数据集详情请参见 Elasticsearch Rally Hub [2],总行数约 2.47 亿。
[2] https://github.com/elastic/rally-tracks/blob/master/http_logs/README.md

3.2 性能测试

下面从高频到低频词元来测试检索性能,在热数据情况下单线程测试结果如下,PolarDB match 有数量级提升,且不受冷热数据影响。

4. 应用场景

全文索引在日志分析、商品搜索、内容检索、多模态混合检索等业务应用广泛。

4.1 日志分析

日志分析系统主要需求是低成本下快速找到包含特定词的日志,当前业界主流方案:
  1. 以 ES 为代表的全文检索架构,全文索引查询性能高,但实时写入吞吐低且存储成本高,总体成本比较高;
  2. 以 Loki 为代表的轻量索引或无索引架构,实时写入吞吐高且存储成本较低,但查询效率低,难于满足实时性。
PolarDB 列存全文索引结合分区表的冷数据归档功能可以完美解决上述痛点。全文索引核心技术是倒排索引,支持快速从海量日志中检索出匹配关键字的日志;冷数据归档功能支持将旧分区的日志数据存储到低成本 OSS 且不影响查询性能(大部分情况下查询的都是近期日志)。
总之,PolarDB 列存全文索引与冷热数据分离功能能够满足日志分析需求,整体性价比有数倍提升。

4.2 商品搜索

电商平台经常需要根据名称或描述进行商品搜索,希望快速返回包含该关键词且按匹配度排序的商品列表,常用方案:
▶︎ like 函数
简单易用但性能差且不支持相关性排序。PolarDB 全文索引支持 BM25 相关性评分。
▶︎ 传统数据库全文索引
适合于准静态小规模数据量,难于满足频繁更新与高并发查询等场景,也缺乏合适中文分词器。PolarDB 全文索引提供多种主流的中文分词器与词典修改等来更好匹配自定义商品。
▶︎ 外挂全文搜索引擎
能够解决商品简单检索问题,但架构复杂和成本增加,对于复杂多表联合查询与大量计算聚合查询无能为力。PolarDB 列存内置全文索引能够简化构架且使用列存索引加速查询。

4.3 内容搜索

内容搜索作为全文索引传统应用场景,主要用于文章关键词检索、客户反馈和评论分析、用户行为和画像分析等。
PolarDB 列存全文索引提供多样化中文分词器并叠加列存并发执行能力,是大规模内容检索的高效精准的解决方案。

4.4 混合检索

混合检索作为全文索引新型应用场景,其结合全文索引与向量索引来检索文档。
▶︎ 全文索引
全文索引主要使用关键词来精准匹配出相关文档并按相关性评分进行排序,擅长于精确匹配,在用户确切知道自己在寻找什么的情况下尤为有效。
▶︎ 语义检索
向量在语义空间中相近表示“语义相近”,用于相似度搜索、聚类与RAG等。向量索引主要使用向量 embeddings 来查找具有相似含义的文档,适合自然语言查询。
▶︎ 混合检索
混合检索融合了全文检索与语义检索,充分利用各自优势进行检索并融合排序出一个综合结果,有助于提高搜索的准确性和稳健性,在检索增强生成(RAG)应用中尤为重要。
PolarDB 基于内置全文索引和内置向量索引的混合检索功能在具有特殊知识领域的 RAG 系统中实现精准高效的召回。

5. 总结

PolarDB 列存全文索引采用主流倒排索引技术与删除标记设计方案,能够高效检索文本和相关性评分。PolarDB 内置全文索引有效简化构架,并结合列存实时分析能力有效应对频繁更新下的大文本高并发检索需求,为企业提供更高性价比的大规模数据的检索平台。随着大模型时代带来各种新型应用探索,PolarDB 提供基于全文索引与向量索引的混合检索功能,并结合 PolarDB for AI 内置的通义千问大模型的归纳生成能力,有效解决大语言模型(LLM)在准确性和实时性方面的局限。
未来,PolarDB 将持续扩展在线事务、实时分析、全文索引、向量检索与流处理等能力边界,不断深化“数据库+搜索+流处理+AI”的技术融合,助力企业构建一体化数据平台。

点击阅读原文了解 PolarDB列存全文索引 详情

求点赞


求分享


求推荐


【声明】内容源于网络
0
0
阿里云瑶池数据库
瑶池,喻指汇聚宝藏之地。阿里云瑶池数据库,汇集数据无价之宝,让数据业务持续在线,数据价值不断放大。
内容 1049
粉丝 0
阿里云瑶池数据库 瑶池,喻指汇聚宝藏之地。阿里云瑶池数据库,汇集数据无价之宝,让数据业务持续在线,数据价值不断放大。
总阅读204
粉丝0
内容1.0k