我目前正在通过将分数插入Elastic Search之前预先计算一个分数来解决此问题。但是,由于它是基于日期的,因此我必须每天重新计算分数。在查询期间可以进行此计算吗?
数据:
{
"title" : "event 1",
"rank" : 1034, // pre-calculated score
"score": 34,
"date" : "2015-10-10 00:00:00",
"meta" : [
{
"date": "2015-10-10 00:00:00",
"type": "insert"
},
{
"date": "2015-12-10 00:00:00",
"type": "outsert"
},
{
"date": "2015-05-10 00:00:00",
"type": "other"
}
]
}
排行:
使用
insert
日期创建了4个“存储桶”。每个存储桶中的事件都需要通过
score
字段DESC
进行排序。预先计算的排名是根据事件所属的存储桶,在得分上加上1000、2000或3000。
进行查询时,结果将按等级排序。
不使用预先计算的
rank
怎么办?
最佳答案
我想您可以实现这一目标。您当前的预定义计分逻辑的真正痛苦在于,您不能在事件数据在其当前存储桶中过期后向后移动。因为您的存储桶遵循5天的天差对称性。请对线性天使用函数评分,规模-5天。
https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-function-score-query.html
{
"gauss": {
"date_field": {
"origin": "2013-09-17",
"scale": "5d",
"offset": "0d",
"decay" : 0.5
}
}
}
查询数据时,将原点替换为当前日期。根据共享链接设置boost_mode和score_mode。
希望这行得通。
关于sorting - 可以在Elasticsearch查询中完成吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33888487/