bulk 批量操作
bulk 是 elasticsearch 提供的一種批量增删改的操作API。
bulk 對 JSON串 有着嚴格的要求。每個JSON串 不能換行 ,隻能放在同一行,同時, 相鄰的JSON串之間必須要有換行 (Linux下是\n;Window下是\r\n)。bulk的每個操作必須要 一對JSON串 (delete文法除外)。
bulk 請求體如下:
{ action: { metadata }}\n
{ request body }\n
{ action: { metadata }}\n
{ request body }\n
action必須是以下幾種:
行為 | 解釋 |
create | 如果文檔不存在就建立,但如果文檔存在就傳回錯誤 |
index | 如果文檔不存在就建立,如果文檔存在就更新 |
update | 更新一個文檔,如果文檔不存在就傳回錯誤 |
delete | 删除一個文檔,如果要删除的文檔id不存在,就傳回錯誤 |
其實可以看得出來 index 是比較常用的。 bulk 請求不是原子操作,它們不能實作事務。每個請求操作時分開的,是以每個請求的成功與否不幹擾其它操作。
傳回:
# bulk批量的混合操作,一般不推薦這種使用,項目中也用的極少。
PUT /_bulk
{ "create" : { "_index" : "ad", "_id" : "6" }}
{ "doc" : {"name" : "bulk"}}
{ "index" : { "_index" : "ad", "_id" : "6" }}
{ "doc" : {"name" : "bulk"}}
{ "delete":{ "_index" : "ad", "_id" : "1"}}
{ "update":{ "_index" : "ad", "_id" : "3"}}
{ "doc" : {"name" : "huawei p20"}}
# 輸出結果
{
"took" : 77,
# 如果任意一個文檔出錯,這裡傳回true,
"errors" : true,
# items數組,它羅列了每一個請求的結果,結果的順序與我們請求的順序相同
"items" : [
{
# create這個文檔已經存在,是以異常
"create":{
"_index":"ad",
"_type":"_doc",
"_id":"6",
"status":409,
"error":{
"type":"version_conflict_engine_exception",
"reason":"[6]: version conflict, document already exists (current version [1])",
"index_uuid":"90zLKRHyT02kyN148mQpqg",
"shard":"0",
"index":"ad"
}
}
},
# index這個文檔已經存在,會覆寫
{
"index":{
"_index":"ad",
"_type":"_doc",
"_id":"6",
"_version":2,
"result":"updated",
"_shards":{
"total":2,
"successful":1,
"failed":0
},
"_seq_no":11,
"_primary_term":3,
"status":200
}
},
{
"delete":{
"_index":"ad",
"_type":"_doc",
"_id":"1",
"_version":2,
"result":"deleted",
"_shards":{
"total":2,
"successful":1,
"failed":0
},
"_seq_no":12,
"_primary_term":3,
"status":200
}
},
{
"update":{
"_index":"ad",
"_type":"_doc",
"_id":"3",
"_version":2,
"result":"updated",
"_shards":{
"total":2,
"successful":1,
"failed":0
},
"_seq_no":13,
"_primary_term":3,
"status":200
}
}
]
}
測試資料準備
# 測試資料準備
PUT example
PUT example/_mapping
{
"properties":{
"id":{
"type":"long"
},
"name":{
"type":"text"
},
"counter":{
"type":"integer"
},
"tags":{
"type":"text"
}
}
}
批量插入
# 批量插入
POST /example/_bulk
{"index": {"_id": 1}}
{"id":1, "name":"admin", "counter":10, "tags":["red", "black"]}
{"index": {"_id": 2}}
{"id":2, "name":"張三", "counter":20, "tags":["green", "purple"]}
{"index": {"_id": 3}}
{"id":3, "name":"李四", "counter":30, "tags":["red", "blue"]}
{"index": {"_id": 4}}
{"id":4, "name":"tom", "counter":40, "tags":["orange"]}
# 輸出結果
{
"took":7,
"errors":false,
"items":[
{
"index":{
"_index":"example",
"_type":"_doc",
"_id":"1",
"_version":1,
"result":"created",
"_shards":{
"total":2,
"successful":1,
"failed":0
},
"_seq_no":0,
"_primary_term":1,
"status":201
}
},
{
"index":{
"_index":"example",
"_type":"_doc",
"_id":"2",
"_version":1,
"result":"created",
"_shards":{
"total":2,
"successful":1,
"failed":0
},
"_seq_no":1,
"_primary_term":1,
"status":201
}
},
{
"index":{
"_index":"example",
"_type":"_doc",
"_id":"3",
"_version":1,
"result":"created",
"_shards":{
"total":2,
"successful":1,
"failed":0
},
"_seq_no":2,
"_primary_term":1,
"status":201
}
},
{
"index":{
"_index":"example",
"_type":"_doc",
"_id":"4",
"_version":1,
"result":"created",
"_shards":{
"total":2,
"successful":1,
"failed":0
},
"_seq_no":3,
"_primary_term":1,
"status":201
}
}
]
}
批量修改
# 批量修改
POST /example/_bulk
{"update": {"_id": 1}}
{"doc": {"id":1, "name": "admin-02", "counter":11}}
{"update": {"_id": 2}}
{"script":{"lang":"painless","source":"ctx._source.counter += params.num","params":
{"num":2}}}
{"update":{"_id": 3}}
{"doc": {"name": "test3333name", "counter": 999}}
{"update":{"_id": 4}}
{"doc": {"name": "test444name", "counter": 888}, "doc_as_upsert" : true}
# 輸出結果
{
"took":149,
"errors":false,
"items":[
{
"update":{
"_index":"example",
"_type":"_doc",
"_id":"1",
"_version":2,
"result":"updated",
"_shards":{
"total":2,
"successful":1,
"failed":0
},
"_seq_no":4,
"_primary_term":1,
"status":200
}
},
{
"update":{
"_index":"example",
"_type":"_doc",
"_id":"2",
"_version":2,
"result":"updated",
"_shards":{
"total":2,
"successful":1,
"failed":0
},
"_seq_no":5,
"_primary_term":1,
"status":200
}
},
{
"update":{
"_index":"example",
"_type":"_doc",
"_id":"3",
"_version":2,
"result":"updated",
"_shards":{
"total":2,
"successful":1,
"failed":0
},
"_seq_no":6,
"_primary_term":1,
"status":200
}
},
{
"update":{
"_index":"example",
"_type":"_doc",
"_id":"4",
"_version":2,
"result":"updated",
"_shards":{
"total":2,
"successful":1,
"failed":0
},
"_seq_no":7,
"_primary_term":1,
"status":200
}
}
]
}
批量删除
# 批量删除
POST /example/_bulk
{"delete": {"_id": 1}}
{"delete": {"_id": 2}}
{"delete": {"_id": 3}}
{"delete": {"_id": 4}}
# 輸出結果
{
"took":7,
"errors":false,
"items":[
{
"delete":{
"_index":"example",
"_type":"_doc",
"_id":"1",
"_version":3,
"result":"deleted",
"_shards":{
"total":2,
"successful":1,
"failed":0
},
"_seq_no":8,
"_primary_term":1,
"status":200
}
},
{
"delete":{
"_index":"example",
"_type":"_doc",
"_id":"2",
"_version":3,
"result":"deleted",
"_shards":{
"total":2,
"successful":1,
"failed":0
},
"_seq_no":9,
"_primary_term":1,
"status":200
}
},
{
"delete":{
"_index":"example",
"_type":"_doc",
"_id":"3",
"_version":3,
"result":"deleted",
"_shards":{
"total":2,
"successful":1,
"failed":0
},
"_seq_no":10,
"_primary_term":1,
"status":200
}
},
{
"delete":{
"_index":"example",
"_type":"_doc",
"_id":"4",
"_version":3,
"result":"deleted",
"_shards":{
"total":2,
"successful":1,
"failed":0
},
"_seq_no":11,
"_primary_term":1,
"status":200
}
}
]
}