我们有一个功能评分查询,大约有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不要将分数标准化并使用我指定的分数?
解释API在这里没有多大用处。它没有说明每个功能级别的分数以及它是如何操作的。
答案 0 :(得分:0)
假设您的索引中有一组5个文档,当您运行查询时,它将逐个在每个文档上运行。让我们对索引的第一个文档进行查询。
第一个doc的最终_score将是:
_score = es_score ([0-1]) + function_score;
es_score介于0到1之间。
考虑到所有50个函数都基于keywords.id filter
和script_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 值将是什么。