Elasticsearch FunctionScore查询ScoreMode没有按预期工作

时间:2016-05-13 09:14:04

标签: elasticsearch

我们有一个功能评分查询,大约有50个函数。每个函数都有一个过滤器和一个script_score。我们将得分模式设为SUM。

映射:

 "keywords": {
        "type": "nested",
        "include_in_parent": true,
        "properties": {
          "id": {
            "type": "string",
            "index_name": "id",
            "analyzer": "standard"
          },
          "name": {
            "type": "string",
            "index_name": "name"
          },
          "score": {
            "type": "double",
            "index_name": "keywordScore"
          }
        }
      }

示例查询:

 {
  "query": {
    "bool": {
      "should": {
        "nested": {
          "query": {
            "function_score": {
              "functions": [
                {
                  "filter": {
                    "term": {
                      "keywords.id": "np14y9393"
                    }
                  },
                  "script_score": {
                    "script": {
                      "inline": "(doc['keyword.score'].value*log(0.138317))+100"
                    }
                  }
                },
                {
                  "filter": {
                    "term": {
                      "keywords.id": "ny6579591"
                    }
                  },
                  "script_score": {
                    "script": {
                      "inline": "(doc['keyword.score'].value*log(0.0631535))+100"
                    }
                  }
                }
              ],
              "score_mode": "sum",
              "boost_mode": "sum"
            }
          },
          "path": "keywords"
        }
      }
    }
  }
}

的问题:

  1. 每个script_score中的公式处理从0到1的概率。因此script_score的输出将始终小于1.示例:0.00456。在这种情况下,Elasticsearch忽略了来自script_score的分数。我在我的脚本中添加了100,返回100.00456。在这种情况下,得分显示在最终得分中。可能是Elasticsearch有一定的截止精度,因为它的表现就是这样。

  2. 尽管SUM被指定为分数模式,但Elasticsearch在内部对该分数进行了一些平均分析。正如我之前所说,我将在查询中有50个函数。如果10个关键词匹配,则得分应该在1000左右。但得分大约是80.那么这个得分模式是如何使用的?如何告诉Elasticsearch不要将分数标准化并使用我指定的分数?

  3. 解释API在这里没有多大用处。它没有说明每个功能级别的分数以及它是如何操作的。

1 个答案:

答案 0 :(得分:0)

假设您的索引中有一组5个文档,当您运行查询时,它将逐个在每个文档上运行。让我们对索引的第一个文档进行查询。

第一个doc的最终_score将是:

_score = es_score ([0-1]) + function_score;

es_score介于0到1之间。

考虑到所有50个函数都基于keywords.id filterscript_score,每个函数几乎相同,假设 x 匹配的函数过滤器数量为:< / p>

_score = es_score + function_score(func1) + .... + function_score(funcx);
_score = es_score + [(doc['keyword.score'].value*log(0.138317))+100] + .... + [(doc['keyword.score'].value*log(0.138317))+100];

_score = es_score + [-value1 + 100] + .... + [-valueX + 100];

因此,它取决于计算日志的值(可能是负整数),您文档的 _score 值将是什么。