我知道Elastic Search目前不支持按查询批量更新Lucene,但有没有其他选择不涉及安装ElasticSearch扩展?
例如,是否有任何变通方法可以执行:
UPDATE users SET temp = 1 WHERE temp = 0;
使用批量方法?或者其他一些我不知道的方法?
我刚接触Elastic Search作为一个实体,所以我不知道这些细节,但我已经阅读了很多关于它一次更新一个的能力,但这会耗费数百个时间。数千行。
只是想找个人指出我正确的方向。
答案 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 Elastica为scrolling和bulk提供了一些帮助函数。
答案 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