深入 Elasticsearch(17):两种搜索引擎的设计选择
上一篇解决了生产运维——分层监控、扩缩容和故障排查。这篇作为系列收尾,回答一个经常被问到的问题:为什么选 Elasticsearch 而不是 Solr(或反过来)。
Elasticsearch 和 Solr 都基于 Apache Lucene。核心搜索能力——倒排索引、BM25 打分、文本分析——本质上相同,因为它们共享同一个底层引擎。差异在于分布式架构、配置哲学、生态绑定和许可协议这些"Lucene 之上"的设计选择。
本文不下"谁更好"的结论,而是给出一个选择框架。
共同基础:Apache Lucene
两者都基于 Lucene 构建。以下能力在两者中本质相同:
- 倒排索引(FST + Posting List)
- BM25 打分
- Analyzer(Character Filter → Tokenizer → Token Filter)
- Doc Values(列式存储,用于排序/聚合)
- BKD-tree(数值和地理范围查询)
- Segment 不可变 + 后台 merge
理解了 Lucene(本系列第 02 篇),两个搜索引擎的搜索能力就理解了大半。差异在于 Lucene 之上的封装。
差异一:分布式架构
| 维度 | Elasticsearch | Apache Solr |
|---|---|---|
| 分布式模式 | 原生内置 | SolrCloud 模式(依赖 ZooKeeper) |
| 协调机制 | 自选举 master(类 Raft,≥7.x) | ZooKeeper 外部协调 |
| 配置存储 | Cluster state(master 管理) | ZooKeeper ZNode |
| Shard 路由 | 内置哈希路由 | 内置哈希路由 |
| 运维依赖 | 只需 ES 节点 | 需要独立 ZooKeeper 集群 |
ES 的分布式能力是从第一天开始设计的。集群发现、master 选举、shard 分配、replica 同步都是内置功能。
Solr 的分布式能力通过 SolrCloud 模式实现,依赖外部 ZooKeeper 集群做协调。这意味着运维 Solr 集群需要同时运维 ZooKeeper 集群。对已有 ZooKeeper 基础设施的团队来说这不是问题,对从零搭建的团队来说是额外的运维负担。
两者的架构差异集中在协调层——ES 自治,Solr 外挂:
graph TB
subgraph ES["Elasticsearch 集群"]
EM[Master 节点<br/>自选举 / cluster state] --> ED1[Data 节点 1]
EM --> ED2[Data 节点 2]
EM --> ED3[Data 节点 3]
end
subgraph Solr["SolrCloud 集群"]
ZK[ZooKeeper 集群<br/>外部协调 / 配置存储] --> SD1[Solr 节点 1]
ZK --> SD2[Solr 节点 2]
ZK --> SD3[Solr 节点 3]
end
style EM fill:#4a90d9,color:#fff
style ZK fill:#e6a23c,color:#fff
ES 的运维依赖只有 ES 节点本身;Solr 集群必须同时保证 ZooKeeper 集群的可用性。
差异二:配置哲学
| 维度 | Elasticsearch | Apache Solr |
|---|---|---|
| API 风格 | RESTful JSON | RESTful(混合 XML/JSON) |
| Schema 定义 | Mapping(JSON,支持 dynamic) | schema.xml / managed-schema(XML) |
| 默认行为 | Convention over configuration | 显式配置 |
| 配置变更 | REST API 动态修改 | 需修改配置文件或用 Config API |
ES 倾向于"合理的默认值"——创建 index 不需要预定义 mapping,dynamic mapping 自动推断字段类型。这降低了入门门槛,但也带来了动态推断的类型陷阱(前面第 03 篇讨论过)。
Solr 倾向于"显式配置"——schema 需要预先定义,字段类型需要显式声明。这在大型项目中提供了更好的可控性,但入门门槛更高。
差异三:实时性
| 维度 | Elasticsearch | Apache Solr |
|---|---|---|
| 近实时搜索 | refresh_interval 默认 1 秒 | soft commit + hard commit |
| 可见性模型 | Refresh 生成新 segment | Soft commit 打开新 searcher |
| 持久化模型 | Translog + Flush | Transaction log + Hard commit |
两者的 NRT(near-real-time)机制在概念上相似——都是先写入内存,定期生成新的可搜索 segment。ES 默认 1 秒 refresh,Solr 的 soft commit 间隔需要手动配置。
差异四:聚合与分析
| 维度 | Elasticsearch | Apache Solr |
|---|---|---|
| 聚合框架 | Aggregation(bucket/metric/pipeline) | Facet + JSON Facet API |
| 嵌套聚合 | 原生支持多层嵌套 | JSON Facet API 支持嵌套 |
| 近似聚合 | cardinality (HLL++), percentiles (t-digest) | 有限 |
| Pipeline 聚合 | 支持(derivative, moving_avg 等) | 不支持 |
ES 的 Aggregation 框架在灵活性和功能丰富度上领先。Solr 的传统 Facet 功能较基础,JSON Facet API 改善了这一点但仍不及 ES。
差异五:生态系统
| 维度 | Elasticsearch | Apache Solr |
|---|---|---|
| 日志分析 | ELK Stack(Logstash + Kibana + Beats) | 无内置日志生态 |
| 可视化 | Kibana(官方) | Banana(社区,活跃度低) |
| 数据采集 | Beats, Logstash, Elastic Agent | DIH (Data Import Handler) |
| APM / 可观测性 | Elastic APM, Observability suite | 无 |
| 机器学习 | ML 节点(Platinum license) | 无内置 |
| 向量搜索 | kNN search, ELSER | 有限支持 |
ELK Stack 是 ES 在日志分析和可观测性领域占据主导地位的关键原因。Kibana 的可视化和仪表盘能力远超 Solr 生态的替代品。
差异六:License
这是一个有深远影响的差异:
| 版本/分支 | License |
|---|---|
| Elasticsearch < 7.11 | Apache License 2.0 |
| Elasticsearch ≥ 7.11 | SSPL + Elastic License(双许可) |
| Apache Solr | Apache License 2.0 |
| OpenSearch(AWS fork) | Apache License 2.0 |
2021 年 Elastic 将 Elasticsearch 和 Kibana 的许可从 Apache 2.0 改为 SSPL(Server Side Public License)+ Elastic License 双许可。SSPL 要求任何以 SaaS 方式提供 Elasticsearch 服务的厂商必须开源其整个服务栈。
这一变更直接导致 AWS fork 出 OpenSearch(基于 ES 7.10),保持 Apache 2.0 许可。
对最终用户的影响:
- 自建部署:Elastic License 允许免费使用,不受 SSPL 限制。
- 作为 SaaS 提供给第三方:需要评估 SSPL 的约束。
- 需要纯 Apache 2.0 许可:考虑 OpenSearch 或 Solr。
选择框架
不是"谁更好",而是"哪个更适合"。按项目的核心需求走决策路径:
flowchart TD
Q1{核心需求?} -->|日志/可观测性| ES1[Elasticsearch<br/>ELK 生态成熟]
Q1 -->|全文搜索| Q2{License 约束?}
Q1 -->|复杂聚合分析| ES2[Elasticsearch<br/>Aggregation 框架强]
Q2 -->|必须 Apache 2.0| Q3{已有 ZK 集群?}
Q2 -->|无限制| Q4{团队规模?}
Q3 -->|是| Solr1[Solr<br/>复用 ZK 基础设施]
Q3 -->|否| OS[OpenSearch<br/>Apache 2.0 + 原生分布式]
Q4 -->|小团队/快速上手| ES3[Elasticsearch<br/>约定优于配置]
Q4 -->|大团队/需要显式控制| Either[两者都行<br/>按团队技术栈选]
style ES1 fill:#4a90d9,color:#fff
style ES2 fill:#4a90d9,color:#fff
style ES3 fill:#4a90d9,color:#fff
style Solr1 fill:#50b86c,color:#fff
style OS fill:#e6a23c,color:#fff
下表展开各场景的对比:
| 场景 | 倾向 | 原因 |
|---|---|---|
| 日志分析 / 可观测性 | ES | ELK 生态成熟,开箱即用 |
| 传统企业搜索(电商、CMS) | 两者都行 | 搜索核心能力相当 |
| 已有 ZooKeeper 基础设施 | Solr 可能更自然 | 复用现有协调层 |
| 需要复杂聚合分析 | ES | Aggregation 框架更强 |
| 需要 Apache 2.0 许可 | Solr 或 OpenSearch | ES 已非 Apache 2.0 |
| 小团队快速上手 | ES | 默认配置合理,API 友好 |
| 向量搜索 / RAG 集成 | ES | kNN search + ELSER |
| 深度定制搜索排序 | 两者都行 | 都基于 Lucene Similarity |
其他搜索引擎
除了 ES 和 Solr,还有几个值得了解的搜索引擎:
| 搜索引擎 | 定位 | 底层 | License |
|---|---|---|---|
| OpenSearch | ES 7.10 的 Apache 2.0 fork | Lucene | Apache 2.0 |
| Meilisearch | 轻量级即时搜索 | 自研(Rust) | MIT |
| Typesense | 轻量级搜索,API 优先 | 自研(C++) | GPL-3.0 |
| Zinc | ES 兼容的轻量替代 | Bluge(Go) | Apache 2.0 |
| Manticore Search | Sphinx 的 fork | 自研(C++) | GPL-2.0 |
这些引擎在特定场景有各自的优势(如 Meilisearch 的毫秒级 typo-tolerant 搜索、Typesense 的简单部署),但在功能丰富度和生态成熟度上距离 ES 和 Solr 有差距。
模式提炼:搜索引擎的三个设计轴
1 | |
工程迁移表
| 维度 | Elasticsearch | Solr | OpenSearch | Meilisearch | Typesense |
|---|---|---|---|---|---|
| 底层引擎 | Lucene | Lucene | Lucene | 自研 (Rust) | 自研 (C++) |
| 分布式 | 原生内置 | SolrCloud + ZK | 原生内置 | 无(单节点) | 内置 Raft |
| API | JSON REST | XML/JSON REST | JSON REST (ES 兼容) | JSON REST | JSON REST |
| 聚合 | Aggregation 框架 | Facet + JSON Facet | Aggregation(同 ES) | 有限 facet | 有限 facet |
| 生态 | ELK Stack | DIH, Banana | OpenSearch Dashboards | 轻量独立 | 轻量独立 |
| License | SSPL + Elastic | Apache 2.0 | Apache 2.0 | MIT | GPL-3.0 |
常见误解
误解一:ES 比 Solr 搜索更快。 两者底层都是 Lucene,核心搜索性能相当。性能差异更多来自配置调优而不是引擎本身。
误解二:Solr 已经过时了。 Solr 仍在积极开发,有活跃的 Apache 社区。在传统企业搜索领域(图书馆系统、CMS、电商目录搜索)有大量成熟部署。
误解三:OpenSearch 和 ES 完全兼容。 OpenSearch 从 ES 7.10 fork,之后独立发展。两者的 API 在基本操作上兼容,但新特性和高级功能已经分化。
系列回顾
本系列从倒排索引出发,用 18 篇文章逐层展开了 Elasticsearch 的核心机制:
1 | |
贯穿系列的主线是:Elasticsearch 是一个以倒排索引为核心数据结构的分布式搜索与分析引擎。mapping、analysis、shard、replica、aggregation 五个机制围绕这个数据结构逐层展开。理解了这个结构,就能把 ES 的各种行为和配置归因到对应的层次上。
系列导航
| 上一篇 | 下一篇 |
|---|---|
| 生产运维:集群扩缩、监控指标与故障排查 | —(系列完结) |
参考资料
- Elasticsearch 官方文档
- Apache Solr 官方文档
- OpenSearch 官方文档
- Elastic License 2.0 FAQ
- Clinton Gormley, Zachary Tong. Elasticsearch: The Definitive Guide. O’Reilly.
- Doug Turnbull, John Berryman. Relevant Search. Manning, 2016.
