一点背景......我正在转换现有的API以利用弹性搜索来提高性能。
这是一款使用有效记录的rails应用。以下是我们在弹性搜索中尝试执行的条件的查询:
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 $ Longs with value' [1449446400000]'和值为' 2015-12-01'"
的java.lang.String我也试过这个:
script: "Date.parse('yyyy-MM-dd', '2015-12-01').getTime() >= doc['start_date']"
我收到此错误:
org.elasticsearch.index.fielddata.ScriptDocValues $ Longs无法转换为java.lang.Long
我只是不确定如何使数据类型匹配,以便我可以比较日期。
我希望我可以做这样的事情,但当然不可能:
range: {
'2015-12-01': {
gte: start_date
}
}
对此的任何帮助将不胜感激。谢谢!
答案 0 :(得分:0)
试试这个:
filter: {
script: {
script: {
inline: "new java.util.Date(doc['start_date'].value) > new java.util.Date(2015-12-01)"
}
}
}
答案 1 :(得分: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',
}
}
}
]
}
}
)