我正在尝试使用Elastic Search存储地理空间数据。但是我希望相关性分数是一个点的距离和基于文本匹配查询的相关性的组合。例如,假设查询为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公里的所有点都视为相同,并且具有衰减功能的点不再将得分降低到该点之外。这可能吗?问题在于,超过一定距离后,衰减函数会降低相关性,以至于即使查询与文本字段完全匹配,查询也不会出现在结果中。
最佳答案
我不知道在Elasticsearch的功能评分中实现的功能,尽管它非常方便。
但是,通过使用function query中的filter子句,您可以通过较小的解决方法来实现目标:
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
}
}
}
]
}
}
}
使用上面的查询,您只能将高斯函数得分应用于30公里范围内的匹配。在第二个过滤器子句中,为所有匹配(更远的匹配)定义一个常数。
请注意,应适当设置include_upper和include_lower,以防止对同一元素多次评分。
关于java - 如何在ElasticSearch中为高斯衰减函数设置下限?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/36321238/