flowchart TD
A["🔍 Elasticsearch 核心特点"] --> B["⚡ 全文检索"]
A --> C["📊 实时分析"]
A --> D["🌐 分布式架构"]
A --> E["📈 高可扩展"]
B --> B1["倒排索引\n分词器支持\n相关性评分"]
C --> C1["聚合分析\nBucket/Aggs\n数据可视化"]
D --> D1["数据分片\n副本机制\n自动负载均衡"]
E --> E1["水平扩展\n高可用\n故障转移"]
style A fill:#fff3e0
style B fill:#c8e6c9
style C fill:#c8e6c9
style D fill:#e3f2fd
style E fill:#fff3e0
为什么选择 Elasticsearch?
🌐 全球最流行的搜索引擎:在 DB-Engines 排名中稳居前三
📦 开箱即用:安装简单,配置友好
🔍 强大的搜索能力:支持全文检索、模糊匹配、短语搜索等
📊 实时分析:秒级聚合分析和数据可视化
🌐 分布式原生支持:天然支持海量数据水平扩展
🔌 丰富的客户端:支持 Java、Python、Go 等多种语言
1.2 Elasticsearch 能做什么?
应用场景
说明
典型案例
全文搜索
关键词搜索、模糊匹配、同义词搜索
电商商品搜索、站内搜索、文档检索
日志分析
集中收集、搜索和分析日志
ELK 日志系统、Splunk 替代方案
应用性能监控
监控应用指标、追踪请求链路
APM 系统、性能分析
安全分析
安全日志分析、威胁检测
SIEM 系统、入侵检测
业务分析
数据聚合分析、BI 报表
用户行为分析、运营统计
1.3 Elasticsearch vs 关系型数据库
flowchart LR
A["🏗️ 数据模型对比"] --> B["关系型数据库"]
A --> C["Elasticsearch"]
B --> B1["Database 数据库"]
B1 --> B2["Table 表"]
B2 --> B3["Row 行"]
B2 --> B4["Column 列"]
B2 --> B5["Index 索引"]
C --> C1["Index 索引\n(类似数据库)"]
C1 --> C2["Type 类型\n(ES 7.x 已废弃)"]
C2 --> C3["Document 文档\n(类似行)"]
C2 --> C4["Field 字段\n(类似列)"]
C2 --> C5["Mapping 映射\n(类似表结构)"]
style B fill:#e3f2fd
style C fill:#c8e6c9
概念对应关系:
关系型数据库
Elasticsearch
说明
Database
Index
索引,数据的逻辑容器
Table
Type(已废弃)
类型,ES 7.x 后一个 Index 就是一个 Type
Row
Document
文档,JSON 格式的基本数据单元
Column
Field
字段,文档中的键值对
Schema
Mapping
映射,定义字段类型和索引方式
SQL
Query DSL
查询 DSL,ES 的查询语言
二、核心概念与架构
2.1 核心概念详解
flowchart TD
A["📋 ES 核心概念层级"] --> B["🔢 Cluster\n集群"]
A --> C["🖥️ Node\n节点"]
A --> D["📦 Index\n索引"]
A --> E["📝 Shard\n分片"]
B --> C
C --> D
D --> E
B1["一个或多个节点\n组成集群"]
C1["单个 ES 实例\n运行在 JVM 上"]
D1["文档的逻辑容器\n包含多个分片"]
E1["分片分为主分片\n和副本分片"]
style A fill:#fff3e0
style B fill:#c8e6c9
style C fill:#e3f2fd
style D fill:#f8bbd0
style E fill:#fff3e0
2.2 Elasticsearch 集群架构
flowchart TD
A["🌐 Elasticsearch 集群架构"] --> B["Cluster\n(集群)"]
B --> C["Node 1\n(Master Eligible)"]
B --> D["Node 2\n(Data Node)"]
B --> E["Node 3\n(Data Node)"]
C --> C1["Primary Shard 0"]
C --> C2["Replica Shard 1"]
D --> D1["Primary Shard 1"]
D --> D2["Replica Shard 2"]
E --> E1["Primary Shard 2"]
E --> E2["Replica Shard 0"]
style A fill:#fff3e0
style B fill:#c8e6c9
节点类型详解:
节点类型
说明
配置
Master Node
负责集群管理、索引创建删除、分片分配
node.master: true
Data Node
存储数据、执行查询
node.data: true
Coordinating Node
接收请求、分发到数据节点
node.master: false, node.data: false
Ingest Node
数据预处理、转换
node.ingest: true
2.3 倒排索引原理
倒排索引是 ES 实现快速全文搜索的核心技术,理解它对于更好地使用 ES 至关重要。
flowchart LR
A["🔄 倒排索引原理"] --> B["📄 正向索引"]
A --> C["🔃 倒排索引"]
B --> B1["文档1:Elasticsearch 是搜索引擎"]
B1 --> B2["文档2:Elasticsearch 基于 Lucene"]
B1 --> B3["文档3:Lucene 是全文检索库"]
C --> C1["Elasticsearch → 文档1, 文档2"]
C1 --> C2["是 → 文档1"]
C2 --> C3["搜索 → 文档1, 文档3"]
C3 --> C4["Lucene → 文档2, 文档3"]
style B fill:#ffcdd2
style C fill:#c8e6c9
正向索引工作方式:
文档1 → 关键词1、关键词2、关键词3
搜索关键词1 时,需要遍历所有文档
倒排索引工作方式:
关键词1 → 文档1、文档3
搜索关键词1 时,直接定位到包含该词的文档
2.4 分词器(Analyzer)
ES 的分词器决定了文本如何被切分成词条:
flowchart TD
A["🔤 分词器工作流程"] --> B["Character Filters\n字符过滤器"]
B --> C["Tokenizer\n分词器"]
C --> D["Token Filters\n词条过滤器"]
D --> E["输出词条"]
B --> B1["去除 HTML 标签\n转换特殊字符"]
C --> C1["standard\nik_smart\nik_max_word"]
D --> D1["小写化\n同义词替换\n停用词移除"]
style A fill:#fff3e0
style B fill:#c8e6c9
style C fill:#e3f2fd
style D fill:#fff3e0
flowchart TD
A["📊 ES 聚合类型"] --> B["Bucket Aggregations\n桶聚合"]
A --> C["Metric Aggregations\n指标聚合"]
A --> D["Pipeline Aggregations\n管道聚合"]
B --> B1["terms 按字段值分桶\nrange 按范围分桶\ndate_histogram 按日期分桶"]
C --> C1["avg/sum/min/max\nstats 多统计\ncardinality 基数"]
D --> D1["parent_bucket\nsibling_bucket"]
style A fill:#fff3e0
style B fill:#c8e6c9
style C fill:#c8e6c9
style D fill:#e3f2fd
flowchart LR
A["📦 分片机制"] --> B["Primary Shard\n主分片"]
A --> C["Replica Shard\n副本分片"]
B --> B1["处理读写请求\n数量创建后不可变"]
C --> C1["主分片的数据副本\n提供高可用"]
style B fill:#c8e6c9
style C fill:#e3f2fd
分片数量的选择建议:
数据量
推荐分片数
说明
< 10GB
1-2
小数据集
10-50GB
3-5
中等数据集
50-100GB
5-10
大数据集
> 100GB
根据节点数决定
通常 20-30GB/分片
7.2 数据写入流程
flowchart LR
A["✍️ 数据写入流程"] --> B["客户端请求"]
B --> C["协调节点"]
C --> D["主分片"]
D --> E["同步到副本"]
E --> F["返回成功"]
style A fill:#fff3e0
style C fill:#c8e6c9
7.3 数据一致性级别
级别
说明
性能
consistency=one
主分片和至少一个副本确认
较快
consistency=quorum
半数以上分片确认
中等
consistency=all
所有副本确认
较慢
八、Spring Boot 集成 ES
8.1 添加依赖
1 2 3 4 5
<!-- Spring Data Elasticsearch --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-elasticsearch</artifactId> </dependency>
flowchart LR
A["📊 ELK Stack 架构"] --> B["Logstash/Beat\n日志收集"]
B --> C["Elasticsearch\n存储 + 检索"]
C --> D["Kibana\n可视化分析"]
B --> B1["Filebeat 日志文件收集"]
B1 --> B2["Logstash 数据处理"]
B2 --> B3["Kafka 消息队列(可选)"]
B3 --> C
style A fill:#fff3e0
style B fill:#c8e6c9
style C fill:#e3f2fd
style D fill:#f8bbd0
flowchart TD
A["❓ 常见问题"] --> B["🧹 分片分配不均"]
A --> C["⚠️ 内存不足"]
A --> D["🐌 查询慢"]
B --> B1["重启节点后\n分片重分配"]
B1 --> B2["使用 reroute 手动调整"]
C --> C1["JVM 内存设置过大\n系统内存不足"]
C1 --> C2["配置 bootstrap.memory_lock"]
D --> D1["分片数量不合理\n查询写法不优"]
D1 --> D2["增加副本\n优化查询"]
style A fill:#fff3e0
10.2 最佳实践
实践
说明
推荐程度
分片大小控制
每个分片建议 20-50GB
✅✅✅
副本数量
生产环境至少 1 副本
✅✅✅
冷热分离
热数据 SSD,冷数据 HDD
✅✅
使用别名
通过别名切换索引
✅✅
路由优化
合理使用 routing 参数
✅✅
十一、总结
11.1 核心知识点回顾
mindmap
root((Elasticsearch))
核心概念
Cluster 集群
Node 节点
Shard 分片
Document 文档
Index 索引
查询类型
Match 全文搜索
Term 精确查询
Range 范围查询
Bool 布尔查询
聚合分析
Bucket 桶聚合
Metric 指标聚合
Pipeline 管道聚合
Spring Boot
ElasticsearchRepository
ElasticsearchOperations
Document 注解
ELK 生态
Logstash 收集
Elasticsearch 存储
Kibana 可视化
11.2 学习路线
flowchart LR
A["ES 学习路线"] --> B["第一阶段\n基础入门"]
B --> C["第二阶段\n查询进阶"]
C --> D["第三阶段\n聚合分析"]
D --> E["第四阶段\n集群运维"]
B --> B1["核心概念\n索引文档操作"]
C --> C1["DSL 查询\n高亮排序"]
D --> D1["桶聚合\n指标聚合"]
E --> E1["分片调优\n性能优化"]
style A fill:#fff3e0
style B fill:#e3f2fd
style C fill:#c8e6c9
style D fill:#fff3e0
style E fill:#f8bbd0
💡 写给读者的话:Elasticsearch 是现代搜索和日志分析的核心组件,掌握其使用对后端开发者来说至关重要。希望本文能帮助你建立完整的 ES 知识体系,在项目中游刃有余地使用 Elasticsearch!🔍