按日期排序 + 在即将到来的结果之后显示过去的结果
Sort by date + show past results after upcoming results
在 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
顺序获取它们,然后在我的代码中处理结果并不可行。
如果您的 start_date
类型为 date
且其格式为 yyyy-MM-dd
,则完全可以使用 sort script(我发现 YYYY-...
不起作用正确)。
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"
}
}
]
}
出于同步原因,需要参数化 now
,如 here 所述。
在 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
顺序获取它们,然后在我的代码中处理结果并不可行。
如果您的 start_date
类型为 date
且其格式为 yyyy-MM-dd
,则完全可以使用 sort script(我发现 YYYY-...
不起作用正确)。
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"
}
}
]
}
出于同步原因,需要参数化 now
,如 here 所述。