我正在尝试使用弹性搜索来存储地理空间数据。但是我希望相关性得分是距离点的距离和基于文本匹配查询的相关性的组合。例如,假设查询为Yellowstone National Park
,但原点位于芝加哥。芝加哥的Portage Park
更有可能匹配,因为任何合理的距离和衰减都会导致Yellowstone National Park
的衰减分数接近零,并且根本不会显示在结果中。我想要做的是在衰减分数上设置一个FLOOR,这样超过一定距离,所有结果看起来都一样。
例如,这里是我的Java代码:
queryBuilder = new FunctionScoreQueryBuilder(queryBuilder).add(
ScoreFunctionBuilders.gaussDecayFunction("search_geo_point", point.get(), "10km")
.setDecay(0.75)
.setOffset("5km"));
我想要做的是将距离原点30公里以上的所有点都视为相同,并使衰减函数不再将分数降低到超过该点。这可能吗?问题是,超过一定距离后,衰减函数会降低相关性,即使查询与文本字段完全匹配,也不会出现在结果中。
答案 0 :(得分:1)
我不知道Elasticsearch中功能评分中实现的功能,虽然它非常方便。
但是,您可以使用function query中的过滤条款,通过一个小的解决方法来实现目标:
POST test/parks/_search
{
"query": {
"function_score": {
"query": {
"match": {
"name": "Yellowstone National park"
}
},
"functions": [
{
"gauss": {
"location": {
"origin": "41.4881832, -87.623177",
"scale": "10km",
"offset": "5km"
}
},
"filter": {
"geo_distance_range": {
"from": "0km",
"to": "30km",
"location": {
"lat": 41.881832,
"lon": -87.623177
},
"include_upper": false
}
}
},
{
"weight": ## Set appropriate weight,
"filter": {
"geo_distance_range": {
"from": "30km",
"location": {
"lat": 41.881832,
"lon": -87.623177
},
"include_lower": true
}
}
}
]
}
}
}
通过上述查询,您只能将高斯函数得分应用于30km范围内的命中。在第二个过滤器子句中,您为所有命中定义一个常量分数,这些分数更远。 请注意,您应该相应地设置include_upper和include_lower,以防止多次对同一元素进行评分。