Elasticsearch新手难题:如何关联查询结果与对应经纬度查询项
解决Elasticsearch多坐标搜索结果与查询坐标的对应问题
嘿,我完全懂你的困扰!既然已经能实现单坐标100米范围的搜索,要把结果和每个查询坐标对应上,用聚合确实是最直接的办法,具体可以这么做:
核心思路:给每个查询坐标创建独立的聚合桶
我们可以用geo_distance聚合,为每一个查询坐标单独生成一个聚合桶,每个桶里只包含该坐标100米范围内的文档,再通过top_hits聚合把这些文档返回,这样就能清晰对应每个坐标的匹配结果了。
具体查询示例
假设你的索引中latlng字段已经是geo_point类型(你能做范围搜索应该已经配置好了,如果还没的话后面我会补映射步骤),可以用下面的查询:
{ "size": 0, // 关闭顶层文档返回,只聚焦聚合结果 "aggs": { "nyc_times_square": { // 给查询坐标起个好识别的名字,比如地点名或者坐标字符串 "geo_distance": { "field": "latlng", "distance": "100m", "origin": { "lat": 40.7128, "lon": -74.0060 } }, "aggs": { "matching_documents": { "top_hits": { "size": 10 // 每个坐标最多返回10条结果,按需调整数量 } } } }, "la_downtown": { "geo_distance": { "field": "latlng", "distance": "100m", "origin": { "lat": 34.0522, "lon": -118.2437 } }, "aggs": { "matching_documents": { "top_hits": { "size": 10 } } } } // 有多少个查询坐标,就添加多少个这样的聚合桶 } }
结果说明
返回的聚合结果里,每个桶的名字(比如nyc_times_square)就对应你设置的查询坐标,桶内的matching_documents下就是该坐标100米范围内的所有匹配文档,完全能对应上啦!
额外提示:如果latlng还不是geo_point类型
如果之前没配置字段类型,需要先修改索引映射:
PUT /your_index_name/_mapping { "properties": { "latlng": { "type": "geo_point" } } }
要是查询坐标特别多,手动写聚合桶太麻烦,后期可以考虑用脚本或者程序动态生成这个查询结构,不过先从单个桶开始试,熟悉之后再批量处理会更顺手。
内容的提问来源于stack exchange,提问作者Nerve
相关产品推荐
相关产品推荐

