【问题标题】:Nest updatebyquery how can i use a poco instead of writing the scriptNest updatebyquery 如何使用 poco 而不是编写脚本
【发布时间】:2018-10-22 13:33:39
【问题描述】:

我们有一个包含大约 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 万行。

【问题讨论】:

    标签: elasticsearch nest


    【解决方案1】:

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

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

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

    在您的情况下,将文档索引到新索引和using aliases 以指向较新版本的索引是否有效?更新/删除现有索引中的数百万个文档是一项相对昂贵的操作。

    【讨论】:

    • 这就是我们所采用的方法,结果证明重新索引是一个更好的解决方案
    • @JonasOlesen 很高兴它有帮助。您是否将其用于搜索用例?如果是这样,在这里使用带有版本索引的别名是一个很好的方法
    • 我们所做的是,我们重新索引我们当前的索引,然后我们从新的重新索引索引中删除更改的文档,然后我们再次插入它们。完成后,我们将新索引添加到别名中并删除旧索引,然后删除旧索引。
    猜你喜欢
    • 2010-12-11
    • 2018-10-13
    • 2021-08-12
    • 1970-01-01
    • 1970-01-01
    • 2010-09-15
    • 2015-10-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多