2016-06-01 46 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