Elasticsearch 简介:分布式搜索引擎的核心架构与概念
Elasticsearch(简称 ES)是基于 Lucene 的分布式开源搜索引擎,它封装了 Lucene 的复杂性,通过简单的 RESTful API 提供高效的全文检索、分析和存储能力。广泛应用于日志分析、电商搜索、实时监控等场景。本文将详细解析其核心概念、架构设计及数据模型。
核心概念解析
文档(Document)
- 定义:ES 中最小的数据单元,类似关系型数据库中的 “一行记录”,以 JSON 格式存储。
- 特点:
- 每个文档有唯一 ID(可自动生成或手动指定)。
- 文档字段支持多种类型(文本、数字、日期、数组等),且会被索引以支持检索。
- 示例:一篇博客文章的文档可能包含
title(标题)、content(内容)、publish_time(发布时间)等字段。
类型(Type)
- 历史角色:早期设计中,类型用于对索引内的文档进行逻辑分类(类似关系型数据库的 “表”)。
- 现状:
- ES 6.x 中限制每个索引只能有 1 个类型。
- ES 7.x 及以上彻底移除类型,仅保留默认类型
_doc。
- 移除原因:
- 不同类型的文档在物理存储上并未分离(同属一个 Lucene 索引),可能导致字段冲突(如同一字段在不同类型中类型不同)。
- 与 Lucene 模型冲突:Lucene 索引本质是 “文档集合”,类型的划分增加了复杂度,不符合分布式存储逻辑。
索引(Index)
- 定义:具有相似特征的文档集合(类似关系型数据库的 “数据库”),如 “商品索引”“用户日志索引”。
- 命名规则:小写字母,可包含数字和连字符(如
product_index、user-logs-2024)。 - 核心特性:
- 索引是逻辑概念,物理上由多个分片(Shard)组成。
- 支持动态映射(自动推断字段类型)和显式映射(手动定义字段类型)。
节点(Node)
- 定义:运行 ES 实例的单台服务器,是集群的基本组成单元。
- 节点类型(通过配置指定):
- 主节点(Master Node):负责集群元数据管理(如索引创建、分片分配),默认每个节点都可竞选主节点。
- 数据节点(Data Node):存储数据分片,处理索引和搜索请求。
- 协调节点(Coordinating Node):接收客户端请求,分发任务并合并结果(默认所有节点都是协调节点)。
- ingest 节点 :预处理数据(如过滤、转换)后再写入索引。
集群(Cluster)
- 定义:由多个节点组成的集合,节点通过相同的
cluster.name标识归属(默认elasticsearch)。 - 核心功能:
- 分布式存储:数据分散在多个节点,支持水平扩展。
- 高可用:通过副本分片实现故障转移。
- 协同工作:节点间自动同步元数据,共同处理索引和搜索请求。
- 集群健康状态:
- 绿色:所有主分片和副本分片均正常可用。
- 黄色:主分片正常,但至少一个副本分片不可用(集群可用,但高可用降级)。
- 红色:至少一个主分片不可用(部分数据无法访问,集群功能受限)。
分片(Shards)
- 定义:索引的物理拆分单元,每个分片是一个独立的 Lucene 索引,可分布在不同节点。
- 类型:
- 主分片(Primary Shard):索引创建时指定数量(默认 1 个),不可修改,负责数据写入。
- 副本分片(Replica Shard):主分片的备份,可动态调整数量(默认 1 个),负责数据读取和故障转移。
- 作用:
- 水平扩展:通过增加主分片数量(需提前规划)提升存储和写入能力。
- 并行处理:搜索请求可在多个分片上并行执行,提高吞吐量。
副本(Replicas)
- 定义:主分片的拷贝,用于提供高可用和负载均衡。
- 特性:
- 副本分片不能与主分片在同一节点(避免单点故障)。
- 支持动态调整数量(如通过
update-index-settingsAPI 增加副本)。
- 作用:
- 故障恢复:主分片故障时,副本可晋升为新主分片。
- 分担读压力:搜索请求可分发到副本,提高查询吞吐量。
数据模型:与关系型数据库的对比
ES 的数据模型与关系型数据库有显著差异,核心是 “面向文档” 而非 “面向表”:
| 关系型数据库 | Elasticsearch | 说明 |
|---|---|---|
| 数据库(DB) | 索引(Index) | 存储相似文档的集合 |
| 表(Table) | (已移除)类型(Type) | 原用于逻辑分类,现通过索引区分 |
| 行(Row) | 文档(Document) | 最小数据单元,JSON 格式 |
| 列(Column) | 字段(Field) | 文档的属性,支持多种数据类型 |
| 主键(PK) | 文档 ID(_id) |
唯一标识文档,可自动生成或手动指定 |
| 索引(Index) | 倒排索引(Inverted Index) | ES 自动为字段构建,支持高效全文检索 |
倒排索引:ES 检索的核心
ES 基于 Lucene 的倒排索引实现高效检索,倒排索引存储以下关键信息:
- 词项(Term):文档分词后得到的关键词(如 “elasticsearch”“分布式”)。
- 文档 ID 列表:包含该词项的所有文档 ID。
- 词频(TF):词项在文档中出现的次数(影响相关性评分)。
- 位置(Position):词项在文档中的分词位置(支持短语查询,如 “分布式 搜索引擎” 需相邻出现)。
- 偏移(Offset):词项在原始文本中的起止字符位置(支持搜索结果高亮显示)。
示例:
文档 1 内容:“Elasticsearch 是分布式搜索引擎”
文档 2 内容:“Elasticsearch 基于 Lucene”
倒排索引中 “Elasticsearch” 对应的条目为:
1 | Elasticsearch → [(文档1, 词频=1, 位置=0), (文档2, 词频=1, 位置=0)] |
v1.3.10