【问题标题】:elasticsearch - decay documents using property valueelasticsearch - 使用属性值衰减文档
【发布时间】:2019-11-22 00:20:54
【问题描述】:

我的文档由类别组成。有 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
}

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

  • origin:计算距离的参考点
  • scale:所有文档在该点之后按衰减参数的值衰减
  • 偏移量:文档衰减的点
  • 衰减:所有文档的衰减量高于或等于刻度值

注1:

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

【问题讨论】:

    标签: elasticsearch elasticsearch-6


    【解决方案1】:

    我的查询是正确的。问题是我的范围 0.0 - 1.0 太小了。所以我决定使用整数而不是小数,范围从 0 到 1000。对于排除,我将原点设置为 100 而不是 0。这返回了预期的结果。

    【讨论】:

      【解决方案2】:

      您对衰减函数参数的理解是正确的。但是,在您的帖子中,您将衰减函数 (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 的文档包含正确语法示例和有关默认值的说明。

      【讨论】:

      • 我使用functions 下的过滤器,请参阅我的第二次编辑。这仍然适用吗?
      • 试过你的方法,结果还是一样。
      • 我认为我的原点、比例设置有问题。如果我增加 origin 我会看到 exp 生效。也许我从 0.0 到 1.0 的比例太小了。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-02-06
      相关资源
      最近更新 更多