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