我知道由于 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有一些辅助函数 scrolling和 bulk .
关于php - 在 Elasticsearch 中按查询批量更新?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27389357/