elasticsearch - 使用 属性 值衰减文档
elasticsearch - decay documents using property value
我的文档是由类别组成的。有 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
}
这是正常行为还是我对衰减函数的理解不正确。我基于文档的假设是:
- 原点:计算距离的参考点
- scale:上限,之后所有文档都按衰减参数的值衰减
- 偏移量:文件衰减后的点
- 衰减:所有文档得分高于或等于比例值的衰减量
注一:
使用解释标志,我注意到那些 exp 设置评估的衰减分数始终为 1。所以 51.. 分数只是文本匹配分数。
您对衰减函数参数的理解是正确的。但是,在您的 post 中,您将衰减函数 (exp
) 子句放在 filter
子句中,这是错误的——过滤器仅用于从召回集中删除文档,但不能影响他们的分数。
要使用衰减函数,您需要将其包含在 function_score
查询中。
在你的情况下你需要这样的东西:
{
"query": {
"function_score": {
"exp": {
"categoryDecayScore": {
"origin" : 0.0,
"scale" : 1.0,
"offset" : 0.0,
"decay" : 0.5
}
}
}
}
}
如果您只希望此衰减影响类别 DecayScore > 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 的文档包含正确语法的示例和有关默认值的解释。
我的查询 is/was 正确。问题是我的范围 0.0 - 1.0 太小了。所以我决定使用整数而不是小数,范围从 0 到 1000。对于排除,我将原点设置为 100 而不是 0。这返回了预期的结果。
我的文档是由类别组成的。有 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
}
这是正常行为还是我对衰减函数的理解不正确。我基于文档的假设是:
- 原点:计算距离的参考点
- scale:上限,之后所有文档都按衰减参数的值衰减
- 偏移量:文件衰减后的点
- 衰减:所有文档得分高于或等于比例值的衰减量
注一:
使用解释标志,我注意到那些 exp 设置评估的衰减分数始终为 1。所以 51.. 分数只是文本匹配分数。
您对衰减函数参数的理解是正确的。但是,在您的 post 中,您将衰减函数 (exp
) 子句放在 filter
子句中,这是错误的——过滤器仅用于从召回集中删除文档,但不能影响他们的分数。
要使用衰减函数,您需要将其包含在 function_score
查询中。
在你的情况下你需要这样的东西:
{
"query": {
"function_score": {
"exp": {
"categoryDecayScore": {
"origin" : 0.0,
"scale" : 1.0,
"offset" : 0.0,
"decay" : 0.5
}
}
}
}
}
如果您只希望此衰减影响类别 DecayScore > 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 的文档包含正确语法的示例和有关默认值的解释。
我的查询 is/was 正确。问题是我的范围 0.0 - 1.0 太小了。所以我决定使用整数而不是小数,范围从 0 到 1000。对于排除,我将原点设置为 100 而不是 0。这返回了预期的结果。