在弹性搜索中按查询批量更新?

时间:2014-12-09 21:39:58

标签: php elasticsearch

我知道Elastic Search目前不支持按查询批量更新Lucene,但有没有其他选择不涉及安装ElasticSearch扩展?

例如,是否有任何变通方法可以执行:

UPDATE users SET temp = 1 WHERE temp = 0;

使用批量方法?或者其他一些我不知道的方法?

我刚接触Elastic Search作为一个实体,所以我不知道这些细节,但我已经阅读了很多关于它一次更新一个的能力,但这会耗费数百个时间。数千行。

只是想找个人指出我正确的方向。

3 个答案:

答案 0 :(得分:2)

跟进datashovel回答,您应该使用Elasticsearch scrolling API获取所需的文档,然后使用批量更新(或不使用)更新文档。

假设您的索引为users且doc_type为user,则类似于:

curl -XGET 'localhost:9200/users/user/_search?scroll=1m' -d '
{
    "constant_score": {
        "filter" : {
           "term" : {
               "temp" : 1
           }
        }
    }
}'

这将返回一个scroll_id(类似于c2Nhbjs2OzM0NDg1ODpzRlBLc0FXNlNyNm5JWUc1),然后您应该使用它来迭代结果,执行:

curl -XGET  'localhost:9200/_search/scroll?scroll=1m' \
    -d 'c2Nhbjs2OzM0NDg1ODpzRlBLc0FXNlNyNm5JWUc1'

直到没有任何点击。

在迭代时,您应该为批量更新创建一个列表,其中包含滚动返回的所有元素。

{ "update" : {"_id" : "1", "_type" : "user", "_index" : "users"} }
{ "doc" : {"temp" : 0} }
{ "update" : {"_id" : "2", "_type" : "user", "_index" : "users"} }
{ "doc" : {"temp" : 0} }
{ "update" : {"_id" : "3", "_type" : "user", "_index" : "users"} }
{ "doc" : {"temp" : 0} }

(您可以在bulk api docs

上查看有关如何执行此操作的更多详细信息

我不知道任何PHP,但Elasticsearch PHP API Elasticascrollingbulk提供了一些帮助函数。

答案 1 :(得分:0)

我认为这就是你要找的东西:

http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/docs-bulk.html

如果你想编写一个动态的“更新查询”(就像你的例子一样),你会编写一个脚本,告诉ElasticSearch在转换值时要遵循的逻辑。

这里有一些有用的例子:

http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/docs-update.html

答案 2 :(得分:0)

update_by_query已添加到2.3版本的elasticsearch中。

  

逐个查询API是新的,仍应予以考虑   实验。 API可能会以不倒退的方式发生变化   兼容。

https://www.elastic.co/guide/en/elasticsearch/reference/2.3/docs-update-by-query.html

好像你需要为更新部分编写一个脚本,所以这有点痛苦。

UPDATE users SET temp = 1 WHERE temp = 0;

==>

{
    "query": {
        "term": {
            "temp": 0
        }
    },
    "script": {
        "inline": "ctx._source.temp = 1"
    }
}

注意:要使此内联脚本版本生效,您需要启用内联脚本:

script.inline: true
script.indexed: true
script.disable_dynamic: false