首頁 > 軟體

詳解如何在Elasticsearch中搜尋空值

2023-01-26 18:01:45

引言

根據 Elasticsearch 檔案,無法索引或搜尋空值 null。 當一個欄位設定為 null(或空陣列或空值陣列)時,它被視為該欄位沒有值。

那麼如何找到 product_name 為空(null)的檔案呢?

選項 1:null_value 對映引數

你可以在設定索引對映時定義 null_value 引數。 它將允許你在索引檔案時用指定值替換顯式空值 null,以便它可以被索引和搜尋。

讓我們建立索引名稱 products,其中包含值為 NULL 的 product_name 欄位。

 PUT products
 {
   "mappings": {
     "properties": {
       "product_name":{
         "type": "keyword",
         "null_value": "NULL"
       }
     }
    }
  }

讓我們用 product_name 欄位索引一些檔案,該欄位的值為 null 或空陣列。

 POST products/_doc/1
 {
   "product_name": null,
   "company":"apple"
 }
 POST products/_doc/2
 {
   "product_name": [],
   "company":"apple"
  }

讓我們查詢並檢查我們得到的結果:

  POST products/_search
  {
    "query": {
      "match": {
        "product_name": "NULL"
      }
    }
  }

上面的搜尋結果為:

`
 {
   "took": 1009,
   "timed_out": false,
   "_shards": {
     "total": 1,
     "successful": 1,
     "skipped": 0,
     "failed": 0
   },
    "hits": {
      "total": {
        "value": 1,
        "relation": "eq"
      },
      "max_score": 0.2876821,
      "hits": [
        {
          "_index": "products",
          "_id": "1",
          "_score": 0.2876821,
          "_source": {
            "product_name": null,
            "company": "apple"
          }
        }
      ]
    }
  }
`![](https://csdnimg.cn/release/blogv2/dist/pc/img/newCodeMoreWhite.png)

什麼??? 為什麼 Elasticsearch 只返回一個檔案而不返回第二個具有空陣列的檔案? 因為,

  • 一個空陣列不包含明確的 null,因此不會被 null_value 替換。

此外,product_name 值僅作為 null 而不是作為在索引對映中設定的 NULL。 因為,

  • null_value 隻影響資料的索引方式,它不會修改 _source 檔案。

現在,當 product_name 為 null 或空陣列時,如何將兩個檔案都放入結果中?

選項2:使用 MUST_NOT 查詢

讓我們定義沒有 null_value 的索引對映和與上面相同的索引檔案。

 PUT products
 {
   "mappings": {
     "properties": {
       "product_name":{
         "type": "keyword"
       }
     }
   }
  }

現在你可以使用以下查詢:

  POST products/_search
  {
    "query": {
      "bool": {
        "must_not": [
          {
            "exists": {
              "field": "product_name"
            }
          }
        ]
      }
    }
  }

上述查詢的結果,它現在返回兩個結果:

`
 {
   "took": 1,
   "timed_out": false,
   "_shards": {
     "total": 1,
     "successful": 1,
     "skipped": 0,
     "failed": 0
   },
    "hits": {
      "total": {
        "value": 2,
        "relation": "eq"
      },
      "max_score": 0,
      "hits": [
        {
          "_index": "products",
          "_id": "1",
          "_score": 0,
          "_source": {
            "product_name": null,
            "company": "apple"
          }
        },
        {
          "_index": "products",
          "_id": "2",
          "_score": 0,
          "_source": {
            "product_name": [],
            "company": "apple"
          }
        }
      ]
    }
  }
`![](https://csdnimg.cn/release/blogv2/dist/pc/img/newCodeMoreWhite.png)

將 must_not 與 exists 查詢一起使用的優點:

  • 此選項 2 不依賴於欄位的資料型別,無論欄位的資料型別如何,它都會起作用,但選項 1 null_value 需要與欄位的資料型別相同。 例如,長欄位不能有字串 null_value。
  • 選項 1 不適用於文字型別的欄位,因為 Elasticsearch 不允許為文字型別的欄位設定 null_value 引數。
  • 選項 2 也是單一且高效的解決方案,因為 1) 它不需要根據欄位對映中定義的值新增 null 值的開銷。2)索引大小也會變小,導致索引變少,搜尋查詢變快。

以上就是詳解如何在Elasticsearch中搜尋空值的詳細內容,更多關於Elasticsearch搜尋空值的資料請關注it145.com其它相關文章!


IT145.com E-mail:sddin#qq.com