Skip to content

ES 原理是什么,搜索功能是如何实现的

ES 原理概述

  • 定义
  • Elasticsearch 是一个分布式、开源的搜索和分析引擎,基于 Apache Lucene 构建,适用于全文搜索、日志分析等场景。
  • 核心原理
  • 倒排索引:快速定位包含关键词的文档。
  • 分布式架构:分片和副本实现高可用和扩展。
  • RESTful API:通过 JSON 交互,易用性强。

搜索功能实现

  • 步骤
  • 数据索引:文档分词并存入倒排索引。
  • 查询解析:将用户查询转化为内部表示。
  • 分布式搜索:分片并行检索,合并结果。
  • 相关性排序:基于评分(如 TF-IDF)返回。

核心点

  • ES 结合 Lucene 的倒排索引和分布式系统实现高效搜索。

1. ES 原理详解

(1) 倒排索引(Inverted Index)

  • 原理
  • 将文档内容分词,映射为“词 → 文档列表”的结构,加速检索。
  • 过程
  • 分词I like to codeIliketocode
  • 索引
词    | 文档 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):定义字段类型(如 textinteger)。
  • 分片存储:分配到主分片,同步副本。
  • 结果
  • 倒排索引更新,记录词和文档 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) 写流程

  1. 数据写入内存 Buffer。
  2. 记录到 Translog。
  3. 定期刷新(Refresh)生成 Segment。
  4. 合并(Merge)优化索引。

5. 延伸与面试角度

  • 与 MySQL
  • ES:全文搜索快,结构化查询弱。
  • MySQL:精确查询强,搜索慢。
  • 实际应用
  • 日志:ELK 栈(Elasticsearch + Logstash + Kibana)。
  • 电商:商品搜索。
  • 优化
  • 调整分片数,优化查询字段。
  • 面试点
  • 问“原理”时,提倒排索引和分片。
  • 问“搜索”时,提 BM25 和分布式。

总结

ES 通过 Lucene 的倒排索引提供快速搜索,分布式架构保障扩展和高可用,搜索功能靠分词、索引、分布式检索和 BM25 排序实现。面试时,可提索引结构或画流程图,展示理解深度。