本文基于 2026-01-30 的最新 commit 和版本:
- Doris Commit: 4a37aec7d25362a91f
- Doris Clucene commit: ac9475a6a61d371
当 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 在处理复杂、多关键词查询时依然能保持低延迟的关键。
- Easysearch 底层的 Lucene 引擎,不仅在索引时存储了 BMW 算法所需的信息(如
- 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,是选择一个“专业”的搜索服务来驱动你的核心业务。





