如何正確編寫Elasticsearch查詢條件以處理包含null值和或邏輯的復雜篩選?

如何正確編寫Elasticsearch查詢條件以處理包含null值和或邏輯的復雜篩選?

深入理解elasticsearch復雜查詢條件:NULL值與OR邏輯

本文將詳細講解如何在Elasticsearch中構建復雜的查詢條件,尤其是在處理包含NULL值和OR邏輯的復雜篩選場景下。 我們將以一個實際問題為例,闡述如何正確編寫ES查詢語句。

問題描述: 需要構建一個ES查詢,滿足以下多條件篩選需求:item_code = “zjdl_013” 并且 effective_flag = 1 并且 delete_flag = 0 并且 (start_time 為NULL 或 start_time 小于等于 2023-02-08) 并且 (end_time 為NULL 或 end_time 小于等于 2023-02-08)。

錯誤的查詢方式及原因: 直接將上述條件轉換為ES查詢語句時,可能會錯誤地使用exists和range查詢在一個should子句中。 這是因為should子句表示滿足其中任意一個條件即可,而exists和range查詢針對的是同一字段,邏輯上相互獨立,不能簡單地放在一起。

正確的查詢方式: 正確的做法是將對start_time和end_time的條件分別拆分成兩個獨立的bool查詢,每個bool查詢都包含一個should子句,分別處理NULL值和日期范圍。 每個should子句包含一個exists查詢(檢查字段是否存在)和一個range查詢(檢查日期范圍)。只有當字段存在且滿足日期范圍條件,或者字段不存在時,該條件才被認為滿足。

修改后的ES查詢語句:

GET index_three_catalogues/_search {   "query": {     "bool": {       "must": [         { "match": { "item_code.keyword": "ZJDL_013" } },         { "match": { "effective_flag": 1 } },         { "match": { "delete_flag": 0 } },         {           "bool": {             "should": [               { "exists": { "field": "start_time" } },               { "range": { "start_time": { "lte": "2023-02-08", "format": "yyyy-MM-dd" } } }             ]           }         },         {           "bool": {             "should": [               { "exists": { "field": "end_time" } },               { "range": { "end_time": { "lte": "2023-02-08", "format": "yyyy-MM-dd" } } }             ]           }         }       ]     }   } }

此查詢語句正確地處理了NULL值和日期范圍,并清晰地表達了OR邏輯。 通過將start_time和end_time的條件分別處理,避免了原始語句中的邏輯錯誤,確保查詢結果的準確性。

? 版權聲明
THE END
喜歡就支持一下吧
點贊12 分享