弹性-在单个请求中更新多个文档

奥利弗·道尔顿(Oliver Dalton)

我需要每隔几分钟在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] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章