如何在 Elasticsearch 中结合多字段的相关性得分?

Sherwin.Wei Lv8

如何在 Elasticsearch 中结合多字段的相关性得分?

回答重点

在 Elasticsearch 中想要结合多字段的相关性得分,可以使用布尔(bool)查询和函数评分(function_score)查询。具体来说,我们可以结合 bool 查询中的 mustshould 等子句,用于控制不同字段的匹配;同时通过 function_score 查询来调整和组合这些得分。

一个基本的示例代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
{
"query": {
"function_score": {
"query": {
"bool": {
"should": [
{ "match": { "field1": "search_term" }},
{ "match": { "field2": "search_term" }}
]
}
},
"functions": [
{
"weight": 1,
"filter": { "match": { "field1": "search_term" }}
},
{
"weight": 2,
"filter": { "match": { "field2": "search_term" }}
}
],
"score_mode": "sum",
"boost_mode": "multiply"
}
}
}

这里,我们使用了 function_score 查询来调整字段 field1field2 的权重,最终得分会根据这些权重组合。

扩展知识

上述方法只是一个基础示例,实际应用中,根据具体需求多字段相关性得分的调整可能需要更多的考虑。比如:

1)根据实际需求调整权重:比如某些字段权重更高,对结果影响应该更显著,可以通过调整 weight 参数来完成。

2)**不同的 score_modeboost_mode**:根据 score_mode 可选择不同的得分计算方式,如 sum(加权求和)、avg(平均)、max(最大值)等;boost_mode 可以选择不同的调整方式,如 multiply(乘法)、replace(替换原有得分)等。

3)复杂查询组合:可以将多个 function_score 查询进行嵌套,进一步细化每个字段及其权重得分。例如可以根据日期字段加权,使得最新的内容得分更高。

4)自定义评分脚本:对于更复杂的需求,Elasticsearch 支持通过 script_score 使用 Painless 脚本进行自定义评分。这种方式虽然灵活,但需要谨慎使用,尤其是性能方面的考虑。

一个使用自定义评分脚本的示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
{
"query": {
"script_score": {
"query": {
"match": { "content": "search_term" }
},
"script": {
"source": "doc['field1'].value * factor1 + doc['field2'].value * factor2",
"params": {
"factor1": 1.2,
"factor2": 1.5
}
}
}
}
}
Comments
On this page
如何在 Elasticsearch 中结合多字段的相关性得分?