-
允許在一個請求中進行多個操作(create、index、update、delete),也就是可以在一次請求裡做很多事情bulk
- 也由于這個關系,是以bulk的請求體和其他請求的格式會有點不同
- bulk的請求模闆
- 分成action、metadata和doc三部份
- action : 必須是以下4種選項之一
-
(最常用) : 如果文檔不存在就建立他,如果文檔存在就更新他index
-
: 如果文檔不存在就建立他,但如果文檔存在就傳回錯誤create
- 使用時一定要在metadata設定
值,他才能去判斷這個文檔是否存在_id
- 使用時一定要在metadata設定
-
: 更新一個文檔,如果文檔不存在就傳回錯誤update
- 使用時也要給
值,且後面文檔的格式和其他人不一樣_id
- 使用時也要給
-
: 删除一個文檔,如果要删除的文檔id不存在,就傳回錯誤delete
- 使用時也必須在metadata中設定文檔
,且後面不能帶一個doc,因為沒意義,他是用_id
去删除文檔的_id
- 使用時也必須在metadata中設定文檔
-
- metadata : 設定這個文檔的metadata,像是
、_id
、_index
..._type
- doc : 就是一般的文檔格式
POST 127.0.0.1/mytest/doc/_bulk { action : { metadata } } { doc } { action : { metadata } } { doc } ....
- action : 必須是以下4種選項之一
- 分成action、metadata和doc三部份
- 具體執行個體
- bulk請求
POST 127.0.0.1/mytest/doc/_bulk //建立一筆資料 { "create" : { "_id": 1 } } { "color": "create black" } //建立一筆資料,因為id=1的文檔已經存在,是以會建立失敗 { "create" : { "_id": 1 } } { "color": "create black2" } //索引一筆資料 { "index" : { "_id": 2 } } { "color": "index red" } //索引一筆資料,但是index可以建立也可以更新,是以執行成功 { "index" : { "_id": 2 } } { "color": "index red2" } //索引一筆資料,不一定要設定id(index又能建立又能更新又不用設id,超好用) { "index": {} } { "color": "index blue" } //删除一筆文檔,注意delete後面不接一個doc { "delete" : { "_id": "2" } } //找不到此id的文檔,删除失敗 { "delete" : { "_id": "2" } } //更新一筆文檔,注意doc格式不太一樣 { "update" : { "_id": 1 } } { "doc": { "color": "update green"} } //更新一筆文檔,但因為此id的文檔不存在,是以更新失敗 { "update" : { "_id": 100 } } { "doc": { "color": "update green2"} }
- bulk請求
- bulk的傳回結果
- 因為在bulk中,每個action的執行結果都是獨立的,是以有幾個action,就會有幾個傳回結果,傳回結果如下
- 最上面會有一個
,表示這一次bulk請求中,是否有action出錯了errors
- 是以寫代碼時可以先檢查
這個值,如果是false,表示這次bulk請求全部通過,就不用再一一去檢查是否有action出錯,但如果是true,則必須去errors
一個一個檢查到底是哪個action出錯了items
- 是以寫代碼時可以先檢查
-
是一個數組,裡面則放著每個action對應的結果,上面的請求執行了9個action,是以傳回結果的items就會有9個items
- 傳回結果會依照action的順序排好,是以
的第一個結果就是請求時第一個action的執行結果items
- 傳回結果會依照action的順序排好,是以
{ "took": 22, "errors": true, "items": [ { "create": { "_index": "mytest", "_type": "doc", "_id": "1", "status": 201 } }, { "create": { "_index": "mytest", "_type": "doc", "_id": "1", "status": 409, "error": { "type": "version_conflict_engine_exception", "reason": "[doc][1]: version conflict, document already exists (current version [1])", "index_uuid": "hc_2I5efRMK3_RUC0HJGew", "shard": "3", "index": "mytest" } } }, { "index": { "_index": "mytest", "_type": "doc", "_id": "2", "status": 201 } }, { "index": { "_index": "mytest", "_type": "doc", "_id": "2", "status": 200 } } ... 5 RESULTS REMOVED ... ] }
- 最上面會有一個
- 因為在bulk中,每個action的執行結果都是獨立的,是以有幾個action,就會有幾個傳回結果,傳回結果如下
- 使用bulk要注意的地方
- 如果使用
,那麽就是在整個ES的範圍中插入資料,是以在metadata中要指定插入的index和type,優點是可以一次插入多筆資料到不同的索引127.0.0.1/_bulk
- 而如果使用
,就不用在metadata再次指定要插入的index和type,可以想像成是127.0.0.1/mytest/doc/_bulk
API幫我們自動填好了metadata的_bulk
和_index
,很友善_type
- 而如果使用
- 還有因為bulk和其他請求的格式不同,或是說基本上他已經不是正常的json格式了,是以在使用bulk時,HTTP header要使用
application/x-ndjson
- 而且每一行的結尾,都要使用
,如果是一般在postman寫請求不會有問題,但是如果是使用\n
來發送請求,就要使用curl
,才會使每一句的結尾都是--data-binary
\n
- 而且每一行的結尾,都要使用
- 如果使用