ElasticSearch的相关性评分和排序



我正试图结合另一个领域的相关性评分和排序,我不知道如何去做。

我的文档有许多文本字段,我想搜索一个术语。该术语可能出现在文档中的各种字段中。

我使用下面的代码来做这个基本的过滤器:

"query_string": {
"query": "Burger",
"default_field": "*"
}
}

我也有一个字段populityscore这衡量了一份文件的受欢迎程度。我试着排序:

"query": {
"query_string": {
"query": "Burger",
"default_field": "*"
}
},
"sort": [
{
"popularityScore": {
"order": "desc"
}
}
]
}

通过这样做,查询的相关性变得无关紧要,如果不这样做,相关性的一个小偏差就会导致非常受欢迎的文档显示较低。是否有一种方法可以将流行度得分和相关性结合起来或限制一个(例如,只返回相关性>然后对它们进行排序)?

您可以使用字段function_score和field_value_factor

查询

{
"query": {
"function_score": {
"query": {
"query_string": {
"query": "Burger",
"default_field": "*"
}
},
"functions": [
{
"field_value_factor": {
"field": "popularityScore",
"factor": 1.2,
"modifier": "sqrt",
"missing": 1
}
}
],
"boost_mode": "sum"
}
}
}

结果

"hits" : [
{
"_index" : "index35",
"_type" : "_doc",
"_id" : "gLyT6XsBQ6SrO4ATYGUQ",
"_score" : 3.9282646,
"_source" : {
"title" : "Burger",
"popularityScore" : 12
}
},
{
"_index" : "index35",
"_type" : "_doc",
"_id" : "fryS6XsBQ6SrO4AT_WXV",
"_score" : 3.5976331,
"_source" : {
"title" : "Burger",
"popularityScore" : 10
}
},
{
"_index" : "index35",
"_type" : "_doc",
"_id" : "f7yT6XsBQ6SrO4ATC2WI",
"_score" : 3.231918,
"_source" : {
"title" : "Burger",
"popularityScore" : 8
}
}
]

field_value_factor函数允许您使用文档中的字段来影响分数。

function_score = sqrt(1.2 * doc['popularityScore'].value)">

document_score = function_score + query_score.

你可以选择"modifier"根据您希望对查询分数的影响程度。您可以在field_value_factor文档中找到多个选项。

最新更新