Elasticsearch核心详解:Document文档概念与存储检索实战
- 一、前言
- 二、什么是 Elasticsearch Document(文档)?
- 1. 官方定义
- 2. 通俗理解
- 3. 文档核心特点
- 4. 文档元数据(必知)
- 三、文档 存储 & 检索 核心流程图
- 四、Document 文档核心结构(实战示例)
- 五、如何存储(写入)文档?3种常用方式
- 方式1:手动指定文档ID(推荐)
- 方式2:自动生成文档ID
- 方式3:存在则更新,不存在则新增
- 六、如何检索(查询)文档?5种高频方式
- 1. 根据文档ID精准查询(GET)
- 2. 查询所有文档(match_all)
- 3. 全文检索(match)
- 4. 精确匹配(term)
- 5. 复合条件查询(bool)
- 七、文档 写入 & 检索 流程详解(面试重点)
- 1. 文档存储(写入)流程
- 2. 文档检索(查询)流程
- 八、文档 vs MySQL 数据对比(秒懂)
- 九、文档操作最佳实践
- 十、总结
- 1. 什么是ES文档?
- 2. 如何存储文档?
- 3. 如何检索文档?
🌺The Begin🌺点点关注,收藏不迷路🌺 |
一、前言
在 Elasticsearch 的世界里,Document(文档)是最核心、最基础的数据单元,所有的搜索、聚合、分析操作,最终都是围绕文档展开的。
很多新手对“文档”的概念模糊,不清楚它和MySQL行数据的区别,也不掌握正确的存储、检索方式,导致写入失败、查询不到数据、数据结构混乱。
本文将从文档定义→核心特性→存储流程→检索流程→实战操作→最佳实践全维度讲解,搭配流程图、JSON示例、RESTful API,让你彻底掌握ES文档的核心用法。
二、什么是 Elasticsearch Document(文档)?
1. 官方定义
Document是 Elasticsearch 中可被搜索的最小数据单元,以JSON格式存储,相当于关系型数据库(MySQL)中的一行记录。
2. 通俗理解
- MySQL:一张表 → 多行数据(行=记录)
- Elasticsearch:一个索引 → 多个文档(文档=JSON数据)
- 一个文档可以是一条商品数据、一篇文章、一条日志、一个用户信息
3. 文档核心特点
- JSON结构:轻量、易读、支持嵌套
- 无Schema约束:字段可动态新增(灵活)
- 全局唯一ID:每个文档都有独立
_id - 自动分词索引:写入即被索引,支持秒级检索
- 支持嵌套:可包含对象、数组(复杂结构兼容)
4. 文档元数据(必知)
每个文档自带3个核心元数据,决定文档的存储与检索:
_index:文档所属索引名_id:文档唯一标识(手动/自动生成)_source:文档原始JSON数据
三、文档 存储 & 检索 核心流程图
四、Document 文档核心结构(实战示例)
一个标准的用户文档JSON结构:
{"_index":"user_index",// 所属索引"_id":"1001",// 唯一ID"_version":1,// 版本号(乐观锁)"_source":{// 真实业务数据"name":"张三","age":25,"phone":"13800138000","address":{// 嵌套文档"province":"广东","city":"深圳"},"hobby":["篮球","游戏"],// 数组类型"create_time":"2025-01-01"}}✅说明:_source里的内容就是你真正存储的数据。
五、如何存储(写入)文档?3种常用方式
存储文档使用RESTful PUT/POST 请求,ES 自动完成索引构建。
方式1:手动指定文档ID(推荐)
适用:数据有唯一标识(用户ID、订单号)
PUT /user_index/_doc/1001 { "name": "张三", "age": 25, "phone": "13800138000" }PUT:新增/覆盖文档1001:自定义文档ID
方式2:自动生成文档ID
适用:无固定ID(日志、评论)
POST /user_index/_doc { "name": "李四", "age": 28 }POST:ES自动生成随机ID- 无需手动指定ID,简单高效
方式3:存在则更新,不存在则新增
POST /user_index/_update/1001 { "doc": { "age": 26 } }- 只更新修改字段,不覆盖全量数据
六、如何检索(查询)文档?5种高频方式
检索是ES的核心能力,支持精准查询、全文检索、条件查询。
1. 根据文档ID精准查询(GET)
GET /user_index/_doc/1001✅ 返回:ID=1001的完整文档数据
2. 查询所有文档(match_all)
GET /user_index/_search { "query": { "match_all": {} } }3. 全文检索(match)
适用:text类型字段(文章、标题、描述)
GET /user_index/_search { "query": { "match": { "name": "张三" } } }4. 精确匹配(term)
适用:keyword/数值类型(手机号、状态、ID)
GET /user_index/_search { "query": { "term": { "phone": "13800138000" } } }5. 复合条件查询(bool)
适用:多条件组合(年龄+城市+状态)
GET /user_index/_search { "query": { "bool": { "must": [ { "match": { "address.city": "深圳" }}, { "range": { "age": { "gte": 25 }}} ] } } }七、文档 写入 & 检索 流程详解(面试重点)
1. 文档存储(写入)流程
- 客户端发送JSON文档→ ES协调节点
- 路由计算:根据
文档ID确定目标分片 - 写入主分片→ 同步数据到副本分片
- 分词处理:text字段自动分词,建立倒排索引
- 返回响应:写入成功,文档可被检索
2. 文档检索(查询)流程
- 客户端发送查询请求→ 协调节点
- 广播查询:将请求转发到所有分片
- 并行查询:各分片匹配目标文档
- 结果合并:协调节点汇总、排序、分页
- 返回结果:给客户端返回匹配的文档列表
八、文档 vs MySQL 数据对比(秒懂)
| 对比项 | Elasticsearch | MySQL |
|---|---|---|
| 数据单元 | Document(文档) | Row(行数据) |
| 存储格式 | JSON | 表格字段 |
| 结构约束 | 无Schema,灵活扩展 | 固定表结构,修改麻烦 |
| 检索能力 | 全文检索、模糊匹配、高性能 | 精准查询、模糊查询低效 |
| 适用场景 | 搜索、日志、大数据分析 | 事务性业务数据存储 |
九、文档操作最佳实践
- ID规划:有业务唯一ID就手动指定,无ID则自动生成
- 结构设计:提前规划mapping,避免动态字段混乱
- 更新方式:优先使用
_update局部更新,减少IO - 查询规范:
- 全文搜索用
match - 精准匹配用
term - 聚合/排序用
keyword
- 全文搜索用
- 批量操作:大量数据用
_bulk批量写入,提升性能
十、总结
1. 什么是ES文档?
- ES中最小可搜索数据单元,JSON格式存储
- 相当于MySQL的一行数据
- 自带唯一ID、索引、版本等元数据
2. 如何存储文档?
PUT:手动指定ID写入POST:自动生成ID写入- 写入自动分词、建立索引
3. 如何检索文档?
GET:ID精准查询match:全文检索term:精确匹配bool:多条件复合查询
一句话总结:文档是ES的灵魂,写入即索引,查询即检索!
如果这篇博客对你有帮助,欢迎点赞、收藏、关注,后续持续更新 Elasticsearch 文档进阶、批量操作、性能优化实战教程!
🌺The End🌺点点关注,收藏不迷路🌺 |