ES 原理是什么,搜索功能是如何实现的
ES 原理概述
- 定义:
- Elasticsearch 是一个分布式、开源的搜索和分析引擎,基于 Apache Lucene 构建,适用于全文搜索、日志分析等场景。
- 核心原理:
- 倒排索引:快速定位包含关键词的文档。
- 分布式架构:分片和副本实现高可用和扩展。
- RESTful API:通过 JSON 交互,易用性强。
搜索功能实现
- 步骤:
- 数据索引:文档分词并存入倒排索引。
- 查询解析:将用户查询转化为内部表示。
- 分布式搜索:分片并行检索,合并结果。
- 相关性排序:基于评分(如 TF-IDF)返回。
核心点
- ES 结合 Lucene 的倒排索引和分布式系统实现高效搜索。
1. ES 原理详解
(1) 倒排索引(Inverted Index)
- 原理:
- 将文档内容分词,映射为“词 → 文档列表”的结构,加速检索。
- 过程:
- 分词:
I like to code
→I
、like
、to
、code
。 - 索引:
词 | 文档 ID
I | 1
like | 1, 2
to | 1, 3
code | 1
- 特点:
- 支持快速查找和布尔查询(如
like AND code
)。
(2) 分布式架构
- 核心组件:
- 集群(Cluster):多个节点组成。
- 节点(Node):运行 ES 的实例。
- 索引(Index):逻辑数据集合,类似数据库。
- 分片(Shard):索引分成多个片,分布存储。
- 副本(Replica):分片备份,提高可用性。
- 工作方式:
- 数据写入时分配到分片,副本同步。
- 查询时并行搜索分片,聚合结果。
- 示例:
- 索引
users
分 5 个主分片,2 个副本,分布在 3 个节点。
(3) Lucene 基础
- 作用:
- ES 底层依赖 Lucene 处理索引和搜索。
- 特性:
- 分词器(Analyzer):支持多语言。
- 存储:倒排索引 + 原始数据(
_source
)。
图示
[用户查询] --> [ES 集群] --> [分片 1, 分片 2, ...] --> [Lucene 倒排索引] --> [结果]
2. 搜索功能实现
(1) 数据索引
- 输入:
- JSON 文档,如:
PUT /users/_doc/1
{
"name": "Alice",
"age": 25
}
- 处理:
- 分词:
Alice
→ 单词,存入倒排索引。 - 映射(Mapping):定义字段类型(如
text
、integer
)。 - 分片存储:分配到主分片,同步副本。
- 结果:
- 倒排索引更新,记录词和文档 ID。
(2) 查询解析
- 输入:
GET /users/_search
{
"query": {
"match": {
"name": "Alice"
}
}
}
- 处理:
- 分词:
Alice
分解为查询词。 - 查询类型:
match
:模糊匹配。term
:精确匹配。
- 生成查询树:Lucene 内部表示。
(3) 分布式搜索
- 过程:
- 查询分发:主节点将请求发到所有相关分片。
- 本地搜索:各分片用倒排索引查找匹配文档。
- 结果合并:主节点收集分片结果,排序后返回。
- 优化:
- 路由:根据
_id
或字段优化分片选择。 - 缓存:字段数据缓存加速。
(4) 相关性排序
- 原理:
- 默认用 BM25(改进的 TF-IDF)计算得分:
- TF:词频。
- IDF:逆文档频率。
- 字段长度规范化:短文档得分更高。
- 输出:
- 按
_score
降序返回:
{
"hits": [
{
"_id": "1",
"_score": 1.5,
"_source": { "name": "Alice", "age": 25 }
}
]
}
3. ES 关键特性
- 近实时(NRT):
- 数据写入后 1 秒内可搜索(刷新间隔)。
- 高可用:
- 副本容错,分片负载均衡。
- 扩展性:
- 横向添加节点,分片自动分配。
4. 技术细节
(1) 分词器
- 作用:
- 自定义分词,如中文用
ik
插件。 - 示例:
搜索引擎
→搜索
+引擎
。
(2) 存储结构
- Segment:
- Lucene 将索引分为不可变段,定期合并。
- Translog:
- 事务日志,保障数据持久性。
(3) 写流程
- 数据写入内存 Buffer。
- 记录到 Translog。
- 定期刷新(Refresh)生成 Segment。
- 合并(Merge)优化索引。
5. 延伸与面试角度
- 与 MySQL:
- ES:全文搜索快,结构化查询弱。
- MySQL:精确查询强,搜索慢。
- 实际应用:
- 日志:ELK 栈(Elasticsearch + Logstash + Kibana)。
- 电商:商品搜索。
- 优化:
- 调整分片数,优化查询字段。
- 面试点:
- 问“原理”时,提倒排索引和分片。
- 问“搜索”时,提 BM25 和分布式。
总结
ES 通过 Lucene 的倒排索引提供快速搜索,分布式架构保障扩展和高可用,搜索功能靠分词、索引、分布式检索和 BM25 排序实现。面试时,可提索引结构或画流程图,展示理解深度。