1

定义

衰减函数使用一个函数对文档进行评分,该函数根据文档的数字字段值与用户给定原点的距离进行衰减。这类似于范围查询,计算分数更加平滑。

要对具有数字字段的查询使用距离评分,用户必须为每个字段定义原点和比例。需要原点来定义计算距离的中心点,需要尺度来定义衰减速率。将衰减函数指定为

"DECAY_FUNCTION": { // 衰减函数
    "FIELD_NAME": { // 参与计算的字段
          "origin": "11, 12",
          "scale": "2km",
          "offset": "0km",
          "decay": 0.33
    }
}

衰减函数

目前ES的衰减函数为三类:linear, exp, gauss,计算分数的衰减可以由下图直观感受:
image.png

linear

线性衰减,使用最多的衰减算分方法,公式:image.png
例如我们使用年份year字段作为使用dsl案例:

GET /_search
{
  "query": {
    "function_score": {
      "linear": {
        "year": {
          "origin": 2025, // 原点,从该点开始,从两端计算衰减
          "scale": 50, // 在 (origin -/+ offset) -/+ scale 的值时,会衰减至 decay
          "decay": 0.5, // 衰减速度,越小衰减越快
          "offset": 5 // 偏移量,意思是 origin -/+ offset 范围内不计算衰减
          
        }
      }
    }
  }
}

在上述dsl的案例中,scale和decay共同控制衰减速度,当scale=50, decay=0.5,offset=5的时候,在 2025-5-50=1980年的时候,weight值(默认1)会衰减至0.5;当scale=20, decay=0.1,offset=0的时候,在 2025-0-20=2005年的时候,weight值(默认1)会衰减至0.1,此时下降速率明显比较快。

参数关系与衰减过程总结

  1. 安全区 (offset): [origin - offset, origin + offset] 内的文档,衰减函数输出 = 1.0 (不衰减)。
  2. 衰减起始点:origin ± offset 处,衰减函数输出开始从 1.0 下降。
  3. scale + decay 定义点:origin ± (offset + scale) 处,衰减函数输出 = decay (默认 0.5)。
  4. 衰减曲线:

    • gauss (高斯/正态): 平滑对称衰减。开始时衰减较慢,中间衰减快,尾部衰减又变慢并无限趋近于0(但永远不会为0)。最常用,效果自然。
    • exp (指数): 衰减速度先快后慢。比高斯衰减更快地远离原点,尾部也无限趋近于0。
    • linear (线性): 从安全区边界开始,分数随距离增加而线性下降。它会降到0!origin ± (offset + scale) 处分数=decay,在 origin ± (offset + scale * (1 / decay)) 处分数降为0。之后分数保持为0。计算更简单,但拐点明显,不够平滑。

怕考试的吐司
6 声望0 粉丝