【问题标题】:how to update in elastic search based on a string field如何根据字符串字段在弹性搜索中进行更新
【发布时间】:2019-02-05 21:16:09
【问题描述】:

我有一个银行账户数据集,其中包含字段帐号、状态、名字、姓氏。iam 编写以下命令将客户的所有名字记录从州 CA 更新为安东尼。

curl -XPOST 'localhost:9200/bank/_update_by_query?pretty' -d '{
 "query" : {
  "term" : {"state":"CA"}
 },
 "script" : {
  "inline" : "ctx._source.firstname = a",
  "params" : {
   "a" : "antony"
  },
  "lang" : "groovy"
 }
}'

结果:

{ “接受”:3, “超时”:假, “总计”:0, “更新”:0, “批次”:0, “版本冲突”:0, “noops”:0, “重试”:0, “失败”:[] }

没有任何记录得到更新。

提前致谢。

【问题讨论】:

  • 你运行的是哪个版本的 ES?你确定你有enabled dynamic scripting
  • 版本 2.3.4。是的,我启用了动态脚本
  • state 字段analyzed 还是not_analyzed?即,如果您单独运行查询,您会得到多少个文档?
  • 我在索引时没有提及任何内容,并且有 8 个具有状态 CA 的文档

标签: elasticsearch


【解决方案1】:

由于您的state 字段是analyzed(默认情况下),您需要使用match 查询而不是term 一个(或保留term 查询但小写CA 到@987654328 @)

curl -XPOST 'localhost:9200/bank/_update_by_query?pretty' -d '{
 "query" : {
  "match" : {"state":"CA"}
 },
 "script" : {
  "inline" : "ctx._source.firstname = a",
  "params" : {
   "a" : "antony"
  },
  "lang" : "groovy"
 }
}'

【讨论】:

【解决方案2】:

如果有人只想通过 Kibana 执行此操作,只需将此脚本作为示例添加到 Kibana 中的开发工具编辑器中,您可以在这里:

POST persons/_update_by_query?conflicts=proceed
{
  "query": {
    "term": {"person_id": 249917}
  },
  "script": {
    "inline": "ctx._source.dri_for_buyers = 4"
  }
}

【讨论】:

    【解决方案3】:

    如果您想更新您提交状态的映射,那么您首先需要删除映射并在 2.x 中重新创建,因为在更新时它不会在 Es 2.2 中正确更新您的映射。

    根据 Elatic 搜索文档我们可以更新映射以添加新字段,但不能将现有字段从已分析更改为未分析。

    首先,您可以备份您的映射。然后使用下面的链接将其删除。 curl -XDELETE 'http://host.sachin.com:9999/ecmviews/?pretty'

    删除映射后,您可以使用相同的备份映射并更新状态字段,如下所示: “状态” : { “类型”:“字符串”, “索引”:“未分析” },

    并使用以下命令更新映射 json: curl -XPUT 'http://host.sachin.com:9999/ecmviews' -d '{ 您的映射 json 没有 curl 备份 } .它将使用 ack:true 作为响应更新映射。 更新映射后,您可以尝试查询。它会起作用的。

    【讨论】:

    猜你喜欢
    • 2020-02-04
    • 2015-01-16
    • 1970-01-01
    • 1970-01-01
    • 2021-01-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-25
    相关资源
    最近更新 更多