如何在 Elasticsearch 查询中自定义评分规则?

Sherwin.Wei Lv8

如何在 Elasticsearch 查询中自定义评分规则?

回答重点

要在 Elasticsearch 查询中自定义评分规则,你可以使用 function_score 查询。function_score 查询允许你在查询结果的基础上,应用函数来修改文档的得分,从而实现自定义评分规则。以下是一个基本示例:

举个例子,假设你要在查询中增加某字段的权重,可以使用 weight 函数来实现:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
{
"query": {
"function_score": {
"query": { "match": { "text": "some query" } },
"functions": [
{
"weight": 2,
"filter": { "term": { "important_field": true } }
}
],
"boost_mode": "sum"
}
}
}

在此例中,如果 important_field 字段为 true,则对应文档的评分会被乘以 2。

扩展知识

1)函数类型

  • weight: 增加或减少评分的权重。
  • field_value_factor: 使用字段的值来修改评分。
  • random_score: 生成一个随机的评分。
  • script_score: 使用自定义脚本来计算评分。

2)boost_mode
boost_mode 控制的是函数应用后的组合方式,可以选择的方式有:

  • multiply: 将原始评分乘以函数计算结果。
  • sum: 将原始评分和函数计算结果相加。
  • replace: 用函数计算结果替换原始评分。
  • avg, max, min: 取平均值、最大值或最小值。

3)score_mode
score_mode 决定当多个函数匹配时,如何合并它们的结果:

  • multiply: 将所有函数的结果相乘。
  • sum: 将所有函数的结果相加。
  • avg: 取所有函数结果的平均值。
  • first: 使用第一个函数的结果。
  • maxmin: 取最大值或最小值。

4)场景化实例
假设我们有一个电商应用,我们想在搜索商品时,除了常规的匹配度外,还要考虑商品的销量和用户评分:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
{
"query": {
"function_score": {
"query": { "match": { "product_name": "laptop" } },
"functions": [
{
"field_value_factor": {
"field": "sales",
"factor": 1.2,
"modifier": "log1p"
}
},
{
"field_value_factor": {
"field": "user_rating",
"factor": 1.5
}
}
],
"score_mode": "sum",
"boost_mode": "sum"
}
}
}

在上面的例子中,我们根据 salesuser_rating 两个字段对文档进行额外的评分调整,使得销量和用户评分较高的商品在搜索结果中更靠前。

Comments
On this page
如何在 Elasticsearch 查询中自定义评分规则?