elasticsearch的空值处理

本文基于es7.1版本。

针对空值的测试,使用了如下几种值:null、“null”、“”、[ ];

测试代码太长,先说结论,对于所有类型,null、“”、[ ]均可以被索引,但是无法检索。对于部分数据类型,由于“null”不能转换为对应的类型,因此索引时会报错,但是对于keywork、text等可以索引string类型的字段,“null”被视作普通的string,可被索引与检索。不可以被直接检索的原因,套用es权威指南中的一句原话: If a field has no values, how is it stored in an inverted index?现实是,空值字段在倒排索引中没有存储,it isn’t stored at all。

需要注意的是,如果是基于es2.x版本,可使用exists,或者missing来检索非null/null值。分别等同于关系数据库中的is not null 和is null。但是missing在7.1版本中已不可用。直接使用会报错:“no [query] registered for [missing]”。

在程序设计时,为了给null值设置默认值,可使用null_value属性。类似于关系数据库中的default默认值,但又有不同,这个请继续往下看第3点。但是需要注意的是,如下三点:

1,在es中,只有显示设置null时,null_value才会生效,设置空数组如[ ],空字符串如""均不生效。
2,null_value默认值应该匹配数据类型。例如,date类型不能设置字符串默认值。
3,null_value仅可以让字段以null_value值被倒排索引存储,以便可以让此文档被检索。并不会替换_source中的实际json文档值。

创建测试对象:

PUT ac_blog1
{
  "mappings": {
    "properties": {
      "title":{
        "type": "text"
      },
      "body":{
        "type": "text"
      },
      "author":{
        "type": "keyword"
      },
      "views":{
        "t
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值