📣 极限科技诚招搜索运维工程师(Elasticsearch/Easysearch)- 全职/北京 👉 : 立即申请加入

本文基于 2026-01-30 的最新 commit 和版本:

当 OLAP 遇到搜索:Easysearch vs. Doris 倒排索引实现深度剖析 #

在数据技术融合的今天,我们看到一个有趣的趋势:OLAP(在线分析处理)引擎正在集成搜索引擎的能力,而搜索引擎也在不断增强其分析功能。Apache Doris,作为一款顶级的实时 OLAP 数据库,其内置的倒排索引功能,为用户在分析数据时提供了文本检索的便利。

但这自然引出一个问题:对于搜索密集型场景,Doris 的倒排索引能否替代像 Easysearch 这样专业的搜索引擎?

答案不能只看宣传,必须深入代码。本文将基于对两者倒排索引实现的静态分析,从查询优化、索引结构、功能灵活性和扩展性等多个维度,进行一场硬核的技术对决。

1. 查询性能的核心:谁真正实现了“智能跳跃”? #

在海量数据中,查询的快慢,很大程度上取决于搜索引擎能否“跳过”不必要的计算。Block-Max WAND (BMW) 算法正是为此而生的“智能跳跃”技术,它能让搜索引擎在遍历倒排链表时,提前裁剪掉大量不可能进入最终 Top N 结果的文档,从而实现数量级的性能提升。

  • Easysearch (Lucene): 完整实现
    • Easysearch 底层的 Lucene 引擎,不仅在索引时存储了 BMW 算法所需的信息(如 maxBlockFreq),更在查询执行时,完整地利用了这些信息来进行 early termination 剪枝优化。这是 Easysearch 在处理复杂、多关键词查询时依然能保持低延迟的关键。
  • Doris (CLucene): “半成品”的优化
    • 通过代码分析,我们发现 Doris 的 CLucene 实现,虽然在索引结构中存储了实现 BMW 所需的元信息,但在查询链路中,并未使用这些信息进行剪枝
    • 尽管最新的 Commit Message 提到了 BMW 优化,但它仅限于写入部分,查询的核心受益部分尚未实现。
    • 结论:在查询延迟上,尤其是在匹配结果集较大的场景下,Easysearch 将凭借成熟的 BMW 优化,展现出远超 Doris 的性能优势。

2. 架构差异:并行度 vs. 实例效率 #

两者的底层架构也揭示了不同的设计哲学。

  • Doris: 高并行度模型 (一 Segment 一实例)
    • Doris 为其 Tablet(数据分片)中的每一个 Segment 都创建一个独立的 Lucene 实例。这意味着一个查询可以并行地在多个 Lucene 实例上执行。理论上,这提供了更高的查询并行度。
  • Easysearch: 高效率模型 (一 Shard 一实例)
    • Easysearch 为一个 Shard (通常包含多个 Segment) 创建一个 Lucene 实例。查询在一个 Shard 内部是顺序地扫描所有 Segment 的。
    • 综合评判:虽然 Doris 的模型在理论上并行度更高,但考虑到其 Lucene 实例缺乏 BMW 等核心优化,这种并行优势很可能被单实例的低效所抵消。Easysearch 的模型虽然是 shard 内串行,但其单个 Lucene 实例的查询效率极高,且 shard 间的查询是并行的,这在真实世界中通常是更优的设计。

3. 功能完备性:细节决定搜索体验 #

一个专业的搜索引擎,不仅要搜得到,还要搜得好、看得清。在索引信息的存储和使用上,两者的差距尤为明显。

3.1 结果高亮:专业搜索的“必需品” #

  • Easysearch: 支持。通过灵活的 index_options,可以配置索引存储 Term 的 offsets (偏移量) 信息,这是实现高性能搜索结果高亮的基石。
  • Doris: 不支持。Doris 的倒排索引设计中,无法存储 Term 的 offsets 信息,这意味着它从根本上无法实现搜索结果高亮。对于任何面向用户的搜索场景,这都是一个致命的短板。

3.2 索引选项:灵活与固化的对决 #

  • Easysearch: 高度灵活。提供了四级 index_options,让用户可以根据场景需求,在索引大小和功能之间做精细的权衡:
    • docs (仅文档 ID)
    • freqs (文档 ID + 词频)
    • positions (ID + 词频 + 位置,用于短语搜索)
    • offsets (ID + 词频 + 位置 + 偏移量,用于高亮)
  • Doris: 相对固化。仅通过一个 support_phrase 布尔参数来控制,只有两种选择:
    • false: 存储文档 ID。
    • true: 存储文档 ID + 词频 + 位置。

结论:Easysearch 提供了专业级的索引控制能力,让运维人员可以为不同场景(如日志、产品搜索)优化存储成本和查询性能。Doris 的选择则更为简化,牺牲了大量高级功能。

4. 扩展与易用性:生态决定上限 #

4.1 分词器生态:开放与封闭的差异 #

  • Easysearch: 开放生态
    • 数量:拥有超过 15 种内置及插件分词器,覆盖多语言和特定场景。
    • 扩展性:支持自定义分词插件。开发团队可以打包自己的分词器 JAR 包,通过插件管理命令安装。
  • Doris: 封闭生态
    • 数量:仅有 4 种内置分词器。
    • 扩展性:添加新的分词器需要重新编译 BE 端的 C++ 代码。这不仅技术门槛高,而且在生产环境中几乎不可行,极大地限制了其在复杂中文或多语言场景下的应用。

4.2 查询语法:便利性的细微差别 #

  • Easysearch: 允许在查询中直接对 _score (相关性得分) 进行过滤,例如 min_score: 1.5,可以方便地剔除低质量的匹配结果。
  • Doris: 不允许在 WHERE 子句中直接使用 score() 函数进行过滤。虽然可以通过 Common Table Expressions (CTE) 嵌套一层 SELECT 来绕过,但这无疑增加了 SQL 的复杂度和开发者的心智负担。

总结:便利的“附加项” vs. 专业的“核心能力” #

对比维度Doris 倒排索引Easysearch核心差异
查询优化 (BMW)未实现查询端剪枝完整实现Easysearch 查询延迟更低
结果高亮不支持支持Easysearch 功能完备
索引灵活性两种固化选项四级可配置Easysearch 可优化性强
分词器生态4种,需编译扩展15+种,支持插件拓展Easysearch 运维友好,场景适应性强
Score 过滤需 CTE 绕过原生支持Easysearch 查询更便捷
架构并行度segment 间并行shard 间并行Doris 虽理论并行度更高,但单点效率低

最终结论:

Doris 的倒排索引,是其作为一款 OLAP 引擎,为了提升文本分析便利性而提供的一个强大的“附加功能”。它非常适合那些数据已在 Doris 中、需要进行简单文本过滤和匹配的 OLAP 场景。它最大的优势是“零 ETL”,让用户可以在一个系统内完成分析和初步的文本检索。

然而,如果你的业务是以搜索为核心,需要低延迟的查询、精准的相关性排序、丰富的搜索功能(如高亮、短语搜索、动态分词)以及面向用户的友好体验,那么 Easysearch 作为专业的搜索引擎,是毫无疑问的更优选择

两者并非绝对的替代关系,而是针对不同问题域的解决方案。选择 Doris,是选择将搜索能力“融入”你的分析平台;选择 Easysearch,是选择一个“专业”的搜索服务来驱动你的核心业务。