我的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天内最相关的(与当前查询相关)文档是什么(但不要完全过滤掉旧文档)?"
背景:事件搜索,显然最近的事件应该是最重要的。
我怎样才能做到这一点?
答案 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天间隔内的所有文档将具有相同的时间戳,并根据它进行相同的排序。最后,我将常规分数排序作为二阶条件。
我不确定这个解决方案的性能如何扩展,但是对于需要这种排序的几千个文档,我无法注意到有关非排序的任何延迟。