我不知道在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
}
}
}
]
}
}
}
通过上面的查询,你只有30公里范围内的高斯函数比分适用于点击。在第二个过滤条款中,您为所有点击定义了一个常数分数,这些分数在远处更远。 请注意,您应该适当地设置include_upper和include_lower以防止多次对相同元素打分。