2016-07-30 48 views
2

是否有任何參數讓elasticsearch知道即使遇到錯誤也可以繼續下一條記錄?對於例如這工作正常。bulk API中的語法錯誤

DELETE /test 

PUT /test 

PUT /_bulk 
{ "index" : { "_index" : "test", "_type" : "type1", "_id" : "1" }} 
{ "field1" : "value1" } 
{ "create" : { "_index" : "test", "_type" : "type1", "_id" : "3" } } 
{ "field1" : "value3" } 

get /test/type1/_search 

如果出現語法錯誤,我寧願跳過該行並加載下一個。在以下情況下,我會插入ID 3即使ID 1失敗,原因是額外{第2行

PUT /_bulk 
{ "index" : { "_index" : "test", "_type" : "type1", "_id" : "1" }} 
{ "field1" : "value1" } { 
{ "create" : { "_index" : "test", "_type" : "type1", "_id" : "3" } } 
{ "field1" : "value3" } 
+0

批量停止任何錯誤?因爲根據我的知識,如果任何單個請求失敗,它將不會發生任何錯誤或發生任何錯誤。 –

+0

如果你運行上面的代碼,你會看到由於未關閉{兩個記錄失敗。雖然我預計第二張唱片會通過。 – shantanuo

+0

如果你留下未關閉的支架,那麼當文檔結束時,批量api將不理解。 Bulk對內部錯誤進行錯誤處理,而不是在請求中傳遞的錯誤。 –

回答

2

Elasticsearch批量更新不會操作錯誤停下來,而是你所遇到的問題是由於到程序員錯誤。問題是,如果請求中存在語法錯誤,那麼Elasticsearch無法解析您的請求。從批量更新文檔 - Why the funny format?

Elasticsearch進入網絡緩衝區,在那裏原始請求已被接收,並直接讀取數據。它使用換行符來標識和解析小行爲/元數據行,以便決定哪個分片應該處理每個請求。

這些原始請求被直接轉發到正確的分片。沒有冗餘的數據複製,沒有浪費的數據結構。整個請求過程在儘可能少的內存中處理。

如果某處出現語法錯誤,將無法識別動作/請求行。

+0

我希望它能通過程序員錯誤,就像它傳遞操作錯誤一樣。我正在嘗試導入大量的日誌數據。我的目標是儘可能多地導入數據,在我的情況下數據完整性無關緊要。 – shantanuo