如何基于字符串字段更新弹性搜索

时间:2016-07-27 13:13:41

标签: elasticsearch

我有一个银行帐户数据集,其中包含字段account number,state,firstname,lastname.iam,编写以下命令以更新从州CA到antony的客户的所有firstname记录。

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,   " TIMED_OUT" :假的,   "总" :0,   "更新" :0,   "批次" :0,   " version_conflicts" :0,   " noops" :0,   "重试" :0,   "故障" :[] }

所有记录都没有更新。

提前感谢。

3 个答案:

答案 0 :(得分:1)

由于您的state字段为analyzed(默认情况下),您需要使用match查询而不是term字段(或保留term }查询但小写CAca

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"
 }
}'

答案 1 :(得分:0)

如果有人只想通过Kibana做到这一点,只需使用此脚本作为示例在Kibana中添加Dev Tools redactor,就可以了:

<?xml version="1.0" encoding="UTF-8"?>
<classpath>
        <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.8"/>
        <classpathentry kind="src" path="src"/>
        <classpathentry kind="output" path="bin"/>
        <classpathentry exported="true" kind="lib" path="lib/commons-logging-1.2.jar"/>
</classpath>

答案 2 :(得分:-2)

如果要更新已归档状态的映射,则首先需要删除映射并在2.x中重新创建,因为更新它时不会在Es 2.2中正确更新映射。

根据Elatic搜索文档:   我们可以更新地图以添加新字段,但我们无法将现有字段从已分析更改为not_analyzed。

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

删除映射后,您可以使用相同的备份映射并更新状态字段,如下所示:           “州”:{             “type”:“string”,             “index”:“not_analyzed”           },

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