php - 在 Elasticsearch 中按查询批量更新?

标签 php elasticsearch

我知道由于 Lucene,Elastic Search 目前不支持按查询批量更新,但是有没有不涉及安装 ElasticSearch 扩展的替代方案?

例如,是否有任何解决方法来执行:

UPDATE users SET temp = 1 WHERE temp = 0;

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

我是 Elastic Search 作为一个实体的新手,所以我不知道它的来龙去脉,但我已经阅读了很多关于它一次更新一个的能力,但是对于数十万行来说这太耗时了.

只是在找人为我指明正确的方向。

最佳答案

跟进 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 Elastica有一些辅助函数 scrollingbulk .

关于php - 在 Elasticsearch 中按查询批量更新?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27389357/

相关文章:

php - 如何在php上使用SQL查询按不同字段进行大规模排序?

php - 如何将所见即所得编辑的文本插入数据库

php - 如何避免 PHP/MYSQL 指数级减速?

elasticsearch - Elasticsearch 版本 2.3 到 5.1

elasticsearch - 在kibana3中的字段中查询多个字符串?

ruby-on-rails - 轮胎 gem : undefined method `detect'

php - 用 php 5 解析 json 不工作

php - 没有脚本标签 - 可靠吗?安全的?

Elasticsearch 按嵌套数组中的嵌套字段排序

python - 使用mongo-connector的部分单词搜索在Elasticsearch(elasticsearch-py)中不起作用