2013-05-28 139 views
9

我存儲像在彈性搜索的下列信息:Elasticsearch時間範圍相交

{ "timeslot_start_at" : "2013-02-01", "timeslot_end_at" : "2013-02-03" } 

鑑於我有另一個日期範圍(例如從用戶輸入給出)我想要搜索的交叉時間範圍。與此相似:Determine Whether Two Date Ranges Overlap其中概述了以下邏輯是我後:

(StartDate1 <= EndDate2) and (StartDate2 <= EndDate1) 

但我不確定如何適應彈性搜索查詢這一點,我會用各種過濾器和只設置'to'的值,留下空白?或者有沒有更有效的方法呢?

+0

應用戶輸入範圍完全由DOC TIMERANGE「覆蓋」,或者是它沒關係他們」只是部分重疊? –

回答

15

更新:現在可以使用在elasticsearch v5.2中添加的date_range數據類型。對於早期版本的elasticsearch,以下解決方案仍然適用。

爲了測試相交,應使用布爾查詢的兩個範圍查詢合併成一個單一的查詢:

{ 
    "bool": { 
     "must": [ 
      { 
       "range": { 
        "timeslot_start_at": { 
         "lte": "2013-02-28" 
        } 
       } 
      }, 
      { 
       "range": { 
        "timeslot_end_at": { 
         "gte": "2013-02-03" 
        } 
       } 
      } 
     ] 
    } 
} 
+1

如果您想從結果中排除相交日期範圍,該怎麼辦?我希望「must_not」能夠工作,但事實並非如此。 – goldstein

+0

此更新是否應該顯示「現在*可能」? – Necoras

+1

@Necoras謝謝!接得好! – imotov