Elasticsearch 地理距离排序不完全/错误的顺序
Posted
技术标签:
【中文标题】Elasticsearch 地理距离排序不完全/错误的顺序【英文标题】:Elasticsearch geo distance sorting not exactly / wrong order 【发布时间】:2015-11-29 17:35:19 【问题描述】:我正在使用 elasticsearch 为具有数千个位置的 Web 项目获得更快的地理距离搜索功能。结果应按距离排序。我的搜索查询有效,但结果的顺序不正确。结果应该是按距离升序排列,但首先是距离为“9 公里”,然后是“100 公里”,然后是“90 公里”。
我的搜索查询 JSON 如下(使用 php 创建):
"index": "profiles",
"type": "profile",
"size": 30,
"from": 0,
"body":
"query":
"bool":
"filter":
"geo_distance":
"distance": "100km",
"location":
"lat": 49.449919468911,
"lon": 11.073560787681
,
"script_fields":
"distance":
"lang": "groovy",
"params":
"lat": 49.449919468911,
"lon": 11.073560787681
,
"script": "doc['location'].distanceInKm(lat,lon)"
,
"sort": [
"upgrade_sort":
"order": "desc"
,
"has_siegel":
"order": "desc"
,
"_geo_distance":
"location":
"lat": 49.449919468911,
"lon": 11.073560787681
,
"order": "asc",
"unit": "km"
]
,
"fields": [
"_source",
"distance"
]
不幸的是,我找不到任何错误,所以我希望有人可以帮助我。谢谢!
【问题讨论】:
【参考方案1】:您必须将_geo_distance
排序放在第一个位置而不是第三个位置。就目前而言,_geo_distance
排序只会对那些在upgrade_sort
和has_siegel
具有相同值的文档按距离升序对文档进行排序。试试这个:
"size": 30,
"from": 0,
"body":
"query":
"bool":
"filter":
"geo_distance":
"distance": "100km",
"location":
"lat": 49.449919468911,
"lon": 11.073560787681
,
"script_fields":
"distance":
"lang": "groovy",
"params":
"lat": 49.449919468911,
"lon": 11.073560787681
,
"script": "doc['location'].distanceInKm(lat,lon)"
,
"sort": [
"_geo_distance":
"location":
"lat": 49.449919468911,
"lon": 11.073560787681
,
"order": "asc",
"unit": "km"
,
"upgrade_sort":
"order": "desc"
,
"has_siegel":
"order": "desc"
]
,
"fields": [
"_source",
"distance"
]
【讨论】:
是的,没错,如果_geo_distance
是第一个排序标准,但它应该是第三个。但是距离排序不正确。例如,我的代码得到了这样的结果: upgrade_sort = 1 has_siegel = 0 distance = 4 km ; upgrade_sort = 1 has_siegel = 0 距离 = 120 公里; upgrade_sort = 1 has_siegel = 0 距离 = 90 公里;我想首先按 upgrade_sort 排序,第二个按 has_siegel 排序,第三个按距离排序。
您在 120 公里距离处获得一个文档很奇怪,因为您的查询指定最大距离应为 100 公里。您可以使用location
字段的映射更新您的问题吗?
"120km" 是一个示例,用于演示结果顺序是如何错误的。搜索距离在 5 公里到 500 公里之间变化以上是关于Elasticsearch 地理距离排序不完全/错误的顺序的主要内容,如果未能解决你的问题,请参考以下文章
Elasticsearch:在 Elasticsearch 中按距离有效地对地理点进行排序
elasticsearch地理距离过滤器,但距离在文档上而不是在查询中