背 景

  博主有次在给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 值


本文参考链接:https://blog.csdn.net/LXWalaz1s1s/article/details/111152394
评论关闭
IT虾米网

微信公众号号:IT虾米 (左侧二维码扫一扫)欢迎添加!