sorting - 在Elasticsearch中对日期字段进行排序时如何指定 "precision"?

标签 sorting elasticsearch

我的 Elasticsearch 映射(我使用的是 ES 2.1)中有一个 date 类型的字段(输入格式 epoch_second)。我知道我可以在该字段上进行排序

{
  "sort": [
    {
       "myDateField" : {
         "order": "desc"
        }
    }
  ]
}

但是这以秒精度排序。我想按“周间隔”(从现在起向后 7 天间隔)排序,并在同一周内再次按分数排序,如下所示(pseduocode):

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

因此,过去 7 天内的所有点击都应同等排名,下一个“排序组”中所有超过 7 天且少于 14 天的点击,依此类推。并且每个“周组”应该再次按分数排序。

换句话来说:“过去 7 天内(与当前查询)最相关的文档是什么(但不要完全过滤掉较旧的文档)?”

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

我怎样才能实现这个目标?

最佳答案

您可能会找到decay function on a function score query对你的情况很有用。它专门设计用于调整文档的分数,其中一个字段距某个定义的起点“较远”。

这适用于日期以及数字和地理点字段。它接受一个 origin 选项,该选项设置比较其他文档的引用日期。方便的是,如果您不提供日期字段的来源,它默认为当前日期(这应该适用于您的场景)。

您可能希望将偏移量设置为 7 天。这样,过去 7 天内的所有文档都将获得同等评分。超出该范围,分数开始下降,具体取决于您使用的衰减函数。

尝试这样的事情:

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

关于sorting - 在Elasticsearch中对日期字段进行排序时如何指定 "precision"?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34933096/

相关文章:

elasticsearch - ElasticSearch-使用相同的字段名称但使用不同的分析器搜索不同的doc_types

javascript - 按日期对具有日期字段的对象数组进行排序

elasticsearch - 如何在没有 X-Pack 的情况下监控 Elastic Stack?

c# - ElasticSearch NEST客户端中的SQL Case语句实现

arrays - Numpy argsort 同时区分 0 的值

scala - elastic4s查询搜索功能得分

java - 使用spring esTemplate删除doc中的字段

c++ - 在其他相同的数组旁边排序数组

algorithm - 什么时候使用 O(2^n) 算法是合理的?

javascript - 对除第一项之外的数组进行排序。 Array.prototype.sort()