ElasticSearch处理数据库里面的null值

背 景

  博主有次在给ES导数的时候,将Hive内的一个字段导入ES内,一直报错说什么null值异常,要么就是如果这个field有null,那么当它是null的时候这条记录的这个field不见了,其他不为null的field的还存在,一开始一脸懵逼,后面经过查阅了官网发现原来ES不支持null值;

  其实我们想想原理也很简单,因为ES是根据他的field来做倒排索引,如果给的是个null值,你让怎么排呢对吧?

全文索引:也叫倒排索引,将需要匹配搜索条件的一段词语根据分词器进行分词,分出的单个词语放到一个分词库中,并且标注这个词隶属于哪一个行目标数据id;于是客户端在搜索时,根据搜索内容也进行分词到分词库中去检索,然后找打匹配的内容,具体如图1;
在这里插入图片描述

图1 全文索引原理图

  所以ES比较野蛮的处理了null值,当某一个文档的某一个field出现null值时,他会把这个field直接去掉,如下,id等于4的这个tags 的field就直接看不到了,注意哈,不是整条记录看不到,只是这个为null的field看不到,这个记录的其他field还是能看见的;

POST /my_index/posts/_bulk
{ "index": { "_id": "1"              }}
{ "tags" : ["search"]                }  
{ "index": { "_id": "2"              }}
{ "tags" : ["search", "open_source"] }  
{ "index": { "_id": "3"              }}
{ "other_field" : "some data"        }  
{ "index": { "_id": "4"              }}
{ "tags" : null                      }  

解决方法

  1. 在数据库端处理好null值,给他赋值默认值,如数值型为0.string型为"",时间为"1990-01-01"等;
  2. ES本身提供的exists函数,使用这种有null的字段时,先判断是否exists;
# 例1,过滤判断
GET /my_index/posts/_search
{
    "query" : {
        "constant_score" : {
            "filter" : {
                "exists" : { "field" : "tags" }
            }
        }
    }
}

# 例2 查询判断
POST /sat_rs_building_info_v0/_search
{
  "query": {
    "bool": {
      "must": [
         {
           "exists": 
           {
             "field": "amap_city_code"
           }
         }
        ,{
          "match": {
            "amap_city_name": "上海市"
          }
        }
      ]
    }

  }
}

  以上就是ES处理null的方式,更多详细的讲解,可参考官网:处理 Null 值

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

╭⌒若隐_RowYet——大数据

谢谢小哥哥,小姐姐的巨款

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值