elastic/elasticsearch:77k Stars 的搜索分析引擎,今天为什么还在 Trending
posts posts 2026-07-03T20:57:00+08:00ES 9.x 主线判断:BBQ 成为默认量化、ES|QL 补全检索能力、Lucene 10 底座、2026 年全列式 metrics 引擎,以及该不该上 ES 的边界。版本线已按 Elastic 官方发布记录校正。技术笔记向量搜索范围说明:Elasticsearch 是一个 Star 数超过 6 万、体积约百万行级 Java 的开源项目。本文不展开 ES 教程,也不复述入门 CRUD。只回答三件事:它今天为什么仍值得看、9.x 主线到底改了什么、采用边界在哪里。文中的版本号与发布时间取自 Elastic 官方发布公告与官方文档。
一、先给判断
Elasticsearch 是一个「过了明星期、但仍是基础设施级」的仓库。它频繁出现在 GitHub Trending,通常不是因为出现爆款新功能,而是对应两类信号:重大版本发布,以及生态里程碑(新查询语言 GA、底层 Lucene 升级)。把这两类信号拆开看,判断就清楚了。
我的结论是:ES 没有转入维护期,正处在「搜索 + 分析 + 向量 + 可观测」四条线同步推进的阶段。理由如下:
- 向量搜索成为默认能力:BBQ(Better Binary Quantization)量化在 9.1 起成为高维密集向量的默认方案,
semantic_text字段类型把「文本 → embedding → 检索」收敛成一步。 - ES|QL 从分析走向检索:这套管道式查询语言 8.14 GA,9.x 补上了全文检索、语义检索、混合检索与相关度排序,不再只是聚合工具。
- metrics 引擎列式化:2026 年的 9.4 把时序指标存储改成了全列式引擎,这会让「ES 只是搜索引擎」的旧认知过时。
这三点合在一起,才是它持续占据 Trending 的真实原因。
二、项目地图:核心模块构成
Elasticsearch 是一个用 Java 编写、Gradle 构建的仓库,内部按职责切成多个模块:
| 模块 | 职责 | 关键依赖 |
|---|---|---|
server | 节点启动、集群协调、shard 分配 | Netty、Apache Lucene |
modules/ingest-* | 数据预处理 pipeline | Grok、GeoIP、CSV |
modules/mapper-* | 字段类型映射 | Lucene 倒排索引 |
x-pack | 安全、机器学习、监控 | Bouncy Castle、OpenJDK |
libs/core | 工具类与公共抽象 | SLF4J、Apache Commons |
distribution/ | 构建产物(tar、deb、rpm、docker) | Gradle |
关于许可证要说清楚,这里常被误解。ES 在 2010 年开源时采用 Apache 2.0;2021 年的 7.11 版本把源码改成 SSPL + Elastic License 2.0 双许可(默认发行版一直走 Elastic License 2.0);2024 年 9 月又增加了 AGPLv3 作为可选项。所以「ES 基础搜索能力完全开源」这个说法并不准确——默认发行版整体落在 Elastic License 2.0 之下,只是源码可见。2021 年这次授权收紧,也是 AWS 另起炉灶 fork 出 OpenSearch 的直接原因。
三、先说原理:凭什么它能「什么都做」
在讲 9.x 之前,值得花半分钟理解 ES 的基础设施。因为它最近几年的方向——把全文检索、聚合分析、向量检索、时序存储放在同一个索引里——全部建立在这些底子上。
- 倒排索引(inverted index):写入时先由分析器(analyzer)分词,再建一张「词 → 文档列表」的倒排表。查询时直接查词表,不必扫全量文档。这是全文检索比 Like 快几个数量级的原因。
- BM25 相关度评分:搜索结果按「词频 × 逆文档频率」打分排序,而不是按出现次数线性排。理解这一点,才能解释为什么 ES 默认排序往往「符合直觉」。
- 近实时(near-real-time):新写入的数据先进内存 segment,默认约每秒 refresh 一次才可被搜到;落盘靠 translog,后台再合并 segment。它追求的是「秒级可见 + 高吞吐」,而不是关系库那种「提交即持久」的强一致。
- shard 与 replica:一个索引切成若干分片水平分布,每个分片有副本。集群健康 green / yellow / red,对应「全佳 / 缺副本 / 不可恢复」。
这几件事决定了 ES 的使用边界:它擅长分析与检索吞吐,代价是写入可见有延迟、不是强一致事务库——后面「采用边界」一节会回到这点。
四、9.x 主线:4 个值得知道的方向
先给一条被很多文章写错的时间线。ES 的 9.x 始于 2025 年:9.0 于 2025 年 4 月发布,构建在 Lucene 10 之上(网上流传的「9.0 在 2024-04」是错的,那一年 8.15 才刚把 semantic_text 带进来)。随后 9.1(2025 年中)把 BBQ 设为高维向量默认量化并引入 ACORN;2026 年上半年发布的 9.4 完成了 metrics 引擎的列式化重构。节奏是一年一个大版本,而不是某些资料里写的「6 个月一次」——8.x 时代才是小版本高频迭代。
1. 向量搜索从「加装」变成「一等公民」
- BBQ 量化默认化:BBQ 把
float32向量按维度压成 1 bit,配合每向量 14 字节的校正数据,内存大约降到 1/32,同时靠预计算的校正因子保住检索质量。9.0 里高维向量默认还是int8_hnsw,9.1 起对≥384 维的float/bfloat16向量,默认就自动套 BBQ + HNSW。它要求至少 64 维,对文本 embedding 效果最好。 - 带过滤的向量检索:HNSW 做过滤向量检索时,朴素做法会在图上继续遍历不满足过滤条件的节点,导致慢。9.1 引入的 ACORN-1 把过滤条件融进图遍历,只评估能通过过滤的节点,官方实测典型查询提速约 5 倍。
semantic_text字段类型:这是 ES 8.15(2024-08)引入、2025-03 GA 的能力。它的意义是省掉一整条手工链路——不用再自己配 ingest pipeline、手动调 embedding 模型、自己管理向量字段。只需声明一个semantic_text字段并指定inference_id,写入与查询时 ES 自动调用内置的multilingual-e5-small推理端点生成向量,还能按需开 BBQ 量化。
对 RAG 应用这几点很关键:之前「文本 → embedding → 写入 ES」要自己拼,现在 ES 内置了;之前向量检索要么吃满内存、要么精度滑坡,BBQ + 14 字节校正在两者之间给了个默认解;之前「按过滤条件找相似」糊在一层,ACORN 把这一层也做掉了。
2. ES|QL:从分析语言走向检索语言
ES|QL(Elasticsearch Query Language)是 8.11 引入、8.14(2024 年)GA 的管道式查询语言,目标是把「比 DSL 易读、比 SQL 原生」落到一套管道里。它最初面向日志、指标这类时序分析,9.x 阶段补上了检索能力:
FROM books METADATA _score
| WHERE match(title, "Shakespeare")
| SORT _score DESC
| LIMIT 10值得关注的能力:
- 聚合:
STATS替代 DSL 里的aggregations - 补字段:
ENRICH,用查找表给文档补属性 - 跨索引连接:
LOOKUP JOIN,9.x 还支持远程集群 - 全文与语义检索:
match()/qstr、对semantic_text的语义搜索,以及带权重的混合检索 - 相关度排序:用
METADATA _score拿到评分再SORT _score DESC
也就是说,ES|QL 现在能在一个管道里做「BM25 全文 + 向量召回 + 语义检索」的混合查询,不一定要回到 Query DSL 拼多个 API。对新的查询,把它作为首选是合理的;老 DSL 可以逐步迁。
3. Lucene 10 底座升级
ES 9.0 把底层 Lucene 升到 10.x。对用户而言 API 不变、基本无感,但底层换来的是改进的并行处理、更聪明的索引方式与硬件级优化。这是「无感但有收益」的一类升级,不必深追内部结构,知道它顺带带来整体性能提升就够了。
4. 聚合优化 + 2026 年的列式 metrics 引擎
聚合层面,composite 等分页聚合和 date_histogram 时区处理在 9.x 有持续优化,主要利好大规模聚合(上百万 bucket 的场景)。
但 2026 年最值得知道的是另一件事:9.4 把时序指标(TSDS)存储重构成了全列式引擎。官方给出的数据是:每条数据点从约 25 字节降到 3.75 字节(约 6.6× 存储节省),时间序列查询快约 160×,并且原生支持 PromQL 与 OpenTelemetry 摄入。同版本的向量侧也有进展——通过 NVIDIA cuVS 做 GPU 加速向量索引(索引吞吐约 12×),BBQ 的 disk 变体让高过滤性查询的延迟降低约 3×。
这不再是「搜索引擎的小修补」,而是把 ES 推成「日志、指标、全文、向量同一平台」的信号。如果你只用它做数据库搜索,这些和你无关;如果你把它当可观测 + 检索的底座,这几点值得重看。
五、采用边界
适合
- 搜索 + 分析混合场景:电商搜索、日志分析、应用监控
- RAG / 向量检索:pgvector 不够用、需要更完整向量 + 混合检索时的升级路径
- 多模检索:全文 + 向量 + 聚合在一个索引里处理
- 需要强聚合:nested / pipelined aggregation
- 可观测与检索共用一套平台:9.4 列式指标 + ES|QL 之后,指标、日志、检索能收在一处
- 运维成熟:它需要专门的集群运维能力
不太适合
- 极简搜索:Meilisearch、Typesense 轻很多,几分钟能起,不用管 JVM
- 强一致事务:ES 不是事务数据库,跨文档事务不支持
- 数据全留内存的小数据集:为省载体直接上轻量内存型引擎更划算
- 预算敏感:JVM 堆内存建议按 50% 规则预留(堆之外还有向量索引、filesystem cache),小数据量下维护开销高于 Postgres 加全文索引
- 不想运维基础设施:直接走 Elastic Cloud,或换 Algolia / Meilisearch Cloud
升级建议
- 7.x → 8.x:7.x 已 EOL,升级有官方文档全程覆盖
- 8.x → 9.x:有 breaking changes,比如默认开安全(TLS + 认证)、映射约束收紧,需要灰度
- OpenSearch 用户:OpenSearch 是 ES 7.10 的 fork,9.x 的向量与 ES|QL 能力未必同步到了下游;OpenSearch 3.1 自己也做了
semantic字段这类对齐特性,迁移前要逐项验证
六、和 OpenSearch / Meilisearch / Typesense 的边界
| 维度 | Elasticsearch | OpenSearch | Meilisearch | Typesense |
|---|---|---|---|---|
| 许可证 | SSPL / ELv2(另有 AGPLv3 选项) | Apache 2.0 | 社区版 MIT | GPL-3.0 |
| 部署复杂度 | 高(JVM、shard、replica) | 高(同 ES) | 低(单二进制) | 低(单二进制) |
| 向量搜索 | 一等公民(BBQ / ACORN) | 支持 | 实验/有限 | 支持(受内存限制) |
| 聚合能力 | 极强 | 强 | 弱 | 弱 |
| 查询语言 | ES|QL / Query DSL | 无 ES|QL | 自有 | 自有 |
| 资源占用 | 大 | 大 | 小 | 小(索引常驻内存) |
| 适用规模 | 中大型 + 分析 | 中大型 | 中小全文 | 数据能装进内存 |
注意一个现实取舍:Typesense 的索引整体驻留内存,小数据集下极快,但数据集涨过可用内存就会变得昂贵;Meilisearch 社区版是单节点、用磁盘 + 内存映射,横向扩展要进企业版。所以「搜索 + 分析 + 向量」组合,ES 仍是当前最完整的开源方案;「纯搜索 + 数据不大」的轻量场景,才轮到另外两家。
七、起步建议
- 用 docker-compose 跑一个 3 节点集群:官方仓库有现成配置,3 节点足够验证 shard 分布与故障转移
- 先走通
semantic_text:声明字段 + 指定inference_id,用它做 RAG 的向量召回;默认内置multilingual-e5-small - 量化配置在写入前定:向量字段的
index_options(如bbq_hnsw)在 mapping 里定义,改 mapping 要重建索引,越早定越省事 - 新查询用 ES|QL:全文 / 语义 / 混合检索都能在一个管道里表达,老的 DSL 逐步迁移
- 生产环境保留默认安全配置:9.x 默认开 TLS + basic auth,别为了省事关掉
- 盯集群健康:
/_cluster/health看 status,yellow 通常是缺副本,red 是不可恢复
ES 持续出现在 Trending,本质是「稳定基础设施 + 9.x 主线演进」,不是某个爆款功能。它的演化值得跟,但它值不值得我们为自己业务引入,取决于你的场景是不是「检索 + 分析 + 向量」的混合负载——是,它很难替代;只是纯搜索,它可能过重了。
常见问题
Q:ES 还值得学吗?现在上新版本会不会很快过时? A:9.x 是持续演进的主线,每代有文档化的 breaking change。7.x 已 EOL,新项目直接上当前主线即可,不存在「刚学就过时」的问题。
Q:跑向量检索一定要 GPU 吗? A:不一定。检索本身 CPU 就能跑,BBQ 量化把内存压到约 1/32,普通机器也能做召回。GPU 的价值主要在 9.4 的 cuVS 加速索引构建,以及大规模向量写入时才显著。
Q:semantic_text 默认用哪个 embedding 模型?
A:默认内置的是 multilingual-e5-small 推理端点。如果你想换别的模型,通过 inference_id 指向自己托管或第三方的推理服务即可。
Q:ES 和 OpenSearch 到底怎么选? A:需要 ES 的 ES|QL、最新向量与列式指标能力,选 ES。如果团队在 7.10 fork 上已跑得很稳、又用不到这些新特性,留在 OpenSearch 也合理——但升级、跨能力迁移前必须逐项验证,两者的新特性并不自动对齐。
Q:单节点能直接上生产吗? A:不建议。3 节点起步,生产保留默认安全配置。单节点宕机时,分片没有冗余,且失去故障转移能力。
参与讨论
使用 GitHub 登录。欢迎补充事实、异议与实践。
讨论暂时无法加载。