非_geo_distance排序时如何返回地理距离并保留field3权重?
修改后的Elasticsearch查询方案
要实现「返回地理距离+让存在field3的文档排名更高」的需求,核心是放弃用_geo_distance直接排序,改用查询得分(_score)排序,同时通过脚本字段返回距离值,具体修改如下:
关键改动说明
- 移除原
sort中的_geo_distance配置,改为按查询得分_score降序排序,这样bool查询里should的boost权重才会生效,让带field3的文档获得更高排名 - 添加
script_fields字段,通过脚本实时计算并返回每个文档到目标坐标的距离(单位km)
修改后的完整查询语句
{ "query": { "bool": { "filter": [ { "match": { "field1": "value" } }, { "match": { "field2": "A" } }, { "geo_distance": { "distance": "20km", "location": "34,-2.99" } } ], "should": [ { "exists": { "field": "field3", "boost": 10000 } } ] } }, "size": 500, "sort": [ { "_score": { "order": "desc" } } ], "script_fields": { "distance_km": { "script": { "source": "doc['location'].distance(params.lat, params.lon) / 1000", "params": { "lat": 34, "lon": -2.99 } } } } }
额外说明
- 原
filter中的geo_distance保留,继续用来过滤20km范围内的文档,不影响得分计算 - 返回结果的
fields字段下会新增distance_km字段,就是当前文档到目标坐标的距离(单位千米) - 如果需要更精确的球面距离计算,可把脚本里的
distance改成arcDistance,即doc['location'].arcDistance(params.lat, params.lon) / 1000
内容的提问来源于stack exchange,提问作者Paris
相关产品推荐
相关产品推荐

