如何在 Elasticsearch 中结合地理位置相关的评分?比如基于距离的评分

Sherwin.Wei Lv8

如何在 Elasticsearch 中结合地理位置相关的评分?比如基于距离的评分

回答重点

在 Elasticsearch 中结合地理位置相关的评分,核心思路是使用 geo_distance_score 这一评分函数(Scrup replaced with function_score query since Elasticsearch 7.0)和 function_score 查询组合地理位置的距离评分。具体可以通过定义位于查询和评分之间的自定义评分函数,并结合文档中地理坐标字段来实现。

大致步骤如下:
1)定义一个 function_score 查询,在该查询中使用 geo_distance 函数计算距离。
2)指定地理坐标字段和查询参考的原点坐标。
3)定义评分策略,例如通过距离的倒数或者其他自定义方式来影响评分。

举个例子,假设我们有一个索引 locations,每个文档有一个地理位置字段 location。我们希望以某个参考点 lat: 40.0, lon: -70.0 为基准,评分按照距离倒数来计算。可以如下设置查询:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
{
"query": {
"function_score": {
"query": {
"match_all": {}
},
"functions": [
{
"geo_distance": {
"distance": "200km",
"location": {
"lat": 40.0,
"lon": -70.0
},
"weight": 1
}
}
],
"boost_mode": "replace"
}
}
}

该查询将所有文档按照距离原点的远近进行评分,距离越近分数越高。

扩展知识

1)function_score 查询:允许我们对查询的结果应用多个评分函数,以调整原始查询的评分。
2)geo_distance 函数:通过地理距离来影响文档评分,一般用于地理位置搜索。

进一步的扩展思路:
1)多级评分: 可以结合其他评分函数(例如,文档本身的相关性得分)和地理距离评分,设置多个 functions,并选择合适的 boost_mode 以确定如何组合这些评分。
2)权重调整: 可以设置 weight 参数来调整地理距离对最终评分的影响程度。
3)距离单位: geo_distance 函数支持各种测量单位,例如:m(米)、km(公里)、mi(英里)、nmi(海里)等,选择适当的单位可以更贴合实际需求。
4)自定义评分脚本: 利用 script_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
27
28
29
30
31
32
33
34
{
"query": {
"function_score": {
"query": {
"match": {
"some_field": "some_value"
}
},
"functions": [
{
"filter": {
"geo_distance": {
"distance": "100km",
"location": {
"lat": 40.0,
"lon": -70.0
}
}
},
"weight": 2
},
{
"field_value_factor": {
"field": "rating",
"factor": 1.2,
"modifier": "sqrt",
"missing": 1
}
}
],
"boost_mode": "sum"
}
}
}
Comments
On this page
如何在 Elasticsearch 中结合地理位置相关的评分?比如基于距离的评分