速看,ElasticSearch如何处理空值
大家好,我是咔咔 不期速成,日拱一卒
在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如何处理空值的更多相关文章
- [freemarker篇]03.如何处理空值
我想说的一点,我写的东西没有那么权威,这都是我实际开发中使用的,可能缺少很多! 例如这篇要说的如何处理空值,我发现我使用的跟网上很多写的不太一样,我也没有过多的去尝试网上的那么多写法! 抱歉,我只是写 ...
- 渣渣菜鸡为什么要看 ElasticSearch 源码?
前提 人工智能.大数据快速发展的今天,对于 TB 甚至 PB 级大数据的快速检索已然成为刚需,大型企业早已淹没在系统生成的浩瀚数据流当中.大数据技术业已集中在如何存储和处理这些海量的数据上.Elast ...
- 看我是如何处理自定义线程模型---java
看过我之前文章的园友可能知道我是做游戏开发,我的很多思路和出发点是按照游戏思路来处理的,所以和web的话可能会有冲突,不相符合. 来说说为啥我要自定义线程模型呢? 按照我做的mmorpg或者mmoar ...
- jQuery速看
本文参考w3school网站. jQuery是一个十分流行的javascript库. 基础语法是:$(selector).action() $:表示使用的语法为jquery selector:选择器 ...
- P1162_填涂颜色(JAVA语言)(速看!全洛谷最暴力解法!QAQ)
思路:看了看数据n<=30,于是我们可以暴力求解(主要是BFS学的不咋地~2333).枚举每个0的位置,看上下左右四个方向上是否都有1.都有1的话说明被1包围,即在闭合圈的内部,开个数组标记一下 ...
- DC010的精华分享【首发速看】
世界黑客大会[DC010] 是全球安全圈最神秘.最前沿的黑客大派对 而作为中国首个受DEFCON授权支持成立的 地区性 信息 安全 技术交流平台 DEFCONGROUP 010(DC010) 在国内 ...
- 安全意识第三期丨关于高速ETC办理的这些新骗局,速看!
近期,最火爆的莫过于ETC了. 不仅各大银行,甚至微信和支付宝都推出了办理服务. 虽说更加便捷了,却也带来了安全隐患. 下面这个案例,大家一定要注意,已经有很多车主“中招”,落入了骗子的圈套. 注意: ...
- 剖析Elasticsearch集群系列之二:分布式的三个C、translog和Lucene段
转载:http://www.infoq.com/cn/articles/anatomy-of-an-elasticsearch-cluster-part02 共识——裂脑问题及法定票数的重要性 共识是 ...
- elasticsearch索引和映射
目录 1. elasticsearch如何实现搜索 1.1 搜索实例 1.2 es中数据的类型 1.3 倒排索引 1.4 分析与分析器 1.4.1 什么是分析器 1.4.2 内置分析器种类 1.4.3 ...
随机推荐
- C语言字符串输入输出函数(gets()函数、puts()函数、fgets()函数、fputs()函数)
scanf("%s", str) 不能读取空白字符,遇到第一个空白字符就停止读取. gets(str) 读取整行输入,直至遇到换行符,丢弃换行符储存其余字符,并在末尾添加 \0.与 ...
- ceph 问题总结已解决
waiting for a volume to be created, either by external provisioner "ceph.com/rbd" or manua ...
- 平平无奇的项目「GitHub 热点速览 v.22.10」
不知道大家对高星项目什么印象?提到这个词第一个想到哪个项目呢?本周有几个项目看着普普通通,却完成了一周 2k+ star 的事迹.比如 SingleFile,它是个浏览器扩展,点击图标之后即可保存一个 ...
- 使用Python绘制彩色螺旋矩阵
from turtle import* #导入turtle库 bgcolor("black") #设置画布颜色为黑色 speed(0) #设置画笔绘制速度 colors=[&quo ...
- python中的流程控制
目录 引言 流程控制的分类 分支结构 单if结构 if与else结构 if与elif与else结构 if分支的嵌套 循环结构 while循环 while + break循环 while + conti ...
- 设置vim永久显示编号
永久显示行号,需要我们设置配置文件,两种配置方式: 1. /etc/vimrc 是系统范围的初始化配置 2. -/.vimrc 个人的vim初始化配置 编辑配置文件,以个人为例: vi ...
- SpringBoot入门二:与Mybatis整合
一.编程步骤 1.引入依赖 springboot相关依赖(略).mybatis-spring-boot-starter.mysql.druid.lombook <dependency> & ...
- 『现学现忘』Docker基础 — 14、Docker的卸载
目录 1.查询Docker安装过的包 2.卸载Docker软件包 3.删除残留目录 4.验证是否卸载 5.20版本Docker卸载(官方文档) 1.查询Docker安装过的包 执行yum list i ...
- ARP协议、路由器详细工作原理
ARP原理分析 第一次通信时,有对方IP地址但是没有目标MAC地址,该PC就会在网络层启动ARP协议生成一个ARP报文"我叫1.1,我的MAC是AA;谁是1.3,你的MAC是多少?" ...
- 微信小程序两点之间的距离
1:申请key: https://lbs.qq.com/dev/console/application/mine 网址: https://note.youdao.com/ynoteshare/inde ...