Elasticsearch核心概念
Elasticsearch 的数据模型核心概念建立在面向文档和搜索优化的基础上,与传统关系型数据库有显著区别。以下是其最核心的概念及其相互关系:
-
文档 (Document)
- 是什么? 数据的基本存储单元和搜索单元。类似于关系型数据库中的一行记录。
- 形式: JSON 对象。包含一组键值对(字段和值),结构灵活,可以嵌套。
- 关键特性:
- 最小单位: 所有数据最终都存储在文档中。
- 唯一标识: 每个文档在索引内有唯一的
_id
。 - 可搜索: 文档的内容(字段值)是搜索的主要目标。
- 模式灵活: 文档结构不需要预先严格定义(动态映射),但也可以根据需要定义严格的映射(显式映射)。
- 类比: 关系型数据库中的
ROW
。
-
索引 (Index)
- 是什么? 一组具有相似特性的文档的集合。这是 Elasticsearch 中最顶层的逻辑数据容器和组织单元。
- 作用:
- 分区容器: 将文档逻辑分组(例如,
customer-index
,product-index
,logs-2023-index
)。 - 映射定义: 包含定义文档结构(字段名、类型、分析方式等)的映射(Mapping)。
- 配置单元: 关联特定的设置(Settings),如分片数量、副本数量、刷新间隔等。
- 搜索主要入口: 绝大多数搜索操作都是在特定索引(或索引模式)上执行的。
- 分区容器: 将文档逻辑分组(例如,
- 关键特性:
- 逻辑概念: 用户操作的主要入口点(CRUD、Search)。
- 映射关联: 索引包含其文档的映射定义。
- 设置关联: 索引关联其配置设置。
- 类比: 关系型数据库中的
TABLE
(最主要的类比,但功能更复杂强大)。 注意:ES 的索引同时承担了表定义(Schema)和表本身(数据容器)的角色。
-
映射 (Mapping)
- 是什么? 定义文档的结构及其包含的字段如何被处理和索引的规则集合。相当于模式定义 (Schema Definition)。
- 作用:
- 字段定义: 指定文档中每个字段的名称。
- 数据类型: 定义每个字段的数据类型(如
text
,keyword
,date
,long
,boolean
,object
,nested
等)。这是核心功能。 - 索引方式: 控制字段是否应被索引(使其可搜索/聚合),以及如何被索引(如分词器、分析器等)。
- 存储方式: 控制字段值是否应存储在
_source
之外(默认所有原始 JSON 都存储在_source
字段)。 - 其他属性: 如
index_options
(控制倒排索引存储哪些信息)、format
(日期格式)、ignore_above
(keyword 字段忽略超长值)等。
- 关键特性:
- 数据理解: 告诉 Elasticsearch 如何解释和处理文档中的数据。
- 搜索/聚合基础: 字段的数据类型和索引方式极大地影响搜索行为、性能和聚合能力(例如,
text
字段用于全文搜索,keyword
字段用于精确匹配、排序和聚合)。 - 动态 vs 显式: 可以动态生成(Dynamic Mapping,即根据插入的第一个文档自动推断类型)或显式定义(Explicit Mapping,推荐做法)。
- 类比: 关系型数据库中的
TABLE SCHEMA
/DDL
。
-
类型 (Type) - 已淘汰 (Deprecated since 7.x, Removed in 8.x)
- 历史背景: 在 Elasticsearch 6.x 及之前版本,一个索引内部可以包含多种“类型”,每个类型有自己的映射,试图模拟关系型数据库中一个表内可以有不同类型的对象(如
user
类型和blog_post
类型在同一个social-media-index
中)。 - 问题: 这种方式在底层实现上导致不同类型文档的字段映射混淆(字段冲突)和性能问题(同一索引内不同类型的数据特性差异太大)。
- 现状: 从 Elasticsearch 7.x 开始弃用,8.x 中彻底移除。 最佳实践是每个索引只包含一种文档类型(即一种数据结构)。 如果需要不同的数据结构,应该创建不同的索引。
- 历史背景: 在 Elasticsearch 6.x 及之前版本,一个索引内部可以包含多种“类型”,每个类型有自己的映射,试图模拟关系型数据库中一个表内可以有不同类型的对象(如
-
分片 (Shard)
- 是什么? 索引的物理水平分区的子集。 一个索引存储的数据量可能非常大(TB/PB 级),超过单台机器的存储和处理能力。分片机制将索引的数据水平拆分成多个较小的部分(称为分片)。
- 作用:
- 横向扩展/并行处理: 允许数据和请求负载分布在集群的多个节点上,实现水平扩展,大幅提升存储容量、吞吐量和查询性能(并行执行查询)。这是 ES 处理海量数据的核心机制。
- 操作单元: 文档的 CRUD 操作最终发生在某个具体的分片上。
- 关键特性:
- 主分片 (
primary shard
):存储索引数据的主副本。负责处理索引(写入)请求。文档首先写入主分片。创建索引时指定数量且后续不可更改(除非重建索引)。决定索引的最大数据容量。 - 副本分片 (
replica shard
):主分片的拷贝。提供数据冗余(高可用性,防止节点故障导致数据丢失)和提升查询吞吐量(读请求可以由主分片或副本分片处理)。 - 分布: 分片(主分片和它的副本)被分配到集群的不同节点上。
- 透明性: 对用户透明(用户操作索引,ES 内部处理分片路由)。
- 主分片 (
- 类比: 关系型数据库中的水平分区(Partitioning),但更底层且是分布式核心。
-
节点 (Node)
- 是什么? 运行中的 Elasticsearch 实例。 一个物理或虚拟服务器。
- 作用: 存储数据、参与集群的索引和搜索操作。
- 关键特性:
- 集群成员: 多个节点组成一个集群 (
Cluster
) 。 - 角色: 节点可以扮演不同角色(可配置):数据节点(存储分片和处理 CRUD / 搜索)、主节点(管理集群状态、索引创建/删除、节点加入/离开)、协调节点(转发请求、聚合结果)、Ingest 节点(预处理文档)等。
- 分片宿主: 分片运行在节点上。一个节点可以存储多个分片(来自不同的索引)。
- 集群成员: 多个节点组成一个集群 (
- 类比: 关系型数据库集群中的一个数据库服务器实例。
核心概念的层级关系与工作流:
- 集群 (
Cluster
):由一个或多个节点 (Node
) 组成。 - 索引 (
Index
):- 创建在集群上(逻辑概念)。
- 创建时需要配置:
- 主分片 (
Primary Shard
) 的数量(决定数据容量上限)。 - 副本分片 (
Replica Shard
) 的数量(决定冗余度和读吞吐量)。 - 映射 (
Mapping
)(显式定义或依靠动态)。
- 主分片 (
- 索引的数据会被物理拆分成多个 分片 (
Shard
)。
- 分片 (
Shard
):- 索引的主分片和副本分片是物理存储单元。
- 它们被分配到集群的不同节点 (
Node
) 上运行。 - 每个分片本质上是一个独立的、功能完整的 Lucene 索引。
- 文档 (
Document
):- 被写入到某个具体的索引 (
Index
) 中。 - ES 根据文档的
_id
和索引的分片规则,决定该文档应该存储在哪个主分片 (Primary Shard
) 上。 - 文档的结构和字段处理规则由该索引的映射 (
Mapping
) 定义。
- 被写入到某个具体的索引 (
- 搜索/查询:
- 用户向一个或多个索引 (
Index
) 发送请求。 - 请求到达某个节点(通常是协调节点)。
- 协调节点将请求广播到所有相关的分片 (
Shard
)(主分片或其副本,分布在不同的节点 (Node
) 上)。 - 每个分片在本地执行搜索(在它存储的文档 (
Document
) 子集上),返回结果给协调节点。 - 协调节点聚合所有分片的局部结果,进行排序、分页等处理,然后返回最终结果给用户。
- 用户向一个或多个索引 (
总结关键点:
- 文档 (JSON) 是数据的最小单位。
- 索引 是文档的逻辑容器(类比表),定义了映射(schema)和设置。
- 映射 定义了文档的结构和字段如何处理(字段名、数据类型、索引方式),对搜索和聚合至关重要。
- 分片 是实现水平扩展、高并发和高可用的核心物理机制。
- 主分片 处理写请求,决定数据容量。
- 副本分片 提供冗余和提升读性能。
- 节点 是运行 ES 的基础硬件/虚拟机单元,存储分片和处理请求。
- 类型 (Type) 已被淘汰,现代 ES 中一个索引对应一种文档结构。
- 倒排索引(Inverted Index) 是 Elasticsearch (基于 Lucene) 实现快速全文搜索的底层数据结构。虽然它不是用户直接操作的顶层概念,但它是理解 ES 搜索为何高效的根基:
- 它建立了从词项 (Term) 到包含该词项的文档列表的映射。
- 搜索时,通过查找词项快速定位到相关文档 ID。
理解这些核心概念及其相互关系是有效使用、管理和优化 Elasticsearch 的基础。