上面是我们存储在elasticsearch中的Posts
模型的两条不同记录。我们正在尝试采用一种逻辑,以便将粘性帖子过期后像常规帖子一样放入Feed中。
我们要说
“如果将来将来is_sticky
和stickied_until
按stickied_until
排序,否则按created_at
排序”
我想我可以在SQL中使用它(因为我们在那里存储了大量数据,而在ES中仅存储可搜索字段),看起来像
ORDER BY
CASE
WHEN stickied_until >= '#{DateTime.now.utc}'
THEN stickied_until
ELSE created_at
END DESC
但是接下来有两件事控制着排序,我很确定这会导致错误,而且感觉也很不对。
在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"
}
}
]
}
请注意,由于docs中所述的原因,我使用了查询时间常量
params['now']
。
关于ruby-on-rails - ElasticSearch Rails:如果存在,则按date1排序,否则按date2排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61192893/