这可以在弹性搜索查询中完成吗?

时间:2015-11-24 08:16:26

标签: sorting elasticsearch ranking elastica

我目前正在通过在将事件插入弹性搜索之前预先计算得分来解决此问题。但是因为它是基于日期我必须每天重新计算得分。是否可以在查询期间进行此计算?

数据:

{
    "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"
        }       
    ]
}

排名:

有4个"桶和#34;使用insert日期创建。

  • 5天以下的活动
  • 超过5天且未满10天的活动
  • 超过10天且未满15天的活动
  • 超过15天的事件

每个存储桶中的事件需要按score字段DESC进行排序。

预先计算的排名是通过将1000,2000或3000添加到得分中而产生的,具体取决于事件落在哪个桶中。

进行查询时,结果按Rank排序。

如果不使用预先计算的rank,我该怎么做?

1 个答案:

答案 0 :(得分:1)

我认为你可以实现这一点。你当前预定义评分逻辑的真正痛苦在于你的当前存储桶到期后你无法向后移动事件数据。因为你的桶跟随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。 希望这有效。