【问题标题】:Get nearest location with elasticsearch使用elasticsearch获取最近的位置
【发布时间】:2016-02-09 19:54:39
【问题描述】:

我正在构建一个应用程序,该应用程序需要弹性搜索来根据纬度和经度查找最近的位置。目前,我可以根据 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;
}

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

【问题讨论】:

    标签: java geolocation elasticsearch geopoints


    【解决方案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;
    }
    

    【讨论】:

      【解决方案2】:

      显然可以只删除距离部分。

      @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;
      }
      

      【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-02-06
      • 1970-01-01
      • 2012-11-15
      • 2020-11-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多