2014-07-15 59 views
0

我正在使用Elasticsearch在數據庫中搜索記錄。這些記錄有一個start_dateend_date的字段,用戶可以指定他們想檢查的日期範圍。記錄的開始和結束日期都必須在指定的日期範圍內。但是,某些記錄只有start_date,因此end_date字段爲空。只要start_date在範圍內,我也希望返回這些記錄。我如何在我的Elasticsearch結果中允許空值?

{ 
    "from": 0, 
    "size": 20, 
    "query": { 
    "bool": { 
     "must": [ 
     { 
      "match": { 
      "last_name": { 
       "query": "Beach", 
       "boost": 1.0, 
       "analyzer": "standard", 
       "fuzziness": 2.0 
      } 
      } 
     } 
     ], 
     "should": [ 
     { 
      "range": { 
      "start_date.year": { 
       "gte": "1800", 
       "lte": 1900 
      } 
      } 
     }, 
     { 
      "range": { 
      "end_date.year": { 
       "gte": "1800", 
       "lte": 1900 
      } 
      } 
     } 
     ], 
     "minimum_should_match": 1 
    } 
    } 
} 

的問題是,因爲只有日期字段的一個需要匹配,當我有一個都和start_dateend_date的記錄,其中一人可能是超出範圍。我如何要求start_dateend_date都在範圍內,但允許start_dateend_date值爲空?

回答

1

你可以嘗試這樣的事情:

{ 
"from" : 0, 
"size" : 20, 
"query" : { 
    "bool" : { 
    "must" : [{ 
    "match" : { 
     "last_name" : { 
     "query" : "Beach", 
     "boost" : 1.0, 
     "analyzer" : "standard", 
     "fuzziness" : 2.0 
     } 
    } 
    } 
    ], 
    "should" : [{ 
    "bool" : { 
     "must" : [{ 
     "range" : { 
     "start_date.year" : { 
      "gte" : "1800", 
      "lte" : 1900 
     } 
     } 
     }, { 
     "range" : { 
     "end_date.year" : { 
      "gte" : "1800", 
      "lte" : 1900 
     } 
     } 
     } 
     ] 
    } 
    }, { 
    "bool" : { 
     "must" : [{ 
     "range" : { 
     "start_date.year" : { 
      "gte" : "1800", 
      "lte" : 1900 
     } 
     } 
     }, { 
     "constant_score" : { 
     "filter" : { 
      "missing" : { 
      "field" : "end_date.year" 
      } 
     } 
     } 
     } 
     ] 
    } 
    }, { 
    "bool" : { 
     "must" : [{ 
     "range" : { 
     "end_date.year" : { 
      "gte" : "1800", 
      "lte" : 1900 
     } 
     } 
     }, { 
     "constant_score" : { 
     "filter" : { 
      "missing" : { 
      "field" : "start_date.year" 
      } 
     } 
     } 
     } 
     ] 
    } 
    } 
    ], 
    "minimum_should_match" : 1 
    } 
} 
} 

的想法是創建3種可能的情況:兩個都開始日期和結束日期都在範圍內,或開始日期在範圍內且沒有結束日期,或結束日期範圍內,沒有開始日期。

1

我通過將日期字段放在OR過濾器中解決了問題,以便在查詢正文的其餘部分之後,結果由start_date或end_date進行過濾。

我想這可能會導致錯誤,如果兩個字段都存在,但其中一個超出範圍,在這種情況下,Rotem Hermon的答案聽起來像一個好主意。目前這已經解決了這個問題。

相關問題