定义
衰减函数使用一个函数对文档进行评分,该函数根据文档的数字字段值与用户给定原点的距离进行衰减。这类似于范围查询,计算分数更加平滑。
要对具有数字字段的查询使用距离评分,用户必须为每个字段定义原点和比例。需要原点来定义计算距离的中心点,需要尺度来定义衰减速率。将衰减函数指定为
"DECAY_FUNCTION": { // 衰减函数
"FIELD_NAME": { // 参与计算的字段
"origin": "11, 12",
"scale": "2km",
"offset": "0km",
"decay": 0.33
}
}
衰减函数
目前ES的衰减函数为三类:linear, exp, gauss,计算分数的衰减可以由下图直观感受:
linear
线性衰减,使用最多的衰减算分方法,公式:
例如我们使用年份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,此时下降速率明显比较快。
参数关系与衰减过程总结
- 安全区 (
offset
):[origin - offset, origin + offset]
内的文档,衰减函数输出 = 1.0 (不衰减)。 - 衰减起始点: 在
origin ± offset
处,衰减函数输出开始从 1.0 下降。 scale
+decay
定义点: 在origin ± (offset + scale)
处,衰减函数输出 =decay
(默认 0.5)。衰减曲线:
gauss
(高斯/正态): 平滑对称衰减。开始时衰减较慢,中间衰减快,尾部衰减又变慢并无限趋近于0(但永远不会为0)。最常用,效果自然。exp
(指数): 衰减速度先快后慢。比高斯衰减更快地远离原点,尾部也无限趋近于0。linear
(线性): 从安全区边界开始,分数随距离增加而线性下降。它会降到0! 在origin ± (offset + scale)
处分数=decay
,在origin ± (offset + scale * (1 / decay))
处分数降为0。之后分数保持为0。计算更简单,但拐点明显,不够平滑。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。