0
点赞
收藏
分享

微信扫一扫

Elasticsearch 谜之null values


很多时候,我们需要面临null值的烦扰,查询es时传入null值是要查询出null的数据还是不查这个field呢,稍有不慎就会引发新的bug,这的确是个问题!

null_value 意味着无法索引或搜索空值。当字段设置为 null , [] ,和 [null] (这些null的表示形式都是等价的),它被视为该字段没有值。

null_value 意味着它将不会被表示为一个反向索引数据结构,它们根本不存在于反向索引中,故搜索也就无任何意义了。

难道就搜索没有办法了吗?

es为我们提供了missing查询,代表缺少字段或null值,但在6.x版本已经移除。取而代之的是exists查询,它的语义相当于SQL 中的 column is not null(有值)。它们都属于聚合操作。

显然,这个世界并不简单,数据常常缺少字段,或者包含显式的空或空数组。为了处理这些情况,es 给我们推荐了一些办法可以处理空值或缺少的值。

幸运的是,es 可以设置一个选项,用我们选择的占位符值替换显式的空值(当为字符串、数字、布尔值或日期字段指定映射时设置),当insert/update数据遇到空值时,将使用该值,这个显式的空值会对其进行索引,以便于搜索。

选择合适的空值时,请确保:

  • 它与字段的类型匹配。在日期类型的字段中不能使用字符串空值
  • 它不同于字段可能包含的正常值,以避免将实值与空值混淆

PUT my_index
 {
   "mappings": {
     "_doc": {
       "properties": {
         "status_code": {
           "type":       "keyword",
           "null_value": "NULL" 
         }
       }
     }
   }
 }PUT my_index/_doc/1
 {
   "status_code": null
 }PUT my_index/_doc/2
 {
   "status_code": [] 
 }GET my_index/_search
 {
   "query": {
     "term": {
       "status_code": "NULL" 
     }
   }
 }

举报

相关推荐

0 条评论