1. 什么是 Elasticsearch?
Elasticsearch(简称 ES)是一个基于 Lucene 的分布式搜索引擎,专注于全文检索、数据分析和实时日志处理。它具备以下核心优势:
- 🚀 高扩展性:轻松横向扩展,支持 PB 级数据处理。
- ⚡ 实时搜索:数据写入后秒级可查。
- 🔍 全文检索:基于倒排索引,支持复杂搜索场景。
典型应用场景
- 电商搜索(如商品推荐、模糊搜索)
- 日志分析(ELK 技术栈)
- 商业智能(结合 Kibana 进行数据可视化)
2. 为什么选择 Elasticsearch?
与传统数据库相比,Elasticsearch 在搜索和分析场景中表现更出色:
特性 | 传统数据库 | Elasticsearch |
---|---|---|
搜索速度 | 较慢(B+树索引) | 极快(倒排索引) |
扩展性 | 垂直扩展为主 | 水平扩展随意加节点 |
数据规模 | 适合结构化数据 | PB级非结构化数据 |
高可用 | 依赖主从复制 | 分片+副本自动容灾 |
3. Elasticsearch 的核心加速原理
3.1 倒排索引(Inverted Index)
- 将文档内容拆分为关键词(如 "iPhone" -> 文档1, 文档3)。
- 类似字典目录,直接跳转到目标文档,大幅提升搜索速度。
3.2 分布式架构
- 数据拆分为多个 分片(Shard),支持并行处理。
- 副本(Replica) 机制提升读取性能并保证数据安全。
3.3 缓存机制
- 文件系统缓存(20% 内存规则)。
- 聚合结果预计算(Doc Values),加速聚合查询。
3.4 写入优化
- 分段存储(Segment) + 定期合并,减少磁盘 I/O。
- 日志结构存储设计,提升写入性能。
4. Elasticsearch 核心概念
4.1 索引(Index)
索引相当于数据库,用于存储特定类型的文档。
# 创建索引
PUT /products
4.2 文档(Document)
文档是 ES 中最小的数据单位,使用 JSON 格式存储。
# 插入文档
POST /products/_doc/1
{
"name": "iPhone 15",
"price": 7999,
"brand": "Apple"
}
4.3 分片(Shard)和副本(Replica)
- 分片:将数据拆分为多个部分,支持分布式存储和查询。
- 副本:分片的备份,提升读取性能和数据安全性。
# 创建带分片和副本的索引
PUT /products
{
"settings": {
"number_of_shards": 3, # 3 个分片
"number_of_replicas": 1 # 每个分片 1 个副本
}
}
5. Elasticsearch 常用操作
5.1 创建索引
PUT /users
{
"settings": {
"number_of_shards": 1,
"number_of_replicas": 1
}
}
5.2 插入数据
POST /users/_doc/1
{
"name": "张三",
"age": 25,
"city": "北京"
}
5.3 查询数据
1) 根据 ID 查询
GET /users/_doc/1
2) 搜索所有文档
GET /users/_search
{
"query": {
"match_all": {}
}
}
3) 条件查询
GET /users/_search
{
"query": {
"match": {
"city": "北京"
}
}
}
5.4 更新数据
POST /users/_update/1
{
"doc": {
"age": 26
}
}
5.5 删除数据
DELETE /users/_doc/1
6. Elasticsearch 的应用场景
- 日志分析:配合 Logstash 和 Kibana 实现实时日志搜索与分析。
- 电商搜索:支持模糊搜索、拼写纠错和商品推荐。
- 数据分析:结合 Kibana 进行数据可视化。
- 大规模数据存储:轻松处理 PB 级别的非结构化数据。
7. 总结
Elasticsearch 是一个功能强大的分布式搜索引擎,适用于多种搜索和数据分析场景。通过本文,你已经掌握了 ES 的核心概念和基本操作。接下来可以深入学习以下内容:
- 分布式架构:如何设计高效的集群。
- 查询优化:提升搜索性能的技巧。
- 聚合分析:实现复杂的数据分析需求。
如果你在实践过程中遇到问题,欢迎在评论区留言讨论!一起探索 Elasticsearch 的更多可能性吧!💪
参考资料
- Elasticsearch 官方文档
- 《Elasticsearch 权威指南》