elasticsearch,Php,elasticsearch" /> elasticsearch,Php,elasticsearch" />

Php 弹性搜索中的查询批量更新?

Php 弹性搜索中的查询批量更新?,php,elasticsearch,Php,elasticsearch,我知道由于Lucene的原因,ElasticSearch目前不支持按查询进行批量更新,但是有没有其他方法不涉及安装ElasticSearch扩展 例如,是否存在执行以下操作的变通方法: UPDATE users SET temp = 1 WHERE temp = 0; 使用批量方法?或者其他我不知道的方法 我不熟悉弹性搜索作为一个实体,所以我不知道细节,但我已经读了很多关于它一次更新一个的能力的书,但是这对于成百上千行来说太耗时了 只是想找个人给我指出正确的方向。我想这就是你要找的: 如果您

我知道由于Lucene的原因,ElasticSearch目前不支持按查询进行批量更新,但是有没有其他方法不涉及安装ElasticSearch扩展

例如,是否存在执行以下操作的变通方法:

UPDATE users SET temp = 1 WHERE temp = 0;
使用批量方法?或者其他我不知道的方法

我不熟悉弹性搜索作为一个实体,所以我不知道细节,但我已经读了很多关于它一次更新一个的能力的书,但是这对于成百上千行来说太耗时了


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

我想这就是你要找的:

如果您想编写一个动态“更新查询”(如您的示例),您可以编写一个脚本,告诉ElasticSearch在转换值时遵循的逻辑

这里有一些有用的例子:


在datashovel回答之后,您应该使用Elasticsearch获取所需的文档,然后使用批量更新(或不更新)更新文档

假设您的索引是
users
,而文档类型是
user
,则类似于:

curl -XGET 'localhost:9200/users/user/_search?scroll=1m' -d '
{
    "constant_score": {
        "filter" : {
           "term" : {
               "temp" : 1
           }
        }
    }
}'
这将返回一个滚动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} }
(您可以在上查看有关如何执行此操作的更多详细信息)


我不知道任何PHP,但Elasticsearch PHP API有一些用于和的帮助函数。

update\u by\u query
已在版本2.3中添加到Elasticsearch

查询更新API是新的,仍应予以考虑 实验的API可能会以不向后的方式进行更改 兼容

似乎您需要为更新部分编写脚本,所以这有点麻烦

UPDATE users SET temp = 1 WHERE temp = 0;
==>

注意:要使此内联脚本版本正常工作,您需要启用内联脚本:

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

我略知一二,但我不知道如何从选择需要更新的项目开始。我在第二个链接中找不到如何一次处理多个项目?请记住,关系数据库和基于文档的数据存储解决了不同的问题。如果您需要从关系数据库中获得的性能,以便快速/高效地更新所有记录,那么您可能应该使用关系数据库来解决这些问题。另外需要记住的是,ElasticSearch是为在分布式体系结构中使用而构建的,因此,在批量更新中,您不必像在关系数据库中一样依赖同样的保证。下面@vierja提到的Scroll API是批量更新的一个好选择。感谢您的详细回答。这条路线对我来说是新的,所以我需要一些时间来研究。但是谢谢你给我指出了正确的方向。
script.inline: true
script.indexed: true
script.disable_dynamic: false