ElasticSearch - 文档操作
# ElasticSearch - 文档基本操作
格式:http://127.0.0.1:9200/索引名/文档名
# 1. 创建文档 (POST
请求)
Elasticsearch 的文档可以类比为关系型数据库中的表数据。在 Elasticsearch 中,文档的数据格式为 JSON 格式。通过 POST
请求,可以向 Elasticsearch 中创建一个新的文档。
# Postman 操作
操作目的:向已经存在的索引中添加一个文档(即一条数据)。
- 请求 URL:
http://127.0.0.1:9200/shopping/_doc
- 请求方法:
POST
- 数据格式: JSON
操作步骤:
- 打开 Postman,选择
POST
请求方法。 - 在 URL 栏中输入
http://127.0.0.1:9200/shopping/_doc
,其中shopping
是索引名,_doc
表示文档类型。 - 在请求体中输入如下 JSON 数据,该文档包含
title
、category
、images
和price
字段,表示一个商品的基本信息。 - 点击发送请求按钮。
请求体内容为:
{
"title":"小米手机",
"category":"小米",
"images":"http://www.gulixueyuan.com/xm.jpg",
"price":3999.00
}
2
3
4
5
6
发送请求的截图如下:
注意事项:发送请求的方式必须为 POST
,不能为 PUT
,否则会返回错误,因为 POST
用于新建文档,而 PUT
用于指定 ID 的更新或创建。
服务器响应结果说明:
{
"_index【索引】": "shopping", // 表示文档所属的索引名称
"_type【类型-文档】": "_doc", // 表示文档的类型
"_id【唯一标识】": "Xhsa2ncBlvF_7lxyCE9G", // 文档的唯一 ID,自动生成
"_version【版本】": 1, // 文档的版本号,首次创建为 1
"result【结果】": "created", // 表示文档成功创建
"_shards【分片】": {
"total【分片 - 总数】": 2, // 索引分片的总数
"successful【分片 - 成功】": 1, // 成功分配的分片数
"failed【分片 - 失败】": 0 // 失败分配的分片数
},
"_seq_no": 0,
"_primary_term": 1
}
2
3
4
5
6
7
8
9
10
11
12
13
14
响应结果截图如下:
- _id: 这里
Xhsa2ncBlvF_7lxyCE9G
是文档的唯一 ID,Elasticsearch 自动生成,类似于 MySQL 中的主键。 - result: 返回
"created"
表示文档创建成功。 - _version: 表示该文档的版本号,首次创建时版本号为 1。
- _shards: 表示该文档所在的分片情况,总分片数为 2,成功分片为 1,失败分片为 0。
# 自定义文档 ID
您还可以自定义文档的唯一标识符(ID),在 URL 中指定 ID。此时,发送请求的方式可以是 POST
或 PUT
。
请求 URL: http://127.0.0.1:9200/shopping/_doc/1000
请求体内容为:
{
"title":"华为手机",
"category":"华为",
"images":"https://cdn.jsdelivr.net/gh/Kele-Bingtang/static/user/avatar2.png",
"price":4999.00
}
2
3
4
5
6
发送请求的截图如下:
- 语法说明: URL
http://127.0.0.1:9200/shopping/_doc/1000
中的1000
是指定的文档唯一标识符。请求方法可以为POST
或PUT
,PUT
通常用于更新或覆盖已有文档。
# Kibana 操作
在 Kibana 中,创建文档时,可以自动生成 ID 或手动指定 ID。
- 自动生成 ID:
POST /shopping/_doc
{
"title":"小米手机",
"category":"小米",
"images":"http://www.gulixueyuan.com/xm.jpg",
"price":3999.00
}
2
3
4
5
6
7
- 手动指定 ID:
POST /shopping/_doc/1000
{
"title":"华为手机",
"category":"华为",
"images":"https://cdn.jsdelivr.net/gh/Kele-Bingtang/static/user/avatar2.png",
"price":4999.00
}
2
3
4
5
6
7
# 2. 查看文档 (GET
请求)
要查看某个特定文档,您需要知道该文档的唯一标识符(ID)。通过 GET
请求,您可以根据文档 ID 检索出文档的内容,类似于在 MySQL 中通过主键进行查询。
# Postman 操作
操作目的:根据文档 ID 查询并获取该文档的详细信息。
- 请求 URL:
http://127.0.0.1:9200/shopping/_doc/1000
- 请求方法:
GET
操作步骤:
- 打开 Postman,选择
GET
请求方法。 - 在 URL 栏中输入
http://127.0.0.1:9200/shopping/_doc/1000
,其中1000
是文档的唯一标识符。 - 点击发送请求按钮,服务器将返回该文档的详细信息。
查询文档的操作截图如下:
响应结果说明:
{
"_index【索引】": "shopping", // 文档所在的索引
"_type【文档类型】": "_doc", // 文档的类型
"_id【唯一标识】": "1000", // 文档的唯一标识符(ID)
"_version": 1, // 文档的版本号
"_seq_no": 1,
"_primary_term": 1,
"found【查询结果】": true, // true 表示找到了该文档,false 表示未找到
"_source【文档内容】": { // 文档的实际数据内容
"title": "华为手机",
"category": "华为",
"images": "https://cdn.jsdelivr.net/gh/Kele-Bingtang/static/user/avatar2.png",
"price": 4999.00
}
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
- found:
true
表示文档存在,false
表示文档未找到。 - _source: 这是文档的实际数据内容,包含
title
、category
、images
和price
字段。
# Kibana 操作
在 Kibana 中查看文档的命令如下:
GET /shopping/_doc/1000
- 语法说明:
GET /shopping/_doc/1000
表示从索引shopping
中查询 ID 为1000
的文档。该请求将返回文档的详细信息。
# 3. 修改文档 (POST
请求)
在 Elasticsearch 中,通过 POST
请求,您可以更新已有的文档。发送与创建文档相同的 POST
请求会覆盖已有文档的内容。如果您需要部分更新,可以使用 _update
API。
# 覆盖式更新
# Postman 操作
操作目的:更新或替换文档的全部内容。注意,此操作会覆盖文档的现有内容。
- 请求 URL:
http://127.0.0.1:9200/shopping/_doc/1000
- 请求方法:
POST
操作步骤:
打开 Postman,选择
POST
请求方法。在 URL 栏中输入
http://127.0.0.1:9200/shopping/_doc/1000
,1000
是文档的唯一标识符。在请求体中输入新的 JSON 数据,更新文档的内容。
请求体内容为:
{
"title":"华为手机",
"category":"华为",
"images":"https://cdn.jsdelivr.net/gh/Kele-Bingtang/static/user/avatar2.png",
"price":5999.00
}
2
3
4
5
6
发送请求的截图如下:
响应结果说明:
{
"_index": "shopping", // 文档所属的索引
"_type": "_doc", // 文档的类型
"_id": "1000", // 文档的唯一标识符
"_version【版本】": 2, // 文档的版本号,更新后版本号增加
"result【结果】": "updated", // 表示文档更新成功
"_shards": {
"total": 2,
"successful": 1,
"failed": 0
},
"_seq_no": 2,
"_primary_term": 2
}
2
3
4
5
6
7
8
9
10
11
12
13
14
- result: 返回
"updated"
表示文档更新成功。 - _version: 文档的版本号从 1 更新为 2,表示文档内容已发生变化。
# Kibana 操作
在 Kibana 中,更新文档的命令如下:
POST /shopping/_doc/1000
{
"title":"华为手机",
"category":"华为",
"images":"https://cdn.jsdelivr.net/gh/Kele-Bingtang/static/user/avatar2.png",
"price":5999.00
}
2
3
4
5
6
7
# 4. 修改文档的字段 (POST
请求)
除了完全覆盖更新,您还可以通过 _update
API 来修改文档的部分字段。此操作不会覆盖整个文档,而是只更新指定的字段。
# 非覆盖式更新
# Postman 操作
操作目的:只修改文档的某些字段,而不影响其他字段的内容。
- 请求 URL:
http://127.0.0.1:9200/shopping/_update/1000
- 请求方法:
POST
操作步骤:
- 打开 Postman,选择
POST
请求方法。 - 在 URL 栏中输入
http://127.0.0.1:9200/shopping/_update/1000
,其中1000
是文档的唯一标识符。 - 在请求体中输入需要更新的字段内容。
请求体内容为:
{
"doc": { // "doc" 字段表示部分更新
"price":3000.00
}
}
2
3
4
5
发送请求的截图如下:
响应结果说明:
{
"_index": "shopping", // 文档所属的索引
"_type": "_doc", // 文档的类型
"_id": "1000", // 文档的唯一标识符
"_version": 3, // 文档的版本号,局部更新也会增加版本号
"result": "updated", // 表示文档更新成功
"_shards": {
"total": 2,
"successful": 1,
"failed": 0
},
"_seq_no": 3,
"_primary_term": 2
}
2
3
4
5
6
7
8
9
10
11
12
13
14
- result: 返回
"updated"
表示部分更新成功。 - _version: 局部更新也会增加文档的版本号,当前版本号为 3。
# Kibana 操作
在 Kibana 中,修改字段的命令如下:
POST /shopping/_update/1000
{
"doc": {
"price":3000.00
}
}
2
3
4
5
6
# 5. 删除文档 (DELETE
请求)
通过 DELETE
请求,您可以删除某个特定文档。删除文档是逻辑删除,文档不会立即从磁盘中移除,而是标记为已删除。
# Postman 操作
操作目的:删除某个文档,类似于数据库中的删除记录操作。
- 请求 URL:
http://127.0.0.1:9200/shopping/_doc/1000
- 请求方法:
DELETE
操作步骤:
- 打开 Postman,选择
DELETE
请求方法。 - 在 URL 栏中输入
http://127.0.0.1:9200/shopping/_doc/1000
,其中1000
是要删除的文档的唯一标识符。 - 点击发送请求按钮。
删除文档的操作截图如下:
响应结果说明:
{
"_index": "shopping", // 文档所属的索引
"_type": "_doc", // 文档的类型
"_id": "1000", // 文档的唯一标识符
"_version": 4, // 文档的版本号,删除操作也会增加版本号
"result": "deleted", // 表示文档已成功删除
"_shards": {
"total": 2,
"successful": 1,
"failed": 0
},
"_seq_no": 4,
"_primary_term": 2
}
2
3
4
5
6
7
8
9
10
11
12
13
14
- result: 返回
"deleted"
表示文档成功删除。 - _version: 删除操作也会增加文档的版本号。
删除文档后,如果再次查询该文档,将返回文档未找到的响应,如下图所示:
如果您尝试删除一个不存在的文档,返回如下错误信息:
# Kibana 操作
在 Kibana 中,删除文档的命令如下:
DELETE /shopping/_doc/1000
- 语法说明:
DELETE /shopping/_doc/1000
表示删除索引shopping
中 ID 为1000
的文档。
# 6. 条件删除文档 (POST
请求)
除了根据文档 ID 删除文档,您还可以通过指定查询条件删除多条符合条件的文档。此操作通常用于批量删除。
# Postman 操作
操作目的:根据条件批量删除文档,删除价格为 4000.00 的所有文档。
- 请求 URL:
http://127.0.0.1:9200/shopping/_delete_by_query
- 请求方法:
POST
操作步骤:
- 向 Elasticsearch 中添加两条数据:
{
"title":"小米手机",
"category":"小米",
"images":"https://cdn.jsdelivr.net/gh/Kele-Bingtang/static/user/avatar2.png",
"price":4000.00
}
2
3
4
5
6
{
"title":"华为手机",
"category":"华为",
"images":"https://cdn.jsdelivr.net/gh/Kele-Bingtang/static/user/avatar2.png",
"price":4000.00
}
2
3
4
5
6
添加数据的操作截图如下:
- 使用条件删除 API 删除价格为 4000.00 的所有文档。
请求体:
{
"query":{
"match":{
"price":4000.00
}
}
}
2
3
4
5
6
7
发送请求的截图如下:
响应结果说明:
{
"took【耗时】": 175, // 操作耗时,单位为毫秒
"timed_out【是否超时】": false, // 是否超时,false 表示未超时
"total【总数】": 2, // 符合条件的文档总数
"deleted【删除数量】": 2, // 实际删除的文档数量
"batches": 1,
"version_conflicts": 0,
"noops": 0,
"retries": {
"bulk": 0,
"search": 0
},
"throttled_millis": 0,
"requests_per_second": -1.0,
"throttled_until_millis": 0,
"failures": [] // 删除过程中发生的失败
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
- total: 表示总共有 2 条文档符合删除条件。
- deleted: 表示成功删除了 2 条文档。
# Kibana 操作
在 Kibana 中,您可以先添加两条数据:
POST /shopping/_doc/1000
{
"title":"小米手机",
"category":"小米",
"images":"https://cdn.jsdelivr.net/gh/Kele-Bingtang/static/user/avatar2.png",
"price":4000.00
}
2
3
4
5
6
7
POST /shopping/_doc/2000
{
"title":"华为手机",
"category":"华为",
"images":"https://cdn.jsdelivr.net/gh/Kele-Bingtang/static/user/avatar2.png",
"price":4000.00
}
2
3
4
5
6
7
然后通过条件删除命令删除价格为 4000.00 的文档:
POST /shopping/_delete_by_query
{
"query":{
"match":{
"price":4000.00
}
}
}
2
3
4
5
6
7
8
# 7. 总结
- 创建文档使用
POST
请求,文档以 JSON 格式存储,您可以选择自动生成 ID 或手动指定 ID。 - 查询文档使用
GET
请求,查询时需提供文档的唯一标识符(ID)。 - 修改文档可通过
POST
请求进行覆盖更新,或使用_update
API 进行部分字段的修改。 - 删除文档使用
DELETE
请求,删除文档是逻辑删除,并不会立即从磁盘中移除。 - 条件删除使用
_delete_by_query
API,可以根据查询条件删除多个文档。
这些操作类似于关系型数据库中的增删改查操作,但 Elasticsearch 提供了更灵活的查询条件与分片存储功能,使得处理大规模数据更加高效。