本文基于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