首页 文章

到elasticsearch获取最近的位置

提问于
浏览
2

我正在构建一个需要弹性搜索的应用程序,以根据纬度和经度查找最近的位置 . 目前我能够基于GeoPoint和最大距离(公里)来做到这一点 .

@Override
public List<CityDefinition> findCitiesNearby(GeoPoint geo, double distance, String source) {
    LOGGER.info("<findCitiesNearby>");

    FilterBuilder filterBuilderGeo = FilterBuilders.geoDistanceFilter("geo").point(geo.getLat(), geo.getLon()).distance(distance, DistanceUnit.KILOMETERS);

    SearchQuery q = new NativeSearchQueryBuilder()
            .withFilter(filterBuilderGeo);

    List<CityDefinition> fields = esOps.queryForList(q, CityDefinition.class);

    return fields;
}

这几乎是完美的,但不是在给定的距离内搜索,我想要弹性返回最近的位置,无论距离 . 这可能吗?如果是,我该怎么做?

2 回答

  • 1

    你可以按距离排序,而不是过滤 .

    沿着这些方向的东西应该有效:

    public List<CityDefinition> findCitiesNearby(GeoPoint geo, double distance, String source) {
        GeoDistanceSortBuilder geoDistanceSort = SortBuilders.geoDistanceSort("geo").point(geo.lat(), geo.lon())
                .unit(DistanceUnit.KILOMETERS).sortMode("ASC")
                .geoDistance(GeoDistance.PLANE);
    
        final int limit = 1; // if you want only the single nearest result.
        SearchQuery q = new NativeSearchQueryBuilder()
                .withSort(geoDistanceSort)
                .withPageable(new PageRequest(0, limit))
                .build();
    
        List<CityDefinition> fields = esOps.queryForList(q, CityDefinition.class);
    
        return fields;
    }
    
  • 0

    显然,可以删除距离部分 .

    @Override
    public List<CityDefinition> findCitiesNearby(GeoPoint geo, double distance, String source) {
        LOGGER.info("<findCitiesNearby>");
    
        //FilterBuilder filterBuilderGeo = FilterBuilders.geoDistanceFilter("geo").point(geo.getLat(), geo.getLon()).distance(distance, DistanceUnit.KILOMETERS);
    
        FilterBuilder filterBuilderGeo = FilterBuilders.geoDistanceFilter("geo").point(geo.getLat(), geo.getLon());
    
        SearchQuery q = new NativeSearchQueryBuilder()
                .withFilter(filterBuilderGeo);
    
        List<?> fields = esOps.queryForList(q, CityDefinition.class);
    
        return (List<CityDefinition>) fields;
    }
    

相关问题