【问题标题】:Combining multiple different function_score with Elasticsearch将多个不同的 function_score 与 Elasticsearch 相结合
【发布时间】:2019-06-02 12:10:41
【问题描述】:

我有几个不同的 Elasticsearch function_score,但我不知道如何组合它们

这是我正在查看的测试集(我添加了 cmets 以便能够引用问题中的特定项目,这些 cmets 实际上不在索引中)

[
    { // Item 1
        "priority": 0.7,
        "classification": [
            {
                "feature": "A",
                "confidence": 0.4
            },
            {
                "feature": "C",
                "confidence": 0.3
            },
            {
                "feature": "B",
                "confidence": 0.6
            }
        ]
    },
    { // Item 2
        "priority": 0.8,
        "classification": [
            {
                "feature": "A",
                "confidence": 0.3
            },
            {
                "feature": "C",
                "confidence": 0.6
            }
        ]
    },
    { // Item 3
        "priority": 0.4,
        "classification":  [
            {
                "feature": "D",
                "confidence": 0.6
            },
            {
                "feature": "C",
                "confidence": 0.8
            }
        ]
    }
]

现在假设我想对具有以下权重的项目进行评分:

  • “A”,权重为 2
  • “B”,权重为 3

我想做以下事情:

  1. 仅为特征“A”和“B”计算每个项目的平均置信度(例如,项目 1 的平均置信度为 0.5)
  2. 计算每个项目的优先级(例如 0.8 项目 2 的流行度)
  3. 计算每个项目特征的权重总和(如果项目具有特征“A”,则其权重为 2,如果 它具有特征“B”,它的权重为 3。例如第 1 项的权重为 5,第 2 项的权重为 2)
  4. 将不同的计算组合成最终分数

我知道如何为平均置信度创建 function_score,它是这样的:

{
  "nested": {
    "path": "classification",
    "query": {
       "function_score": {
          "functions": [
              {
                  "field_value_factor": {
                      "field": "classification.confidence",
                      "missing": 0
                  },
                  "weight": 0
              }
          ],
          "query": {
              "terms": {
                  "classification.feature": [
                      "A",
                      "B"
                  ]
              }
          },
          "score_mode": "avg"
        }
    }
  }
}

我也知道如何为优先级字段创建函数分数,它会是这样的:

{
    "function_score": {
        "functions": [
            {
                "field_value_factor": {
                    "field": "popularity",
                    "missing": 0
                },
                "weight": <some-weight>
            }
        ],
        "score_mode": "sum"
    }
}

我认为(但不确定)我知道如何为特征权重的总和创建函数得分(忽略与“A”或“B”不匹配的特征的权重)。大概是这样的:

{
  "query": {
        "function_score": {
            "query": {
                "bool": {
                    "should": [
                        { "match": { "classification.feature": "A" } },
                        { "match": { "classification.feature": "B" } }
                    ]
                }
            },
            "functions": [
              {
                  "filter": { "match": { "classification.feature": "A" } },
                  "weight": 2
              },
              {
                  "filter": { "match": { "classification.feature": "B" } },
                  "weight": 3
              },
            ],
            "score_mode":"sum"
        }
    }
}

但我不知道如何组合这 3 个不同的函数分数(我目前不确定实际的组合函数是什么。我需要使用不同的函数并决定哪一个最适合我,但问题的缘故,我们可以说我想对我的 3 个 function_score 的结果进行平均)

所以我的问题是:

  1. 是否可以定义多个function_score,然后定义如何组合?
  2. 如果无法组合多个 function_score 我应该采取什么方法来解决这个问题? (我不专注于使用 3 种不同的 function_score,但不知道该怎么做)
  3. 虽然我说过我想对所有 function_score 结果取平均值,但我以后可能想做一些事情 像这样更复杂一点:score("popularity") + (score("feature-weight") * score("confidence")) - 是 有没有办法做到这一点?

我目前正在 ES 2.4.5(我知道已弃用)上对此进行测试。我们很快就会升级 无论如何,但是:

  • 是否只能使用更高版本的 ES 才能实现?
  • 即使它只能在更高的 ES 版本中实现,我仍然想知道如何实现它(并在我们升级后使用它)

谷歌搜索没有得到任何有用的信息

提前致谢

【问题讨论】:

    标签: elasticsearch


    【解决方案1】:

    我认为你应该使用script_score。它允许使用字段文档的值来计算分数。使用script_score你不需要写多个function_score

    您还可以将参数传递给您的函数分数,以便在查询时为您的特征设置权重。

    在文档中有一个很好的弹性搜索 2 示例,用于高级使用 script_scorehttps://www.elastic.co/guide/en/elasticsearch/guide/current/script-score.html

    【讨论】:

    • 1.您是否知道使用 script_score 函数是否会对性能产生很大影响? 2. 你知道是否有其他方法可以完成同样的事情吗?还是使用 script_score 是最好的方法(你知道的)?
    • 1.我不希望性能低很多,甚至可能比结合几个功能得分更好。我不知道使用脚本对性能的确切影响,但它们已经过高度优化。 2. 我唯一能想到的可能是rank_feature queries 从 Elasticsearch 7 开始可用,但是您需要对预期分数进行索引,并且您将失去动态设置特征权重的能力。
    • 此外,您可能会在 Elasticsearch 2 中使用脚本时收到警告。它们已在 Elasticsearch 4 中使用称为 painless 的新语言完全重写,因此您的脚本可能无法正常工作当你升级。我还认为默认情况下 ES2 禁用脚本。
    • 感谢您在 ES 4 中重写脚本的提示,您对 ES 2 默认禁用脚本的说法是正确的 :) 我会试一试,如果有的话,我会及时通知您它工作
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-10-11
    • 2016-11-24
    • 2018-03-11
    • 2021-03-08
    • 2019-09-03
    • 1970-01-01
    • 2016-02-01
    相关资源
    最近更新 更多