Ruby on rails ElasticSearch Rails:按日期1排序(如果为';s现在和将来,否则按日期排序2
以上是我们存储在elasticsearch中的Ruby on rails ElasticSearch Rails:按日期1排序(如果为';s现在和将来,否则按日期排序2,ruby-on-rails,elasticsearch,Ruby On Rails,elasticsearch,以上是我们存储在elasticsearch中的Posts模型中的两个不同记录。我们试图在逻辑上把我们的粘性帖子放到feed中,就像普通帖子过期后一样 我们想让它说 “如果是粘滞的并且粘滞的在将来按粘滞的排序,否则按在创建的排序” 我认为它是在SQL中工作的(因为我们在那里存储了大量数据,并且只在ES中存储了可搜索的字段),看起来 ORDER BY CASE WHEN stickied_until >= '#{DateTime.now.utc}' THEN stickied_un
Posts
模型中的两个不同记录。我们试图在逻辑上把我们的粘性帖子放到feed中,就像普通帖子过期后一样
我们想让它说
“如果是粘滞的
并且粘滞的
在将来按粘滞的
排序,否则按在创建的排序”
我认为它是在SQL中工作的(因为我们在那里存储了大量数据,并且只在ES中存储了可搜索的字段),看起来
ORDER BY
CASE
WHEN stickied_until >= '#{DateTime.now.utc}'
THEN stickied_until
ELSE created_at
END DESC
但是有两件事可以控制排序,我很确定这会导致bug,而且感觉不对
是否可以在ES中执行这种条件排序?您必须使用排序脚本来执行此操作
{
"sort": [
{
"_script": {
"type": "number",
"script": {
"lang": "painless",
"source": """
def is_sticky = doc['is_sticky'].value;
def created_at = doc['created_at'].value.getMillis();
if (!is_sticky) {
return created_at;
}
def stickied_until = doc['stickied_until'].value.getMillis();
def now = params['now'];
if (is_sticky && stickied_until > now) {
return stickied_until;
}
return created_at;
""",
"params": {
"now": 1586798403888
}
},
"order": "desc"
}
}
]
}
请注意,我使用了查询时间常数params['now']
,原因如下。您使用的是什么版本的elasticsearch?@AlkisKalogeris 5.4我相信根据您的ES版本,您可能需要使用doc['created_at'].date.getMillis()
而不是doc['created_at'].value.getMillis()
。谢谢!我使用的是ES 5.4,所以我必须更改为doc['created_at'].date.getMillis()
,否则这就像一个符咒