中间件速查手册
搜索引擎 · elasticsearch

Elasticsearch

基于倒排索引的搜索与分析引擎,搜得准排得快

搜索引擎SSPL-1.0 / Elastic LicenseJava学习难度:中等

Elasticsearch 建在 Lucene 之上,把文本切成词、建立“词 → 文档”的倒排索引,所以能在亿级文档里毫秒级返回相关结果。它同时是个分布式系统:索引被切成主分片和副本分片散在多个节点上,扩容只需加机器。

01

它解决什么问题

MySQL 的 like '%手机%' 在千万级数据上要扫全表,还不支持分词、同义词、相关性排序。

真实场景:典型场景:电商搜索框输入“无线蓝牙耳机”,ES 分词后匹配标题、类目、品牌,再按相关性和销量排序,20ms 返回结果。

02

核心概念

每个概念一句话 + 一个类比。点击卡片看更详细的解释。

03

数据流转动画

跟着步骤看一条数据从进入系统到被处理完的完整路径,可以暂停、重播和调速。

Flow animation

一次搜索在分片间的分布与执行

客户端搜索“蓝牙耳机”协调节点query → fetchP0 主分片文档 1-5000P1 主分片文档 5001+R0 副本P0 的拷贝合并排序返回 Top 10

← 左右滑动查看完整流程图 →

01 / 05
1. 请求到达协调节点

客户端把查询发给任意节点,这个节点本次担任协调节点。

提示:写请求先到主分片再同步副本;查询是 scatter-gather,协调节点负责合并排序。 悬停图中的节点可以看概念解释。

04

优劣势

短句说清适合什么、不适合什么,选型时先看这一栏。

适合什么
  • 全文检索、分词、相关性排序能力强
  • 水平扩展简单,加节点自动分片均衡
  • 聚合分析快,日志场景的事实标准(ELK)
  • 近实时搜索,写入 1 秒后可见
不适合什么
  • 不是数据库,事务和强一致能力弱
  • 内存和磁盘开销大,运维成本高
  • 分片数建索引时定死,改要 reindex
  • 深分页(from+size)性能急剧下降
05

常见使用场景

每个场景都配一句「为什么用它」。

01

站内搜索

商品、文章、视频的搜索框,支持分词、纠错、同义词。

为什么用它:倒排索引 + 相关性打分,MySQL 的 like 做不到。

02

日志检索与可观测

Filebeat 采集日志进 ES,Kibana 查询和做看板。

为什么用它:按时间范围 + 关键词检索亿级日志,秒级响应。

03

聚合分析

按地区、品类做多维统计和趋势分析。

为什么用它:聚合框架在分片内并行计算,比 SQL group by 快得多。

07

常见问题

上手第一个月最容易卡住的地方。

Q1分片和副本怎么设?

单分片建议 10~50GB,按数据总量除以这个区间估算主分片数,副本至少 1。分片不是越多越好,每个分片都有固定开销,几百个小分片反而拖慢集群。

Q2为什么 ES 搜得快?

倒排索引把“找包含某词的文档”变成一次词表查询;查询在多个分片上并行;结果只需要 Top N,用堆归并。相反,MySQL 的 like 需要逐行扫描。

Q3和 MySQL 怎么配合?

MySQL 存权威数据,ES 存检索副本。写入 MySQL 后通过 binlog(Canal)或双写同步到 ES,接受秒级延迟。绝不要把 ES 当唯一数据源。

Q4深分页为什么慢?

from=10000 需要每个分片都取 10010 条再归并。用 search_after + 排序游标替代,或者限制用户只能翻前 100 页。