ElasticSearch对历史数据增加字段并对历史数据附初值

elasticsearch如何为类型添加字段并赋初值

elasticsearch如何为指定索引中类型添加字段并赋初值,就像数据库中添加字段为老的数据赋初始值一样。

用update_by_query结合script可以办到,例如:

POST my_index/_update_by_query
{
  "script": {
    "lang": "painless",
    "inline": "if (ctx._source.status_code == null) {ctx._source.status_code= '02'}"
  }
}

在ES里为已有索引增加一个新字段以后,老的数据并不会自动就拥有了这个新字段,也就不可能给他一个所谓的默认值。ES里的数据都是文档型的,修改一个文档只能是对原文档做更新,也就是只能借助于重新索引的手段。

NULL在ES里的含义和RDBMS非常不同。 

NULL的意思是索引的时候,某个字段没有被赋值,例如文档有"city","title"和"status_code"三个字段。

索引的时候漏掉status_code字段:

PUT my_index/my_type/1
{
  "city": "NJ",
  "title": "Document 1"
}

或者显式给status_code一个空值:

PUT my_index/my_type/2
{
  "city": "BJ",
  "title": "Document 2",
   "status_code": null
}

示例里的两条文档的status_code这个字段都是被忽略,不做索引的,因此也就无法做所谓的空值搜索。

因此,为了支持做“status_code = NULL”这样的搜索,就可以配置一个可选的null_value选项:

"properties": {
        "status_code": {
          "type":       "keyword",
          "null_value": "NULL"
        }
      }

null_value的值可以任意指定,但是必须和status_code的字段类型一致。 比如配置的keyword类型,null_value就必须是字符型。 如果是long类型,null_value就必须是个数字。 类型不一致会报错。

POST my_index/_update_by_query

{

    "script":{

        "lang":"painless",

        "inline":"if (ctx._source.status == null) {ctx._source.status= '02'}"

    }

}

它自动为我的索引的mapping创建了status这个字段,并且赋值成功。

字段描述如下:

 "status" : {

            "type" : "text",

            "fields" : {

              "keyword" : {

                "type" : "keyword",

                "ignore_above" : 256

              }

            }

          },

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值