嵌套更新查询如何使用 poco 而不是编写脚本



我们有一个包含大约 200 万个文档的弹性索引,我需要一种方法来基于单个唯一字段更新它们的列表。我尝试的是使用 Nest 中的 updatebyquery 函数,但我找到的文档要求我在代码中手动编写更新脚本,如下所示:

foreach (var document in batch)
{
var script = "ctx._source.brand_no = params.brandNo;" +
"ctx._source.order_no = params.orderNo";
var paramDict = new Dictionary<string, object>(){
{"brandNo",document.BrandNo},
{"orderNo",document.OrderNo}
};
await _clientProvider.ElasticClient
.UpdateByQueryAsync<Orderline>(x =>
x.Index(indexName).Query(q =>
q.Term(t =>
t.Field(f =>
f.OrderLineID).Value(document.OrderLineID))).Script(s =>
s.Source(script).Params(paramDict))));
}

我的问题是我的 Orderline 类非常大,而且这个硬编码脚本非常容易出错且难以维护。

另一个问题是,此更新需要很长时间才能处理 200 万行。

我的问题是我的 Orderline 类非常大,而且这个硬编码脚本非常容易出错且难以维护。

按查询 API 更新仅支持使用脚本进行更新,因此您可以实现从给定 POCO 实例生成脚本的小组件,以减少脚本中出错的可能性。

另一个问题是,此更新需要很长时间才能处理 200 万行。

将文档索引到新索引中,并使用别名指向较新版本的索引是否适用于您的情况?更新/删除现有索引中的数百万个文档是一项相对昂贵的操作。

最新更新