ElasticSearch 常见用法
一、ElasticSearch 整体介绍
1.1 是什么
ElasticSearch(简称 ES)是分布式、RESTful 风格的全文搜索引擎,底层基于 Lucene。
- Lucene:底层检索库,只提供 jar 包,复杂,不支持分布式
- ES:对 Lucene 封装,提供 HTTP‑REST API、Java 客户端,开箱即用,天然分布式集群。
适用场景:全文检索、日志分析(ELK 栈)、商品搜索、APP 检索、日志埋点、数据分析。 不适合:大量实时更新、强事务、高频写入。
1.2 ES 核心概念图解(面试必背,可手画)
ES7.x 之后:移除 Type,一个索引就对应一个 type,一个索引就是一堆文档
plaintext
【集群 Cluster】 ├─节点 Node1(主节点/数据节点) │ ├─索引 Index(类比Mysql数据库 database) │ │ ├─分片 Shard(分片,分为主分片primary、副本replica) │ │ │ └─段 Segment(Lucene底层,不可修改) │ │ └─文档 Document(类比mysql row行,json格式) │ │ └─字段 Field(类比mysql column列) ├─节点 Node2 └─节点 Node3表格
| ES7.x 概念 | MySQL 类比 |
|---|---|
| Cluster 集群 | 数据库实例 |
| Index 索引 | Database 数据库 |
| Document 文档 | Row 一行数据 |
| Field 字段 | Column 列 |
| Mapping 映射 | Table 表结构(字段类型、分词器) |
| Shard 分片 | 分库分表 |
| Replica 副本 | 备份 |
⚠️ES7 重要变化:
- Type 被废弃,一个索引只有一个虚拟
_doc类型,不要再写自定义 type- 主分片数创建索引后不可修改,副本数可以随时修改。
1.3 分片原理图解(面试高频)
plaintext
索引创建:3主分片,1副本,共6个分片 Primary(主分片): P0 P1 P2 Replica(副本): R0 R1 R2 集群3个节点部署: Node1: P0 R1 Node2: P1 R2 Node3: P2 R0 规则: 1. 主分片和它的副本**不能放在同一个节点**(节点宕机,副本失效) 2. 写请求只写到【主分片】,同步复制到副本 3. 读请求:可以读主分片,也可以读副本,负载均衡 4. 主分片数量索引创建完不能修改!只能重建索引迁移数据- 主分片:数据真实写入,处理写请求;
- 副本分片:备份,分担读压力,主分片挂掉,副本升级为主分片,保证高可用。
1.4 倒排索引(核心!面试必考)
ES 底层靠倒排索引实现极速全文检索,正排索引就是普通数据库。
正排索引(Mysql)文档 ID → 完整内容
plaintext
doc1: "小米手机很好用" doc2: "华为手机性价比高" doc3: "小米手机性价比高"倒排索引 ES分词词条 → 关联文档 ID 列表
表格
| Term 词条 | 文档 ID |
|---|---|
| 小米 | doc1,doc3 |
| 手机 | doc1,doc2,doc3 |
| 华为 | doc2 |
| 性价比 | doc2,doc3 |
| 好用 | doc1 |
流程:
- 文档写入 ES,经过分词器 Analyzer 拆分成词条 term;
- 构建倒排索引表;
- 查询的时候,把查询语句分词,去倒排索引匹配 term,快速拿到文档 id,再拿完整文档。
关键点:
- Term:分词后的最小单元;
- 分词器 Analyzer:包含字符过滤器、分词器、token 过滤器;
- 中文推荐分词器:
ik_max_word(细粒度)、ik_smart(粗粒度)。
1.5 写入流程图解(面试必问)
plaintext
客户端写请求 → 协调节点Coordinating Node ↓ 1. 通过文档id hash路由,算出该文档落到哪个主分片 ↓ 2. 请求转发到对应的主分片节点 ↓ 3. 主分片执行写入,写入内存buffer + translog事务日志(防止宕机丢数据) ↓ 4. 主分片把写请求同步给所有副本分片,副本写入成功 ↓ 5. 所有副本返回成功 → 主分片返回成功给协调节点 → 返回客户端补充两个重要概念:
- refresh:内存 buffer → 生成 segment 放到文件系统缓存,此时可以被搜索,默认 1 秒刷新。近实时 NRT,不是完全实时。
- flush:把内存数据持久化到磁盘,清空 translog。
- translog:类似 mysql redo log,宕机恢复数据。
面试常问:为什么 ES 写入不是实时?默认 1s refresh,写入后 1 秒后才能搜到。想要强实时可以手动 refresh,性能会暴跌。
1.6 查询流程图解
plaintext
客户端搜索请求 → 协调节点 1. 协调节点把查询转发给该索引**所有主/副本分片** 2. 每个分片本地执行检索,返回文档id+打分_score给协调节点 3. 协调节点合并各个分片返回结果,全局排序、分页 4. 根据文档id,去各个分片拉取完整文档数据 5. 返回最终结果给客户端1.7 ES 的打分机制
默认 BM25 算法(7.x 默认,替代旧的 TF‑IDF),计算词条和文档相关性得分_score。
二、SpringBoot + ElasticSearch 完整样例
版
