首页 > 解决方案 > Elasticsearch 地理查询

问题描述

我们正在迁移到 ES,需要支持不同的地理查询。我们在映射中使用 geo_point 字段类型。我可以看到 ES 支持 geo_bounding_box 和 geo_distance 但我试图弄清楚它们是否可以用于我们下面的用例:

1.BBOX:使用中心点和半径定义框。据我了解, geo_distance 将创建一个圆形,我们如何使用该圆形的 bbox ?

//something like this - but we want a box shape not circle
QueryBuilders.geoDistanceQuery("location")
            .point(lat, lon)
            .distance(r, DistanceUnit.KILOMETERS);

2.LAT_WITHIN:我们如何检查纬度在中纬度(南北)范围内的文档?

//something like this - but with only lat & radius
QueryBuilders.geoDistanceQuery(pointField)
            .point(lat)   //only lat?
            .distance(r, DistanceUnit.KILOMETERS);

3.LON_WITHIN:与上述点类似,但为经度。

4.SAME POINT:查找具有相同纬度和经度的文档。那么我们可以在这里使用术语查询中的地理点字段还是可以使用纬度/经度键?

//point equal - this gives error
QueryBuilders.termQuery("location", "lat,lon");
//OR - this doesn't return
QueryBuilders.boolQuery()
    .must(QueryBuilders.termQuery("location.lat", lat))
    .must(QueryBuilders.termQuery("location.lon", lon));

使用第一个查询会给出错误“地理字段不支持精确搜索,请改用专用地理查询:[位置]”。第二个查询不返回结果。

谢谢

标签: javaelasticsearchelastic-rest-client

解决方案


推荐阅读