如何指定"精度"在Elasticsearch中的日期字段上排序时?

时间:2016-01-21 19:55:07

标签: sorting elasticsearch

我的Elasticsearch映射中有一个date类型的字段(输入格式为epoch_second)(我使用的是ES 2.1)。我知道我可以像

那样对那个领域进行排序
{
  "sort": [
    {
       "myDateField" : {
         "order": "desc"
        }
    }
  ]
}

但这种精确度在几秒钟内排序。我希望按周"周间隔排序" (从现在开始每隔7天)并在同一周内再次按分数计算,这样(pseduocode):

{
  "sort": [
    {
       "myDateField" : {
         "order"     : "desc",
         "precision" : "week"
        }
    },
    "_score"
  ]
}

因此,所有在过去7天内的点击量应该平等排列,所有点击次数都超过7天,并且在下一个"排序组中排名小于14天#34;等等。每个"周组"应该再按分数排序。

单词:"过去7天内最相关的(与当前查询相关)文档是什么(但不要完全过滤掉旧文档)?"

背景:事件搜索,显然最近的事件应该是最重要的。

我怎样才能做到这一点?

2 个答案:

答案 0 :(得分:2)

您可能会发现decay function on a function score query对您的情况很有用。它专门用于调整文档的分数,并且“远离”#34;其中一个领域来自某个明确的起点。

这适用于日期以及数字和地理位置字段。它接受origin选项,该选项设置将比较其他文档的参考日期。方便的是,如果您没有为日期字段提供原点,则默认为当前日期(适用于您的方案)。

您可能希望将offset设置为7天。这样,过去7天的所有文件都将得到同等评分。在该范围之外,分数开始下降,具体取决于您使用的衰减函数。

尝试这样的事情:

{
  "query": {
    "function_score": {
      "query": {
        "match": {
          "field1": "search goes here"
        }
      },
      "functions": [
        {
          "exp": {
            "myDateField": {
              "offset": "7d", 
              "scale": "14d",
              "decay": 0.5
            }
          }
        }
      ]
    }
  }
}

答案 1 :(得分:0)

我读到了脚本排序,这是我的解决方案,对我有用:

{
  "sort": [
    "_script": {
      "lang": "expression",
      "type": "number",
      "script": "doc['myDateField'].value - doc['myDateField'].value % 604800000"
      "order": "desc"
    },
    "_score"
  ]
}

我在这里做的是将我的日期字段除以所需的跨度(以毫秒为单位)(Elasticsearch将日期字段内部存储为long,映射到毫秒)并取余数。然后减去实际日期的余数。这样,所有日期都被截断为“0 am(0到6)天前”。这样,相同7天间隔内的所有文档将具有相同的时间戳,并根据它进行相同的排序。最后,我将常规分数排序作为二阶条件。

我不确定这个解决方案的性能如何扩展,但是对于需要这种排序的几千个文档,我无法注意到有关非排序的任何延迟。