elasticsearch-使用属性值衰减文档

时间:2019-07-12 08:51:20

标签: elasticsearch elasticsearch-6

我的文档是按类别组成的。有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:最高点,在此点之后,所有文档均被衰减参数值衰减
  • 偏移量:文档衰减的起点
  • 衰减:所有得分高于或等于标度值的文档的衰减量

注1:

使用我在这些exp设置中注意到的解释标志,评估的衰减分数始终为1。因此51 ..分数仅仅是文本匹配分数。

2 个答案:

答案 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
        }
      }
    }
  }
}

如果只希望此衰减影响categoryDe​​cayScore> 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文档包含正确语法的示例以及有关默认值的说明。