Elasticsearch核心数据:Document文档详解+存储检索完整实战
- 一、前言
- 二、基础定义:什么是Elasticsearch Document?
- 2.1 官方概念
- 2.2 通俗理解
- 2.3 文档核心特点
- 三、文档结构:一个标准Document示例
- 3.1 文档核心元数据(系统自动生成)
- 四、核心流程:文档存储与检索流程图
- 五、文档存储:新增/创建文档(完整API)
- 5.1 方式1:自定义ID存储(推荐)
- 5.2 方式2:自动生成ID存储
- 5.3 存储成功返回结果
- 六、文档检索:查询/获取文档(5种常用方式)
- 6.1 方式1:根据ID精确获取文档
- 6.2 方式2:全文检索(match 搜索)
- 6.3 方式3:精确匹配(term 查询)
- 6.4 方式4:组合条件查询
- 6.5 方式5:查询所有文档
- 七、文档操作:更新、删除文档
- 7.1 更新文档(PUT / POST)
- 7.2 删除文档
- 八、核心概念:文档路由原理(为什么能快速找到?)
- 九、文档 vs MySQL 数据对比表
- 十、总结
🌺The Begin🌺点点关注,收藏不迷路🌺 |
一、前言
在 Elasticsearch 中,Document(文档)是可被搜索的最小数据单元,所有搜索、聚合、查询操作的本质都是对文档进行操作。
很多新手不理解文档是什么、文档与MySQL数据的关系、如何正确存储/更新/删除/检索文档,导致数据写入失败、查询不到、数据结构混乱。
本文将从文档定义、结构特点、唯一标识、存储流程、检索流程、完整API实战全方位讲解,搭配流程图、对比表、可直接运行的命令,让你彻底掌握 ES 文档。
二、基础定义:什么是Elasticsearch Document?
2.1 官方概念
Document:Elasticsearch 中结构化的数据记录,以JSON 格式存储,相当于 MySQL 数据库中的一行数据。
2.2 通俗理解
- Elasticsearch 索引 → MySQL 数据库表
- Document 文档 → MySQL 表中的一行记录
- Field 字段 → MySQL 表中的一列
2.3 文档核心特点
- JSON 结构:轻量级、易读、结构化
- 无固定结构:灵活,不同文档可拥有不同字段
- 自带唯一ID:每个文档都有全局唯一标识
_id - 可被索引:所有字段会被自动索引,支持快速查询
- 有元数据:包含
_index、_id、_source等系统字段
三、文档结构:一个标准Document示例
一个用户信息文档(JSON 格式):
{"name":"张三","age":25,"gender":"男","phone":"13800138000","address":"北京市朝阳区","create_time":"2025-01-01"}3.1 文档核心元数据(系统自动生成)
| 元数据字段 | 作用 |
|---|---|
_index | 文档所属索引 |
_id | 文档唯一ID |
_source | 文档原始JSON数据 |
_version | 文档版本号(乐观锁) |
_score | 搜索相关性评分 |
四、核心流程:文档存储与检索流程图
五、文档存储:新增/创建文档(完整API)
存储文档有两种方式:自定义ID、自动生成ID。
5.1 方式1:自定义ID存储(推荐)
指定ID=1001,存储到user_index索引:
PUT/user_index/_doc/1001{"name":"张三","age":25,"gender":"男","phone":"13800138000","address":"北京市朝阳区","create_time":"2025-01-01"}✅ 返回结果:result: "created"表示存储成功。
5.2 方式2:自动生成ID存储
不指定ID,ES自动生成随机唯一ID:
POST/user_index/_doc{"name":"李四","age":28,"gender":"女","phone":"13900139000"}✅ 自动生成的_id类似:3hXJ448sdf8SJhH
5.3 存储成功返回结果
{"_index":"user_index","_id":"1001","_version":1,"result":"created","_shards":{"total":2,"successful":2,"failed":0}}六、文档检索:查询/获取文档(5种常用方式)
检索是 ES 核心能力,分为精确获取、全文检索、条件查询等。
6.1 方式1:根据ID精确获取文档
GET/user_index/_doc/1001✅ 直接返回完整文档。
6.2 方式2:全文检索(match 搜索)
搜索名字包含“张三”的文档:
GET/user_index/_search{"query":{"match":{"name":"张三"}}}6.3 方式3:精确匹配(term 查询)
查询手机号=13800138000的文档:
GET/user_index/_search{"query":{"term":{"phone":"13800138000"}}}6.4 方式4:组合条件查询
年龄>25 且 性别=女:
GET/user_index/_search{"query":{"bool":{"filter":[{"range":{"age":{"gt":25}}},{"term":{"gender":"女"}}]}}}6.5 方式5:查询所有文档
GET/user_index/_search{"query":{"match_all":{}}}七、文档操作:更新、删除文档
7.1 更新文档(PUT / POST)
POST/user_index/_doc/1001{"name":"张三","age":26# 更新年龄}✅ 返回result: "updated"
7.2 删除文档
DELETE/user_index/_doc/1001✅ 返回result: "deleted"
八、核心概念:文档路由原理(为什么能快速找到?)
ES 根据文档ID自动计算存储节点:
公式:shard = hash(_id) % 主分片数量流程:
- 对
_id进行哈希计算 - 对主分片数取模
- 自动路由到对应分片与节点
- 检索时同理,直接定位数据
九、文档 vs MySQL 数据对比表
| 序号 | Elasticsearch | MySQL |
|---|---|---|
| 1 | Index(索引) | Table(表) |
| 2 | Document(文档) | Row(一行数据) |
| 3 | Field(字段) | Column(列) |
| 4 | Mapping(映射) | Schema(表结构) |
| 5 | JSON | 行数据 |
| 6 | 无固定结构 | 固定表结构 |
十、总结
- Document = ES 最小数据单元 = JSON 格式 = MySQL 一行数据
- 文档必须有唯一
_id,支持自定义/自动生成 - 存储流程:路由 → 写入主分片 → 同步副本
- 检索流程:分发 → 并行查询 → 合并结果
- 核心API:
PUT/POST存储、GET查询、DELETE删除
一句话记住:
所有ES操作都是围绕Document展开,文档是ES的灵魂与核心!
🌺The End🌺点点关注,收藏不迷路🌺 |