推荐链接:
总结——》【Java】
总结——》【Mysql】
总结——》【Redis】
总结——》【Kafka】
总结——》【Spring】
总结——》【SpringBoot】
总结——》【MyBatis、MyBatis-Plus】
总结——》【Linux】
总结——》【MongoDB】
总结——》【Elasticsearch】
一、概念
Elasticsearch的_bulk API可以让用户一次性批量索引、更新或删除多个文档,以提高索引效率和性能。
二、操作类型
Elasticsearch的_bulk API支持四种不同的操作类型: index、create、update、delete。
操作类型 | 描述 | 备注 |
---|---|---|
index | 插入文档 | 如果该文档已经存在,则覆盖已有的文档 |
create | 插入文档 | 如果该文档已经存在,则抛出异常 |
update | 更新文档 | 如果该文档不存在,则抛出异常(如果指定doc_as_upsert,则插入文档) |
delete | 删除文档 | 如果该文档不存在,则抛出异常 |
三、步骤
- 创建一个包含“操作类型"和“文档数据"的批处理请求体
- 将请求体POST到/_bulk端点
四、示例
Bulk API的请求体必须遵循一定的格式规则:
- 每个操作必须是一行记录并以"\n"分割
- 每个操作前面必须包含一个操作类型(index、create、update、delete)
- 每个操作后面必须包含一个JSON格式的文档或文档更新语句(对于update、delete操作)
- 所有操作必须包含在一个JSON格式的对象中
1、index
# 在"myindex"的索引中插入ID为1的文档,文档中包含一个字段"field1"
POST _bulk
{"index":{"_index":"myindex","_id":"1"}}
{"field1":"value1"}
2、create
# 在"myindex"的索引中插入ID为2的文档,文档中包含一个字段"field1"
POST _bulk
{"create":{"_index":"myindex","_id":"2"}}
{"field1":"value1"}
# 如果id为2的文档不存在,执行以上命令,则正常插入
# 如果id为2的文档已存在,执行以上命令,则会抛出以下异常
{
"took": 0,
"errors": true,
"items": [
{
"create": {
"_index": "myindex",
"_id": "1",
"status": 409,
"error": {
"type": "version_conflict_engine_exception",
"reason": "[1]: version conflict, document already exists (current version [1])",
"index_uuid": "Zc-GjYeEQeW6KpgnaqSBFA",
"shard": "0",
"index": "myindex"
}
}
}
]
}
3、update
# 在"myindex"的索引中更新ID为3的文档,将"field2"字段更新为"value2"。
POST _bulk
{"update":{"_index":"myindex","_id":"3"}}
{"doc":{"field2":"value2"}}
# 如果id为3的文档已存在,执行以上命令,则正常更新
# 如果id为3的文档不存在,执行以上命令,则抛出以下异常
{
"took": 2,
"errors": true,
"items": [
{
"update": {
"_index": "myindex",
"_id": "3",
"status": 404,
"error": {
"type": "document_missing_exception",
"reason": "[3]: document missing",
"index_uuid": "-IEQ1U3kT1OQyewX551vIg",
"shard": "0",
"index": "myindex"
}
}
}
]
}
# 在"myindex"的索引中更新ID为3的文档,将"field2"字段更新为"value2"。
POST _bulk
{"update":{"_index":"myindex","_id":"3"}}
{"doc":{"field2":"value2"},"doc_as_upsert":true}
# 如果id为3的文档已存在,执行以上命令,则正常更新
# 如果id为3的文档不存在,执行以上命令,则正常插入
4、delete
# 在"myindex"的索引中删除ID为1的文档
POST _bulk
{"delete":{"_index":"myindex","_id":"1"}}
# 如果id为1的文档已存在,执行以上命令,则正常删除
# 如果id为1的文档不存在,执行以上命令,不会抛出异常,但提示"not_found"
{
"took": 7,
"errors": false,
"items": [
{
"delete": {
"_index": "myindex",
"_id": "5",
"_version": 1,
"result": "not_found",
"_shards": {
"total": 2,
"successful": 1,
"failed": 0
},
"_seq_no": 5,
"_primary_term": 1,
"status": 404
}
}
]
}
五、注意
_bulk API可以一次性处理多个操作,提高索引效率和性能。它在处理大批量数据的时候特别有用。需要注意的是使用Bulk API可能会对系统造成额外的负载和性能消耗,因此建议在非生产环境中先进行测试并仔细考虑实施策略。