如何在 Elasticsearch 中使用 decay function 来对评分进行时间衰减处理?

Sherwin.Wei Lv8

如何在 Elasticsearch 中使用 decay function 来对评分进行时间衰减处理?

回答重点

在 Elasticsearch 中,我们可以使用 decay function 来对文档的评分进行时间衰减处理。具体方法如下:

首先,要创建并映射一个包含日期字段的索引。假设我们有一个名为 articles 的索引,其包含一个 publish_date 字段,该字段代表文章的发布时间。

接下来,可以使用 Function Score Query,将 publish_date 字段应用于时间衰减函数,比如 gauss(高斯函数)。举个例子:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
{
"query": {
"function_score": {
"query": {
"match_all": {}
},
"functions": [
{
"gauss": {
"publish_date": {
"origin": "now",
"scale": "14d",
"decay": 0.5
}
}
}
],
"score_mode": "multiply"
}
}
}

解释一下这个查询:
1)"origin": "now" 表示时间衰减的起点是当前时间。
2)"scale": "14d" 表示14天是一个时间段,在这个时间段内评分将显著衰减。
3)"decay": 0.5 表示在14天后评分将衰减到原来的50%。

扩展知识

1)实际应用场景

  • 文章推荐系统:在文章推荐系统中,我们希望新发布的文章能有更高的曝光率,而时间久远的文章则逐渐减少推荐。此时时间衰减函数正好可以达到这一目的。
  • 产品/优惠信息展示:在电子商务网站中,新上架的商品、限时优惠信息等也可通过时间衰减函数让新鲜度更高的信息优先展示。

2)调整参数

  • 自定义起始点:有时候我们可能希望从特定日期开始进行衰减,而不是从当前时间。可以将 "origin": "now" 更改为某个指定的时间字符串,例如 "origin": "2023-01-01T00:00:00Z"

  • 改变衰减速度:通过调整 "scale""decay" 参数,可以控制衰减的速度和衰减后的评分。例如,如果希望评分衰减得更快,可以缩短 "scale"(比如 "scale": "7d")或增加 "decay" 值(比如 "decay": 0.3")。

3)其他衰减函数
除了 gauss(高斯函数),Elasticsearch 还提供了 exp(指数函数)和 linear(线性函数),根据不同需求可以选择不同的衰减函数:

  • exp:指数衰减。
  • linear:线性衰减。

例如,如果你需要一个线性衰减,可以使用如下查询:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
{
"query": {
"function_score": {
"query": {
"match_all": {}
},
"functions": [
{
"linear": {
"publish_date": {
"origin": "now",
"scale": "14d",
"decay": 0.5
}
}
}
],
"score_mode": "multiply"
}
}
}
Comments
On this page
如何在 Elasticsearch 中使用 decay function 来对评分进行时间衰减处理?