很多時候,我們需要面臨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" } } }