【问题标题】:Elastic - updating multiple documents in a single request弹性 - 在单个请求中更新多个文档
【发布时间】:2021-05-08 02:39:47
【问题描述】:

我需要在 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,它似乎不能用于此目的。任何帮助将不胜感激!

【问题讨论】:

标签: c# json elasticsearch nest


【解决方案1】:

如果可能,尝试概括您的查询。

不要针对单个itemId,或许可以尝试使用terms query

{
  "query": {
    "terms": {
      "itemId": [
        "1", "2", ...
      ]
    }
  },
  "script": {
    ...
  }
}

从外观上看,您的(看似简化的)脚本设置了 same 值,而与文档 ID /itemId 无关。就是这样。

如果脚本确实根据文档 ID / itemIds 设置了 不同 值,您可以将 params 设为多值:

"params": {
 "updateValue1": "test1",
 "updateValue2": "test2",
 ...
}

然后dynamically access他们:

...
def value_to_set = params['updateValue' + ctx._source['itemId']];
...

因此目标文档将更新为相应的值。

【讨论】:

    猜你喜欢
    • 2018-08-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-11
    • 2020-04-20
    • 1970-01-01
    • 1970-01-01
    • 2021-08-06
    相关资源
    最近更新 更多