bulk批量增刪改
阿新 • • 發佈:2018-12-17
1.bulk語法格式:
注意: bulk api對json的語法,有嚴格的要求,每個json串不能換行,只能放在一行,多個型別的json串之間,必須換行
POST /_bulk {"delete":{"索引名稱":"索引值","型別名稱":"型別值","id名稱":id值}} {"create":{"索引名稱":"索引值","型別名稱":"型別值","id名稱":id值}} {實際資料存放的地方} {"index":{"索引名稱":"索引值","型別名稱":"型別值","id名稱":id值}} {實際資料存放的地方} {"update":{"索引名稱":"索引值","型別名稱":"型別值","id名稱":id值}} {"doc":{實際資料存放的地方}}
2.可操作的型別:
2.1:delete:刪除一個文件,只要一個json串就行了
2.2:create: PUT/index/type/id,強制建立一個文件
2.3:index:普通的PUT操作,可以是新建文件,也可以是全量替換文件
2.4:update:執行partial update操作
3.程式碼:
POST /_bulk {"delete":{"_index":"test_index","_type":"test_type","_id":3}} 刪除id為3的資料 {"create":{"_index":"test_index","_type":"test_type","_id":20}} 建立一個id為20的文件 {"test_field":"test20"} 往文件裡面加入資料(test20) {"index":{"_index":"test_index","_type":"test_type","_id":10}} 全量替換 id為10的文件 {"test_field":"test10"} 替換文件內的全部資料 {"update":{"_index":"test_index","_type":"test_type","_id":1}} 修改id為1的文件 {"doc":{"test_field2":"partial update test1"}} 更新資料 注意:bulk操作中,任意一個操作失敗,是不會影響其他的操作的,但是在返回結果裡,會有一個異常日誌
4.執行結果
{ "took" : 333, "errors" : false, "items" : [ { "delete" : { 刪除 "_index" : "test_index", 索引 "_type" : "test_type", 型別 "_id" : "3", id "_version" : 4, 版本 "result" : "deleted", 刪除結果 "_shards" : { "total" : 2, "successful" : 1, 刪除成功 "failed" : 0 }, "_seq_no" : 8, "_primary_term" : 3, "status" : 200 } }, { "create" : { 建立 "_index" : "test_index", 索引 "_type" : "test_type", 型別 "_id" : "20", id "_version" : 1, 版本 "result" : "created", 建立結果 "_shards" : { "total" : 2, "successful" : 1, 建立成功 "failed" : 0 }, "_seq_no" : 7, "_primary_term" : 3, "status" : 201 } }, { "index" : { "_index" : "test_index", "_type" : "test_type", "_id" : "10", "_version" : 6, "result" : "updated", "_shards" : { "total" : 2, "successful" : 1, "failed" : 0 }, "_seq_no" : 14, "_primary_term" : 3, "status" : 200 } }, { "update" : { "_index" : "test_index", "_type" : "test_type", "_id" : "1", "_version" : 3, "result" : "updated", "_shards" : { "total" : 2, "successful" : 1, "failed" : 0 }, "_seq_no" : 5, "_primary_term" : 3, "status" : 200 } } ] }
圖解:
驗證:(這裡使用批量查詢驗證)
程式碼:
GET /test_index/test_type/_mget
{
"ids":[3,20,10,1]
}
驗證結果
{
"docs" : [
{
"_index" : "test_index",
"_type" : "test_type",
"_id" : "3",
"found" : false 已刪除,顯示false 表示不存在
},
{
"_index" : "test_index",
"_type" : "test_type",
"_id" : "20",
"_version" : 1,
"found" : true, 建立成功
"_source" : {
"test_field" : "test20" 資料
}
},
{
"_index" : "test_index",
"_type" : "test_type",
"_id" : "10",
"_version" : 6, 首先看版本號,已經不一樣了,表示全量覆蓋了
"found" : true,
"_source" : {
"test_field" : "test10" 資料已經改變了
}
},
{
"_index" : "test_index",
"_type" : "test_type",
"_id" : "1",
"_version" : 3,
"found" : true,
"_source" : {
"test_field1" : "test field1",
"test_field2" : "partial update test1" 更新的資料
}
}
]
}
圖解:
如果操作的是同一index和同一索引裡面的資料
格式:
POST/index/type/_bulk
{"delete":{"id名稱":id值}}
{"create":{"id名稱":id值}}
{實際資料存放的地方}
{"index":{"id名稱":id值}}
{實際資料存放的地方}
{"update":{"id名稱":id值}}
{"doc":{實際資料存放的地方}}
程式碼:
POST /test_index/test_type/_bulk
{"delete":{""_id":3}}
{"create":{"_id":20}}
{"test_field":"test20"}
{"index":{"_id":10}}
{"test_field":"test10"}
{"update":{"_id":1}}
{"doc":{"test_field2":"partial update test1"}} 也可以這樣寫
bulk size最佳的大小:
bulk request會載入到記憶體裡,如果太大的話,效能反而會下降,因此需要反覆嘗試一個最佳的bulk seize。
一般從10005000條資料開始,嘗試逐條增加,大小最好在515MB之間