大家好,我是咔咔 不期速成,日拱一卒

在MySQL中,十分不建议大家给表的默认值设置为Null,这个后期咔咔也会单独出一期文章来说明这个事情。

但你进入一家新公司之前的业务中存在大量的字段默认值为Null,把这些值导入ElasticSearch中还是需要处理,接下来就看看ElasticSearch如何应对空值。

一、ElasticSearch如何处理Null值的

先看一个案例,当值为null时会发生什么

POST /kaka/_bulk
{ "index": { "_id": "1"}}
{ "tags" : ["search"]}  
{ "index": { "_id": "2"}}
{ "tags" : ["search", "open_source"] }  
{ "index": { "_id": "3"}}
{ "tags" : null                      }  
{ "index": { "_id": "4"}}
{ "tags" :"null"}

在这个案例中可以发现,第3、4都存在一个null值,不同的是一个为字符串null

post /kaka/_search
{
  "query":{
    "term": {
      "tags": null
    }
  },
  "profile":"true"
}

当你执行上面这搜索时会出现下面这个错误

{
  "error": {
    "root_cause": [
      {
        "type": "illegal_argument_exception",
        "reason": "field name is null or empty"
      }
    ],
    "type": "illegal_argument_exception",
    "reason": "field name is null or empty"
  },
  "status": 400
}

然后咔咔就跑到ElasticSearch文档找了一下原因,是因为在ElasticSearch中空值不能被索引或搜索,当字段值为null时、空数组、null值数组时,会将其视为该字段没有值

若你执行的语句为如下,则会返回最后一条数据

post /kaka/_search
{
  "query":{
    "term": {
      "tags": "null"
    }
  },
  "profile":"true"
}

二、使用exists解决ElasticSearch中Null值搜索问题

同样在文档中咔咔也找到了答案,案例如下

post /kaka/_search
{
  "query":{
    "constant_score": {
      "filter": {
        "missing": {
          "field": "tags"
        }
      }
    }
  }
}

执行结果返回no [query] registered for [missing],这就让人有点百思不得其解,再通过啃文档后发现这个接口在ElasticSearch7.1已经被取消了,根据文档的意思是exists可以同时满足存在和不存在两种情况

先看使用exists如何查询不为null

post /kaka/_search
{
  "query":{
    "constant_score":{
      "filter":{
        "exists":{
          "field":"tags"
        }
      }
    }
  }
}

再看使用exists查询为null的

post /kaka/_search
{
  "query":{
    "bool":{
      "must_not":{
        "exists":{
          "field":"tags"
        }
      }
    }
  }
}

三、使用null_value替换显示的空值

删除上边定义的索引delete kaka,然后自定义mapping,给tags设置"null_value" : "null",用指定的值替换显示的空值,"null"可以自定义为任意值

使用了null_value这样做的好处就是空字段也可以被索引,同时也不会在查询时报field name is null or empty的错误

put kaka
{
  "mappings":{
    "properties":{
      "tags" :{
        "type":"keyword",
        "null_value":"null"
      }
    }
  }
}

再插入上边的数据

POST /kaka/_bulk
{ "index": { "_id": "1"}}
{ "tags" : ["search"]}  
{ "index": { "_id": "2"}}
{ "tags" : ["search", "open_source"] }  
{ "index": { "_id": "3"}}
{ "tags" : null                      }  
{ "index": { "_id": "4"}}
{ "tags" :"null"}

再次执行查询为null的数据,就会出现第3、4条数据

post /kaka/_search
{
  "query":{
    "term": {
      "tags": "null"
    }
  },
  "profile":"true"
}

四、使用null_value注意点

null_value必须和定义的数据类型匹配,例如long类型的不能定义字符串类型的value_null值

看一下long类型设置了字符串类型value_null会出现什么错误

# 错误演示,long类型使用了字符串类型的null_value值
put kaka
{
  "mappings":{
    "properties":{
      "tags" :{
        "type":"long",
        "null_value":"null"
      }
    }
  }
}

返回错误如下

{
  "error": {
    "root_cause": [
      {
        "type": "mapper_parsing_exception",
        "reason": "Failed to parse mapping [_doc]: For input string: \"null\""
      }
    ],
    "type": "mapper_parsing_exception",
    "reason": "Failed to parse mapping [_doc]: For input string: \"null\"",
    "caused_by": {
      "type": "number_format_exception",
      "reason": "For input string: \"null\""
    }
  },
  "status": 400
}

注意了数据类型外,你还需要知道value_null不是任何类型都可以使用的,以下列举的类型都可使用null_value

  • Array
  • Boolean
  • Date
  • geo_point
  • ip
  • keyword
  • Numeric
  • point

坚持学习、坚持写作、坚持分享是咔咔从业以来所秉持的信念。愿文章在偌大的互联网上能给你带来一点帮助,我是咔咔,下期见。

速看,ElasticSearch如何处理空值的更多相关文章

  1. [freemarker篇]03.如何处理空值

    我想说的一点,我写的东西没有那么权威,这都是我实际开发中使用的,可能缺少很多! 例如这篇要说的如何处理空值,我发现我使用的跟网上很多写的不太一样,我也没有过多的去尝试网上的那么多写法! 抱歉,我只是写 ...

  2. 渣渣菜鸡为什么要看 ElasticSearch 源码?

    前提 人工智能.大数据快速发展的今天,对于 TB 甚至 PB 级大数据的快速检索已然成为刚需,大型企业早已淹没在系统生成的浩瀚数据流当中.大数据技术业已集中在如何存储和处理这些海量的数据上.Elast ...

  3. 看我是如何处理自定义线程模型---java

    看过我之前文章的园友可能知道我是做游戏开发,我的很多思路和出发点是按照游戏思路来处理的,所以和web的话可能会有冲突,不相符合. 来说说为啥我要自定义线程模型呢? 按照我做的mmorpg或者mmoar ...

  4. jQuery速看

    本文参考w3school网站. jQuery是一个十分流行的javascript库. 基础语法是:$(selector).action() $:表示使用的语法为jquery selector:选择器 ...

  5. P1162_填涂颜色(JAVA语言)(速看!全洛谷最暴力解法!QAQ)

    思路:看了看数据n<=30,于是我们可以暴力求解(主要是BFS学的不咋地~2333).枚举每个0的位置,看上下左右四个方向上是否都有1.都有1的话说明被1包围,即在闭合圈的内部,开个数组标记一下 ...

  6. DC010的精华分享【首发速看】

    世界黑客大会[DC010] 是全球安全圈最神秘.最前沿的黑客大派对 而作为中国首个受DEFCON授权支持成立的 地区性 信息 安全 技术交流平台 DEFCONGROUP 010(DC010) 在国内 ...

  7. 安全意识第三期丨关于高速ETC办理的这些新骗局,速看!

    近期,最火爆的莫过于ETC了. 不仅各大银行,甚至微信和支付宝都推出了办理服务. 虽说更加便捷了,却也带来了安全隐患. 下面这个案例,大家一定要注意,已经有很多车主“中招”,落入了骗子的圈套. 注意: ...

  8. 剖析Elasticsearch集群系列之二:分布式的三个C、translog和Lucene段

    转载:http://www.infoq.com/cn/articles/anatomy-of-an-elasticsearch-cluster-part02 共识——裂脑问题及法定票数的重要性 共识是 ...

  9. elasticsearch索引和映射

    目录 1. elasticsearch如何实现搜索 1.1 搜索实例 1.2 es中数据的类型 1.3 倒排索引 1.4 分析与分析器 1.4.1 什么是分析器 1.4.2 内置分析器种类 1.4.3 ...

随机推荐

  1. 哈工大 计算机网络 实验四 利用 Wireshark 进行协议分析

    计算机网络实验代码与文件可见github:计算机网络实验整理 实验名称 利用 Wireshark 进行协议分析 实验目的: 本次实验的主要目的. 熟悉并掌握Wireshark的基本操作,了解网络协议实 ...

  2. Qt:QJsonValue

    0.说明 QJsonValue类用于操作JSON中的各种数据. JSON是用于存储结构化数据的格式,JSON中的数据可以是六种类型: 基本类型 存储类型 bool QJsonValue::Bool d ...

  3. C语言刷二叉树(二)基础部分

    102. 二叉树的层序遍历 /** * Definition for a binary tree node. * struct TreeNode { * int val; * struct TreeN ...

  4. JQuery常见方法

    <!DOCTYPE htmi> <html> <head> <meta charset="UTF-8"> <title> ...

  5. 发现Spring事务的一个实锤bug,官方还拒不承认?你来评评理...

    你好呀,我是歪歪. 事情是这样的,上周我正在全神贯注的摸鱼,然后有个小伙伴给我发来微信消息,提出了自己关于事务的一个疑问,并配上两段代码: 先说结论:我认为这是 Spring 事务的一个 bug.但是 ...

  6. 一、MarkDown学习笔记

    MakrDown学习 MarkDown是什么? 是一种纯文件格式的标记语言,跟我们写txt和word是一样的,不过它有一些简单的标记,可以使普通文本具有一定的格式. MarkDown有什么样式? 样式 ...

  7. C# form捕捉方向键事件

    在C# Form中监听键盘输入事件本身是很简单的,但是如果是想监听键盘上的上下左右这四个方向键,实现起来有所不同.下面我就以一个Demo简单陈述一下实现过程. 一.为了让界面能够监听键盘事件,必须实现 ...

  8. think php 图像加水印

    1.将下载好的字体引入至 thinkPHP 框架的public/static 下(这里我建了一个文件夹叫font) (1.) (2.)   2.将字体路径写入config.php中 'font'=&g ...

  9. VUE npm run build的项目出现跨域请求的问题npm run dev没有这个问题

    报错信息 Access to XMLHttpRequest at 'http://platformapi-test.lih-elearning.cn/api/v1/login' from origin ...

  10. SQL常用数据类型 字段约束

    SQL中的常用数据类型: 整数:int 小数:double 字符串:varchar(长度),建议 用2的整数倍 日期:date 格式: 'YYYY-MM-DD' SQL中的约束: a.主键约束:pri ...