【问题标题】:ElasticSearch max scoreElasticSearch 最高分数
【发布时间】:2016-01-18 17:14:37
【问题描述】:

我正在尝试解决我们在查询 ElasticSearch 以获取数千个结果时遇到的性能问题。基本思想是我们进行一些查询后处理,只显示前 X 个结果(查询可能有 ~100000 个结果,而根据我们的分数机制,我们只需要前 100 个结果)。

基本机制如下: ElasticSearch 得分在 0..1 之间进行归一化( score/max(score) ),我们将排名得分(也在 0..1 之间归一化)相加并除以 2。

我想做的是使用自定义评分(或者任何可行的方法)将此逻辑移动到 ElasticSearch 中:https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-function-score-query.html#function-script-score

我面临的问题是使用评分脚本/评分函数我似乎无法找到一种方法来执行 max(_score) 之类的操作来将分数标准化为 0 到 1 之间。

"script_score" : {
    "script" : "(_score / max(_score) + doc['some_normalized_field'].value)/2"
}

欢迎提出任何想法。

【问题讨论】:

  • 请在这里解释你的逻辑。也许这可以在没有任何脚本的纯弹性搜索中完成。
  • 你得到这个问题的答案了吗?过去一段时间我有点陷入同样的​​困境。
  • 您好!你得到答案了吗?我正试图弄清楚我与它有什么关系!

标签: elasticsearch


【解决方案1】:

在为所有匹配文档实际生成 _score 之前,您无法获得 ma​​x_scorescript_score 查询将首先为所有匹配的文档生成 _score,然后弹性搜索将显示 ma​​x_score

根据我对您的问题的理解,您希望在应用“script_score”之前保留原始查询生成的 ma​​x_score。如果您在前端进行一些计算,您可以获得所需的结果。简而言之,在前端应用您的公式,然后对结果进行排序。

您可以使用script_fields 查询将您的因素保存在结果中。

{
  "explain": true, 
  "query": {
    "match_all": {}
  },
  "script_fields": {
    "total_goals": {
      "script": {
        "lang": "painless",
        "source": """
          int total = 0;
          for (int i = 0; i < doc['goals'].length; ++i) {
            total += doc['goals'][i];
          }
          return total;

        """,
        "params":{
          "last" : "any parameters required"
        }

      }
    }
  }
}

【讨论】:

    【解决方案2】:

    我不确定我是否理解您的问题。你想限制结果的数量吗?

    你试过了吗?

    {
        "from" : 0, "size" : 10,
        "query" : {
            "term" : { "name" : "dennis" }
        }
    }
    

    您可以使用 sort 来定义 sort 顺序,默认情况下它将按主查询排序。

    您也可以使用聚合(带或不带 function_score)

    {
      "query": {
        "function_score": {
          "functions": [
            {
              "gauss": {
                "date": {
                  "scale": "3d",
                  "offset": "7d",
                  "decay": 0.1
                }
              }
            },
            {
              "gauss": {
                "priority": {
                  "origin": "0",
                  "scale": "100"
                }
              }
            }
          ],
          "query": {
            "match" : { "body" : "dennis" }
          }
        }
      },
      "aggs": {
    
            "hits": {
              "top_hits": {
                "size": 10
              }
            }
          }
    }
    

    【讨论】:

      【解决方案3】:

      基于此github ticket,根本不可能标准化分数,他们建议使用boolean similarity 作为解决方法。

      【讨论】:

        猜你喜欢
        • 2014-11-30
        • 1970-01-01
        • 2020-10-15
        • 1970-01-01
        • 1970-01-01
        • 2015-10-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多