我需要每隔几分钟在Elastic中更新几千个项目,但是不幸的是,重新索引对我来说不是一种选择。根据我的研究,更新项目的最佳方法是使用_update_by_query-我已经成功更新了像这样的单个文档-
{
"query": {
"match": {
"itemId": {
"query": "1"
}
}
},
"script": {
"source": "ctx._source.field = params.updateValue",
"lang": "painless",
"params": {
"updateValue": "test",
}
}
}
var response = await Client.UpdateByQueryAsync<dynamic>(q => q
.Index("masterproducts")
.Query(q => x.MatchQuery)
.Script(s => s.Source(x.Script).Lang("painless").Params(x.Params))
.Conflicts(Elasticsearch.Net.Conflicts.Proceed)
);
尽管这种方法行之有效,但是它却会产生数千个请求,因此效率极低-是否可以通过一种方法在单个请求中更新具有匹配ID的多个文档?我已经尝试过多个搜索API,但似乎无法用于此目的。任何帮助,将不胜感激!
如果可能的话,请尝试概括您的查询。
而不是针对单个目标itemId
,也许尝试使用terms
查询:
{
"query": {
"terms": {
"itemId": [
"1", "2", ...
]
}
},
"script": {
...
}
}
从外观上看,您的(看似简化的)脚本设置了相同的值,而与文档ID /无关itemId
。就是这样。
如果脚本确实确实基于文档ID /设置了不同的值itemIds
,则可以设置params
多值:
"params": {
"updateValue1": "test1",
"updateValue2": "test2",
...
}
然后动态访问它们:
...
def value_to_set = params['updateValue' + ctx._source['itemId']];
...
因此目标文档将使用相应的值进行更新。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句