在Elastic中,我想按start_date
升序对结果进行排序,但过去的日期显示在即将到来的日期之后。
预期结果示例:
[
{id: 5, start_date: '3000-01-01'},
{id: 7, start_date: '3001-01-01'},
{id: 8, start_date: '3002-01-01'},
{id: 1, start_date: '1990-01-01'},
{id: 4, start_date: '1991-01-01'},
{id: 3, start_date: '1992-01-01'},
]
在SQL中可能会发生这种情况:
ORDER BY (start_date > NOW()) DESC, start_date ASC
但是我不确定如何在Elastic中完成此任务。我唯一能想到的就是每天设置一个布尔is_upcoming
标志并重新编制索引。
我也可能会限制和分页搜索结果的数量,因此以相反的start_date
顺序获取它们,然后在我的代码中处理结果并不是真的可行。
答案 0 :(得分:1)
如果您的start_date
的类型为date
,并且其格式为yyyy-MM-dd
(我发现YYYY-...
无法正常工作),则完全可以使用sort script
GET future/_search
{
"sort": [
{
"_script": {
"type": "number",
"script": {
"lang": "painless",
"source": "return doc['start_date'].value.millis > params.now ? (doc['start_date'].value.millis - params.now) : Long.MAX_VALUE",
"params": {
"now": 1594637988236
}
},
"order": "asc"
}
},
{
"start_date": {
"order": "asc"
}
}
]
}
出于here所述的同步原因,需要参数化的now
。