Elasticsearch(简称 ES )是一个开源的、分布式的、基于 Lucene 构建的 搜索与分析引擎,广泛用于全文检索、日志分析、实时监控、安全分析、推荐系统等场景。它以高性能、高可用、近实时(Near Real-Time)和水平扩展能力著称。
一、核心基础概念
1. 倒排索引(Inverted Index)
- ES 的核心数据结构,将"词项 → 文档"的映射关系存储;
- 例如:
- 文档1: "apple banana"
- 文档2: "banana cherry"
→ 倒排索引:
apple → [1]
banana → [1, 2]
cherry → [2]
- 支持快速关键词匹配、相关性排序(TF-IDF / BM25)。
2. 文档(Document)
-
ES 中的最小数据单元,是 JSON 格式 的键值对;
-
类似关系型数据库中的"一行";
-
示例:
json{ "id": 1001, "title": "Elasticsearch入门", "content": "ES is a distributed search engine...", "publish_date": "2024-12-29" }
3. 索引(Index)
- 逻辑命名空间,存放具有相似结构的文档集合;
- 类似关系型数据库中的"表";
- 一个索引可包含多个 分片(Shard),实现分布式存储。
⚠️ 注意:ES 7.x 起,一个索引只能有一种 mapping type(默认
_doc),不再支持多类型。
4. 分片(Shard)与副本(Replica)
| 概念 | 说明 |
|---|---|
| Primary Shard(主分片) | 数据写入的基本单元,索引创建时指定数量(不可变); 决定索引的最大扩容能力(如 3 主分片 → 最多 3 节点并行写入)。 |
| Replica Shard(副本分片) | 主分片的拷贝,用于: - 高可用 (主分片宕机,副本接管) - 读负载均衡 (查询可路由到副本) 数量可动态调整。 |
✅ 默认配置:1 主分片 + 1 副本(共 2 分片/索引)。
5. Mapping(映射)
-
定义索引中字段的 数据类型 和 索引方式;
-
类似数据库的"表结构";
-
示例:
json{ "mappings": { "properties": { "title": { "type": "text", "analyzer": "ik_max_word" }, "views": { "type": "integer" }, "publish_date": { "type": "date", "format": "yyyy-MM-dd" } } } } -
常见类型:
text(全文检索)、keyword(精确匹配)、date、integer、geo_point等。
6. Analyzer(分析器)
- 将文本拆分为词项(Token)的过程;
- 包含三部分:
- Character Filter(字符过滤,如 HTML 标签去除)
- Tokenizer(分词器,如 whitespace、standard)
- Token Filter(词项过滤,如转小写、同义词、停用词)
- 中文推荐:IK Analyzer 、jieba 、smartcn。
二、系统架构(分布式设计)
ES 是 Peer-to-Peer(P2P) 架构,无单点故障,主要角色如下:
1. 节点类型(Node Roles)
| 角色 | 功能 | 是否必须 |
|---|---|---|
| Master-eligible Node | 参与集群管理(创建/删除索引、分配分片) | 至少 3 个(防脑裂) |
| Data Node | 存储数据、执行 CRUD、聚合查询 | 必须 |
| Coordinating Node | 接收客户端请求,转发到 Data Node,合并结果 | 所有节点默认具备 |
| Ingest Node | 预处理数据(如解析 JSON、转换字段) | 可选 |
| ML Node | 运行机器学习任务(X-Pack 功能) | 可选 |
💡 生产建议:角色分离(专用 Master + 专用 Data),避免资源竞争。
2. 集群(Cluster)与发现机制
- 多个节点组成一个 Cluster ,通过 Zen Discovery (7.x 后改用 Coordinator + Cluster State)自动发现彼此;
- 集群状态(Cluster State)包含:索引元数据、分片分配、节点信息等;
- 通过 Gossip 协议 同步状态。
3. 数据写入流程(Indexing)
- 客户端向任意节点发送写请求;
- 该节点作为 Coordinating Node ,根据
_id计算目标 Primary Shard; - 请求转发到 Primary Shard 所在 Data Node;
- Primary Shard 写入成功后,并行转发到所有 Replica Shards;
- 全部成功 → 返回客户端 OK。
⏱️ 近实时(NRT) :文档写入后 1 秒内 可被搜索(refresh 机制)。
4. 数据读取流程(Search)
- 客户端发送查询请求;
- Coordinating Node 广播请求到 所有相关分片(Primary 或 Replica);
- 各分片本地执行查询,返回局部结果(含排序得分);
- Coordinating Node 合并结果,全局排序后返回。
三、基本用法(RESTful API)
ES 提供 HTTP/JSON 接口,兼容任何语言调用。
1. 创建索引(带 Mapping)
bash
PUT /blog
{
"settings": {
"number_of_shards": 3,
"number_of_replicas": 1
},
"mappings": {
"properties": {
"title": { "type": "text" },
"author": { "type": "keyword" },
"content": { "type": "text" },
"publish_time": { "type": "date" }
}
}
}
2. 写入文档
bash
# 自动生成 ID
POST /blog/_doc
{
"title": "ES 入门指南",
"author": "张三",
"content": "Elasticsearch 是一个分布式搜索引擎...",
"publish_time": "2024-12-29"
}
# 指定 ID(支持 Upsert)
PUT /blog/_doc/1001
{
"title": "ES 高级用法",
"author": "李四",
"content": "...",
"publish_time": "2024-12-30"
}
3. 查询文档
全文检索(Match Query)
bash
GET /blog/_search
{
"query": {
"match": {
"content": "搜索引擎"
}
}
}
精确匹配(Term Query)
bash
GET /blog/_search
{
"query": {
"term": {
"author": "张三"
}
}
}
范围查询 + 排序
bash
GET /blog/_search
{
"query": {
"range": {
"publish_time": {
"gte": "2024-12-01",
"lte": "2024-12-31"
}
}
},
"sort": [
{ "publish_time": { "order": "desc" } }
]
}
聚合分析(Aggregation)
bash
GET /blog/_search
{
"size": 0,
"aggs": {
"authors": {
"terms": { "field": "author", "size": 10 }
},
"daily_views": {
"date_histogram": {
"field": "publish_time",
"calendar_interval": "day"
}
}
}
}
4. 更新文档
bash
POST /blog/_update/1001
{
"doc": {
"views": 100
}
}
5. 删除文档或索引
bash
# 删除文档
DELETE /blog/_doc/1001
# 删除整个索引
DELETE /blog
四、典型应用场景
| 场景 | 说明 |
|---|---|
| 站内搜索 | 电商商品搜索、内容平台文章检索 |
| 日志分析 | ELK Stack(Elasticsearch + Logstash + Kibana) |
| APM 监控 | 应用性能指标(吞吐量、错误率)可视化 |
| 安全分析(SIEM) | 异常登录、网络攻击检测 |
| 地理围栏 | geo_distance 查询附近 POI |
五、优势与局限
✅ 优势
- 分布式天然支持:开箱即用的集群能力;
- 近实时搜索:1 秒内可见新数据;
- 丰富的查询 DSL:支持布尔、模糊、范围、聚合等;
- 生态完善:Kibana(可视化)、Logstash/Beats(数据采集)、Machine Learning(异常检测)。
❌ 局限
- 不支持事务:非 ACID,不适合强一致性场景;
- 写入吞吐 vs 查询延迟权衡:高写入需调大 refresh_interval;
- 内存敏感:JVM Heap 建议 ≤ 32GB(避免 GC 停顿);
- 复杂 Join 性能差:推荐宽表或应用层关联。
六、生产部署建议
- 硬件:SSD 存储、64GB+ 内存、万兆网络;
- JVM:Heap ≤ 32GB,禁用 Swap;
- 分片策略:单分片 ≤ 50GB,避免过多小分片;
- 监控:集成 Prometheus + Elasticsearch Exporter;
- 备份:使用 Snapshot API 定期备份到 S3/HDFS。
总结
Elasticsearch = 分布式 + 全文检索 + 实时分析 + 可视化
它是现代数据栈中不可或缺的组件,尤其适合 "写多查快" 的场景。虽然不能替代关系型数据库,但在搜索、日志、监控等领域几乎成为事实标准。