2016-02-11 98 views
0

稍微背景....我正在轉換現有API以利用彈性搜索來提高性能。ElasticSearch查詢日期功能腳本

這是一個使用活動記錄的rails應用程序。下面是我們正在努力在elasticsearch做WHERE條件查詢:

where("start_date BETWEEN :start_at AND :end_at 
     OR end_date BETWEEN :start_at AND :end_at 
     OR :start_at BETWEEN start_date AND end_date 
     OR :end_at BETWEEN start_date and end_date", start_at: start_at.to_date, end_at: end_at.to_date) 

上半年即where子句很容易複製。以下是該部分的外觀:

Model.search(
    query: { 
    bool: { 
     should: [ 
     { 
      range: { 
      start_date: { 
       gte: '2015-12-01', 
       lte: '2015-12-25' 
      } 
      } 
     }, 
     { 
      range: { 
      end_date: { 
       gte: '2015-12-01', 
       lte: '2015-12-25' 
      } 
      } 
     } 
     ], 
     minimum_should_match: 1 
    } 
    } 
) 

我只是不確定如何實現該where子句的第二部分。我嘗試過使用腳本,但我遇到了將日期轉換爲正確格式的問題,以便可以進行比較。

例如這裏是我的嘗試:

filter: { 
    script: { 
    script: { 
     inline: "doc['start_date'] > start_on", 
     params: { 
     start_on: Date.parse('2015-12-01') 
     } 
    } 
    } 
}  

當我這樣做,我得到這個錯誤:

無法比擬org.elasticsearch.index.fielddata.ScriptDocValues $多頭與價值「[ 1449446400000]」和java.lang.String中值爲 '2015年12月1日'」

我也試過這樣:

script: "Date.parse('yyyy-MM-dd', '2015-12-01').getTime() >= doc['start_date']" 

我得到這個錯誤:

org.elasticsearch.index.fielddata.ScriptDocValues $多頭不能轉換爲java.lang.Long中

我只是不知道如何獲取數據類型匹配,以便我可以比較日期。

我希望我可以做這樣的事情,但它不可能,當然:

range: { 
    '2015-12-01': { 
    gte: start_date 
    } 
} 

任何幫助,在此將不勝感激。謝謝!

回答

0

試試這個:

filter: { 
    script: { 
    script: { 
    inline: "new java.util.Date(doc['start_date'].value) > new java.util.Date(2015-12-01)" 

    } 
    } 
} 
+0

感謝,這些日期轉換工作。儘管由於應對條件,我遇到了其他問題。理想的解決方案是將所有這些與日期相關的條件「或」到一起,因此即使腳本評估爲true,minimum_should_match邏輯也會拒絕該文檔。 –

0

一位同事給我發了這一點:https://stackoverflow.com/a/325964,所以我結束了一個更簡單的方法:

Model.search(
    query: { 
    bool: { 
     must: [ 
     { 
      range: { 
      start_date: { 
       lte: '2015-12-25' 
      } 
      } 
     }, 
     { 
      range: { 
      end_date: { 
       gte: '2015-12-01', 
      } 
      } 
     } 
     ] 
    } 
    } 
)