稍微背景....我正在轉換現有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
}
}
任何幫助,在此將不勝感激。謝謝!
感謝,這些日期轉換工作。儘管由於應對條件,我遇到了其他問題。理想的解決方案是將所有這些與日期相關的條件「或」到一起,因此即使腳本評估爲true,minimum_should_match邏輯也會拒絕該文檔。 –