弹性 - 在单个请求中更新多个文档
Elastic - updating multiple documents in a single request
我需要在 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 更新多个文档?我已经尝试过 Multiple search API ,它似乎不能用于此目的。如有任何帮助,我们将不胜感激!
如果可能,请尝试概括您的查询。
与其定位单个 itemId
,不如尝试使用 terms
query:
{
"query": {
"terms": {
"itemId": [
"1", "2", ...
]
}
},
"script": {
...
}
}
从外观上看,您的(看似简化的)脚本设置了 相同的 值,与文档 ID / itemId
无关。就是这样。
如果脚本确实根据文档 ID/itemIds
设置了 不同的 值,您可以使 params
多值:
"params": {
"updateValue1": "test1",
"updateValue2": "test2",
...
}
然后 dynamically access 他们:
...
def value_to_set = params['updateValue' + ctx._source['itemId']];
...
因此目标文档会更新为相应的值。
我需要在 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 更新多个文档?我已经尝试过 Multiple search API ,它似乎不能用于此目的。如有任何帮助,我们将不胜感激!
如果可能,请尝试概括您的查询。
与其定位单个 itemId
,不如尝试使用 terms
query:
{
"query": {
"terms": {
"itemId": [
"1", "2", ...
]
}
},
"script": {
...
}
}
从外观上看,您的(看似简化的)脚本设置了 相同的 值,与文档 ID / itemId
无关。就是这样。
如果脚本确实根据文档 ID/itemIds
设置了 不同的 值,您可以使 params
多值:
"params": {
"updateValue1": "test1",
"updateValue2": "test2",
...
}
然后 dynamically access 他们:
...
def value_to_set = params['updateValue' + ctx._source['itemId']];
...
因此目标文档会更新为相应的值。