如何在es中查詢null值

2023-01-30 06:01:08

1、背景

在我們向es中寫入資料時,有些時候資料寫入到es中的是null,或者沒有寫入這個欄位,那麼這個時候在es中該如何查詢出這種為null的資料呢?

2、需求

假設我們的mapping存在 如下2個欄位nameaddress,其中 namekeyword型別且使用了null_value來處理null值,address欄位是text型別。

我們插入資料時,存在nameaddress欄位都不存在的,存在nameaddress[]null的資料,我們需要查詢出來這些資料。

3、準備資料

3.1 建立mapping

PUT /index_null_value
{
  "mappings": {
    "properties": {
      "name":{
        "type": "keyword",
        "null_value": "--"
      },
      "address":{
        "type": "text"
      },
      "age":{
        "type": "integer",
        "null_value": "-1"
      }
    }
  }
}

注意:

  1. null_value 需要和欄位的 型別值 保持一致,比如上方的ageinteger型別,那麼null_value的值就必須是integer型別
  2. null_value 不會修改 _source中的值
  3. []空陣列是不會被null_value替換的,因為[]中不包含明確的null
  4. null_value可以修飾的資料型別有限,比如text型別不可使用。

3.2 插入資料

PUT /index_null_value/_bulk
{"index":{"_id":0}}
{"age":10}
{"index":{"_id":1}}
{"name":null,"address": null,"age":10}
{"index":{"_id":2}}
{"name":[],"address":[],"age":20}
{"index":{"_id":3}}
{"name":[null],"address":[null],"age":60}
{"index":{"_id":4}}
{"name":[null,"123"],"address":[null,"123"],"age":70}
{"index":{"_id":5}}
{"name":["123",null],"address":["123",null],"age":80}
{"index":{"_id":6}}
{"name":["123","456"],"address":["123","456"],"age":90}
  1. 資料中存在 nameaddress欄位都不存在的
  2. 資料中存在 nameaddress欄位 是 [] 的
  3. 資料中存在 nameaddress欄位 是 [null] 的
  4. 資料中存在 nameaddress欄位 都有值的

4、查詢 name欄位為null的資料

5、查詢address不存在或值直接為null的資料


6、參考連結

1、https://www.elastic.co/guide/en/elasticsearch/reference/8.6/null-value.html
2、https://www.elastic.co/guide/en/elasticsearch/reference/8.6/query-dsl-exists-query.html