2016-06-01 55 views
0

任何想法如何在elasticsearch 1.7索引上更新多個文檔? 我見過2.3的文檔,它可以通過查詢API調用更新,但我無法更新這個特定的實例,我似乎無法在那裏找到這個功能。使用elasticsearch更新多個文檔1.7.5

感謝

回答

4

一般來說,你可以更新Elasticsearch的Bulk API(指的1.7。版本實況)多個文檔。

在這裏你可以看到正常的update(通過curl命令)和批量更新之間的區別。

正常更新:

curl -XPOST 'localhost:9200/index1/type1/id1/_update' -d '{ 
    "name" : "updated John" 
} 

批量更新:

POST /_bulk 
{ "update": { "_index": "index1", "_type": "type1", "_id": "id1", "_retry_on_conflict" : 3} } 
{ "doc" : {"name" : "updated John"} } 
{ "update": { "_index": "index1", "_type": "type1", "_id": "id1", "_retry_on_conflict" : 3} } 
{ "doc" : {"name" : "The second update for John"} } 

BTW:批量請求是最好,如果你有許多文件操作。這裏是詳細描述它的docu


編輯: 要更新與查詢匹配的某些文件,您可以使用ElasticSearch Update By Query Plugin爲ES 1.7。 順便說一句:對於新ES版本,此功能是內置的:Update By Query API

下面是語法插件的例子:

curl -XPOST 'localhost:9200/index1/_update_by_query' -d ' 
{ 
    "query": { 
    "filtered": { 
     "filter": { 
     "bool": { 
      "must": [ 
      { 
       "term": { 
       "Category": "YourCategoryValueToSearchFor" 
       } 
      } 
      ] 
     } 
     } 
    } 
    }, 
    "script" : "ctx._source.category = \"NewCategoryValue\"; ctx._source.category2 = \"OptionallyUpdateAnotherField\";" 
}' 

要做到這一點,你還必須啓用腳本在您的elasticsearch。 yml config:

script.disable_dynamic: false 
script.inline: on 
script.indexed: on 
+0

嗯,謝謝。我發現該文檔。然而,讓我們說我有一個標準化的文件,有一個「類別」字段。我需要更新與其匹配的所有文檔的類別。有沒有辦法直接做到這一點,而無需查詢它們,然後從結果中編寫更新請求?我正在談論1.000.000以上的文檔,因此在php中實現它並不是一件非常便宜的事情。 – overburn

+0

啊好吧。我爲你更新了我的答案! – Hansa

+0

謝謝你,我設法做到了。 – overburn

相關問題