上一篇解决了生产运维——分层监控、扩缩容和故障排查。这篇作为系列收尾,回答一个经常被问到的问题:为什么选 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
2
3
4
5
6
7
8
分布式策略    内置 ←————————→ 外部依赖
ES Solr (ZK)

配置哲学 约定优先 ←———————→ 显式配置
ES Solr

生态绑定 垂直整合 ←———————→ 松散集成
ES (ELK) Solr

工程迁移表

维度 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
2
3
4
5
6
7
8
9
核心抽象    00 倒排索引 → 01 集群架构
存储层 02 Lucene 内部
数据建模 03 Mapping → 04 Analysis
写入路径 05 NRT + Translog
搜索路径 06 Query-Then-Fetch → 07 BM25 → 08 Query DSL
聚合分析 09 Aggregation
分布式 10 分片路由 → 11 副本 → 12 Master 选举
生命周期 13 Merge + ILM
运维工程 14 性能模型 → 15 安全 → 16 生产运维 → 17 ES vs Solr

贯穿系列的主线是:Elasticsearch 是一个以倒排索引为核心数据结构的分布式搜索与分析引擎。mapping、analysis、shard、replica、aggregation 五个机制围绕这个数据结构逐层展开。理解了这个结构,就能把 ES 的各种行为和配置归因到对应的层次上。

系列导航

上一篇 下一篇
生产运维:集群扩缩、监控指标与故障排查 —(系列完结)

参考资料