地址:https://github.com/Tencent/wwsearch/blob/master/doc/wwsearch-implement.md

背景

企业微信作为典型企业服务系统,其众多企业级应用都需要全文检索能力,包括员工通讯录、企业邮箱、审批、汇报、企 业CRM、企业素材、互联圈子等。下图是一个典型的邮件检索场景。

wwsearch 全文检索引擎-LMLPHP

由于过去几年业务发展迅速,后台检索架构面临挑战: 1. 系统在亿级用户,xxx万企业下,如何高效+实时地检索个人企业内数据和所在企业全局数据。 2. 业务模型众多,如何满足检索条件/功能多样化需求。 3. 数据量庞大,检索文本几十TB,如何节约成本。

业界有被广泛使用的开源全文检索引擎,比如:lucene、sphinx等。它们适用于站内检索的场景。而在海量用户、大规模数据量的实时检索场景下,存在明显缺点: 1. 无法支持细粒度切分索引,只能对全局数据构建索引 ,检索过程需要过滤冗余数据。 2. 不支持实时检索,有几十秒~分钟级延迟。 3. 实际部署机型要求高,需要大内存机型才能支撑T级别的数据存储。

针对已有方案的不足,并结合企业级应用场景,我们重新设计和实现一套通用的全文检索引擎wwsearch。

自研全文检索引擎

wwsearch为海量用户下的全文快速检索而设计,底层支持可插拔的lsm tree存储引擎,具备支持按用户的亿级分表、低延时、高效更新、索引压缩、功能丰富、内存消耗低等特点。

目前覆盖企业微信所有在线检索场景, 最大业务场景有300亿+条记录,索引词项万亿+,存储容量几十TB。在大规模数据下,服务运行稳定,可以为业务增长提供稳定有力保障!

wwsearch 全文检索引擎-LMLPHP

wwsearch有丰富的功能,可灵活支持业务场景: 1. 支持等值、前缀、模糊匹配,支持And、Or条件组合。 2. 实时增删查改。 3. 支持后置过滤,包括等值、数值范围、数组元素查找、字符串模糊匹配。 4. 支持多条件排序,类似order by语义。 5. 可扩展功能,包括聚合功能(sum/avg...)、文档打分。

高效索引更新

企业级应用相关的数据通常需要经过多次流转,才能达到最终状态,比如审批业务。这意味着,检索系统的数据写入后也需要部分更新。

开源检索引擎实现是基于文档粒度对索引进行增删,更新是一次删除和全量插入过程,无法高效支持部分更新。

wwsearch的实现和开源不同,索引的增删是基于词级别的,粒度更细。主要原理: 1. 引擎记录写入文档的分词列表,更新时,通过对比更新前后的分词列表,可以知道应该插入哪些词、删除哪些词。 2. 检索一个词的倒排列表时,会读取该词多个倒排列表,并按优先级对倒排列表归并,时间上后写的倒排列表优先级更高。 3. 倒排列表内被删除的DocID会随着lsm tree文件的合并(Compact),会被逐渐淘汰。

wwsearch 全文检索引擎-LMLPHP

wwsearch以倒排列表为单位对索引进行增删改的方案,优点如下: 1. 实时读写,写入即可检索。 2. 更新友好,高效支持部分更新。

支持亿级分表

开源检索引擎对全局数据构建索引,每次检索需在全局索引中检索结果,这种做法存在缺点: 1. 用户或企业只检索自身数据,在多用户场景下,检索效率低。 2. 大规模数据情况下,无法实时响应用户请求。

通过支持细粒度分表的能力,wwsearch可以很好地解决这个问题。原理是:利用lsm tree全局有序能力,通过对正向索引、倒排索引的数据key增加特定Prefix的方式,来支持亿级分表的能力。由于底层存储采用lsm tree结构存储,通过共享key前缀方式,我们可以忽略不计这个Prefix增加的存储消耗。

wwsearch 全文检索引擎-LMLPHP

wwsearch支持细粒度分表,优点如下: 1. 检索性能最优、请求延时低。 2. 无需过滤冗余数据,资源消耗最小,服务能保持很强的稳定性。

04-03 17:15