【发布时间】:2016-05-13 18:53:41
【问题描述】:
我们有一个包含大约 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"
}
}
}
}
}
问题:
每个 script_score 中的公式处理从 0 到 1 的概率。因此 script_score 的输出将始终小于 1。例如:0.00456。在这种情况下,Elasticsearch 会忽略来自 script_score 的分数。我在我的脚本中添加了 100,它返回 100.00456。在这种情况下,分数会显示在最终分数中。可能是 Elasticsearch 具有一定的截止精度,因此它的行为方式是这样的。
尽管 SUM 被指定为分数模式,但 Elasticsearch 在内部对该分数进行了一些平均。正如我之前所说,我将在查询中包含 50 个函数。如果匹配了10个关键词,那么得分应该在1000左右。但是结果得分在80左右。那么这个得分模式是如何使用的呢?如何告诉 Elasticsearch 不要标准化分数并使用我指定的分数?
Explain API 在这里用处不大。它并没有说明每个功能级别的分数是多少以及它是如何操纵的。
【问题讨论】:
标签: elasticsearch