我的 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/