当前位置: 首页 > 面试题库 >

Elasticsearch部分更新脚本:清除数组并替换为新值

丌官利
2023-03-14
问题内容

我有类似的文件:

{
  MyProp: ["lorem", "ipsum", "dolor"]
  ... lots of stuff here ...
}

我的文档可能很大(但这些MyProp字段不是很大),并且从头开始生成它们很昂贵。

有时我需要更新这些批次-因此进行 部分 更新(节省“索引客户端”的处理能力和带宽,从而节省时间)并用新值替换MyProp值将是有益的。

原始文件示例:

{
  MyProp: ["lorem", "ipsum", "dolor"]
  ... lots of stuff here ...
}

更新文档的示例(或更确切地说,外观):

{
  MyProp: ["dolor", "sit"]
  ... lots of stuff here ...
}

从我所看到的,这包括脚本。

谁能用剩下的难题启发我?

赏金添加:

如果可能的话,我还想在批处理语句中提供一些说明。


问题答案:

您可以使用按查询更新API进行批量更新。从ES
2.3开始,此方法有效,否则您需要安装插件。

POST index/_update_by_query
{
  "script": {
    "inline": "ctx._source.myProp += newProp",
    "params": {
      "newProp": "sit"
    }
  },
  "query": {
    "match_all": {}
  }
}

当然,您可以使用任何查询,以选择MyProp需要更新的文档。例如,您可以查询选择具有某些特定MyProp值要替换的文档。

上面只会将一个新值添加到现有数组。如果需要完全替换MyProp阵列,则还可以将脚本更改为此:

POST index/_update_by_query
{
  "script": {
    "inline": "ctx._source.myProp = newProps",
    "params": {
      "newProps": ["dolor", "sit"]
    }
  },
  "query": {
    "match_all": {}
  }
}

请注意,您还需要启用动态脚本才能使其正常工作。

更新

如果您只想更新单个文档,则可以使用部分文档更新API,如下所示:

POST test/type1/1/_update
{
    "doc" : {
        "MyProp" : ["dolor", "sit"]
    }
}

这将有效替换MyProp指定文档中的数组。

如果您想走批量路线,则不需要编写脚本即可实现所需的功能:

POST index/type/_bulk
{ "update" : {"_id" : "1"} }
{ "doc" : {"MyProp" : ["dolor", "sit"] } }
{ "update" : {"_id" : "2"} }
{ "doc" : {"MyProp" : ["dolor", "sit"] } }


 类似资料:
  • 问题内容: 这是我的文件 我想在数组字段“ b”中找到元素并更新整个对象。我尝试了此脚本,但它没有更新。有任何想法吗? 问题答案: 使用此代替:

  • 问题内容: 我在MySQL数据库中有一个带有以下各列的表 网址就像: 我想将所有网址更新到另一个域 保持文件名不变。 我必须运行什么查询? 问题答案:

  • 问题内容: 我有一个,其中有一些选择。当按下“确定”按钮时,我希望它清除内容并添加新内容。我已经尝试过,但是弹出的问题是新的。我究竟做错了什么? 问题答案: 解决方案很简单:使用CardLayout并让此布局管理器为您完成所有繁重的工作。有关如何执行此操作的更多详细信息,请参见教程:如何使用CardLayout。 至于您的代码,请注意,实际上它在启动时实际上创建了两个JFrame,如果按下JBut

  • 问题内容: 我想在每个更新时间将一个对象添加到字段中。 例如,我有一个文档: 下次,我想在测试字段中添加一个对象并保存旧对象。结果是: 如何实现? 编辑 我使用脚本: 但是,我得到了例外: 编辑 现在,我想添加一个字段以确保更新或插入对象。例如: 当我更新字段时,当id存在时,我将更新对象。相反,我将插入对象。 问题答案: 我建议尝试这样的脚本,该脚本在参数中带有两个参数。它将检查任何嵌套对象是否

  • /A/B/C/whatever不是固定的,是动态的,需要用 /1/2/3/whatever之类的东西替换,我喜欢像下面这样改变它,保持最后一部分/完整。 我运行下面的查询 正确返回需要更换的零件 一般的更新是,我从一个字符串的UPDATE和REPLACE部分理解为 因此,我要更新和替换的最后一个查询是 但它给出了以下错误 子查询返回超过1的值。当子查询如下时,这是不允许的=,!=, 我怀疑子查询的

  • 问题内容: 我需要使用REPLACE编写一条sql更新语句。字符串看起来像’SE * 88 * 000000001’。我需要替换两个星号“ *”之间的数字。除了要替换的数字始终在两个星号之间之外,这里没有其他模式。在这种情况下可以使用通配符吗? 感谢你的帮助。 谢谢! 问题答案: 或者,如果要替换的是一个特定的数字,那么它将更加简单: