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
}

这是正常行为还是我对衰减函数的理解不正确。我基于文档的假设是:

注一:

使用解释标志,我注意到那些 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。这返回了预期的结果。