按距离排序 | Elasticsearch: 权威指南 | Elastic
2024-12-24
当你 可以 按距离排序时, 按距离打分 通常是一个更好的解决方案。
GET /attractions/restaurant/_search { "query": { "filtered": { "filter": { "geo_bounding_box": { "type": "indexed", "location": { "top_left": { "lat": 40.8, "lon": -74.0 }, "bottom_right": { "lat": 40.4, "lon": -73.0 } } } } } }, "sort": [ { "_geo_distance": { "location": { "lat": 40.715, "lon": -73.998 }, "order": "asc", "unit": "km", "distance_type": "plane" } } ] }
你可能想问:为什么要制定距离的 单位
呢?用于排序的话,我们并不关心比较距离的尺度是英里、公里还是光年。 原因是,这个用于排序的值会设置在每个返回结果的 sort
元素中。
... "hits": [ { "_index": "attractions", "_type": "restaurant", "_id": "2", "_score": null, "_source": { "name": "New Malaysia", "location": { "lat": 40.715, "lon": -73.997 } }, "sort": [ 0.08425653647614346 ] }, ...
你可以通过设置 单位
( unit
)来让返回值的形式,匹配你应用中需要的。
地理距离排序可以对多个坐标点来使用,不管(这些坐标点)是在文档中还是排序参数中。使用 sort_mode
来指定是否需要使用位置集合的 最小
( min
) 最大
( max
)或者 平均
( avg
)距离。
如此就可以返回 “离我的工作地和家最近的朋友” 这样的结果了。
有可能距离是决定返回结果排序的唯一重要因素,不过更常见的情况是距离会和其它因素,比如全文检索匹配度、流行程度或者价格一起决定排序结果。
遇到这种场景你需要在 功能评分查询 中指定方式让我们把这些因子处理后得到一个综合分。 越近越好 中有个一个例子就是介绍地理距离影响排序得分的。
另外按距离排序还有个缺点就是性能:需要对每一个匹配到的文档都进行距离计算。而 function_score
查询,在 rescore
语句 中可以限制只对前 n 个结果进行计算。
官方地址:https://www.elastic.co/guide/cn/elasticsearch/guide/current/sorting-by-distance.html