我的文档是按类别组成的。有40种不同的类别将这些类别手动添加到数据库中的文档中并建立索引。这是我的文档的样子:
{
"name": "..",
"categoryA": "..",
"categoryB": "..",..
"categoryDecayScore": 0.0 - 1.0
}
如果文件属于所有40个类别的一部分,则它们被认为覆盖良好。因此,要将所有类别的文档推到顶部,我想使用衰减函数来减少那些属于较少类别的文档的得分。
为此,我使用在索引时间设置的categoryDecayScore
属性。如果文档是所有40个类别的一部分,则categoryDecayScore
将是0.0
,如果缺少一半但大于1/3,则得分为0.2
,如果得分更低超过1/3,则得分为0.3
。
然后,我也将categoryDecayScore
的值提高了0.02,以降低相关程度的得分。
我要做什么:
我希望拥有categoryDecayScore > 0.0
的文档的得分距0.0
越远,其得分就越低。
这是我的过滤器功能:
"filter": {
"exp": {
"categoryDecayScore" : {
"origin" : 0.0,
"scale" : 1.0,
"offset" : 0.0,
"decay" : 0.5
}
}
}
我在此处理解文档的方式:
https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-function-score-query.html
是origin
是我的参考点,所有拥有categoryDecayScore > 0.0
的文档将被衰减,而所有带有categoryDecayScore >= 1.0
的文档将被0.5
衰减。
但是,从我的结果来看,这似乎并没有影响。前4个文档均具有相同的分数,但以下是categoryDecayScore
值:
{
_score: 51.970146,
categoryDecayScore: 0.04
},
{
_score: 51.970146,
categoryDecayScore: 0.2
},
{
_score: 51.970146,
categoryDecayScore: 0.02
},
{
_score: 51.970146,
categoryDecayScore: 0.3
}
是正常现象还是我对衰减函数的理解不正确。我基于文档的假设是:
注1:
使用我在这些exp设置中注意到的解释标志,评估的衰减分数始终为1。因此51 ..分数仅仅是文本匹配分数。
答案 0 :(得分:2)
我的查询是/正确的。问题是我的范围0.0-1.0很小。因此,我决定使用整数而不是小数,范围从0到1000。为排除在外,我将原点设置为100而不是0。这返回了预期的结果。
答案 1 :(得分:0)
您对衰减函数参数的理解是正确的。但是,在您的帖子中,您将衰减函数(exp
)子句放在filter
子句中,这是错误的-过滤器仅用于从召回集中删除文档,而不会影响其得分。
要使用衰减函数,您需要将其包含在function_score
查询中。
在您的情况下,您需要以下内容:
{
"query": {
"function_score": {
"exp": {
"categoryDecayScore": {
"origin" : 0.0,
"scale" : 1.0,
"offset" : 0.0,
"decay" : 0.5
}
}
}
}
}
如果只希望此衰减影响categoryDecayScore> 0的文档,则可以向衰减函数添加过滤器:
{
"query": {
"function_score": {
"exp": {
"filter": {
"range": {
"categoryDecayScore": {
"gt": 0.0
}
}
},
"categoryDecayScore": {
"origin" : 0.0,
"scale" : 1.0,
"offset" : 0.0,
"decay" : 0.5
}
}
}
}
}
还要注意,offset
默认为0,decay
默认为0.5,因此您不必显式包括这些参数。
“功能得分查询”部分下的Decay Functions文档包含正确语法的示例以及有关默认值的说明。