elasticsearch,geolocation,latitude-longitude,Spring Boot,elasticsearch,Geolocation,Latitude Longitude" /> elasticsearch,geolocation,latitude-longitude,Spring Boot,elasticsearch,Geolocation,Latitude Longitude" />

Spring boot 如何在弹性搜索中使用经纬度搜索位置附近的区域

Spring boot 如何在弹性搜索中使用经纬度搜索位置附近的区域,spring-boot,elasticsearch,geolocation,latitude-longitude,Spring Boot,elasticsearch,Geolocation,Latitude Longitude,我想通过我的弹性搜索搜索,搜索所有附近的位置,给定一对lat-long,它有两个单独的纬度和经度列。 如何执行此操作您必须使用地理距离查询。请查找下面的代码片段(使用Elasticsearch REST高级客户端,用Java编写) 仅供参考:我的网站上提供了完整的教程:->ElasticSearch 6–使用RestHighLevelClient和Java进行空间查询–第1部分:地理距离查询 public Set<?> geoDistanceQuery(String inde

我想通过我的弹性搜索搜索,搜索所有附近的位置,给定一对lat-long,它有两个单独的纬度和经度列。
如何执行此操作

您必须使用地理距离查询。请查找下面的代码片段(使用Elasticsearch REST高级客户端,用Java编写)

仅供参考:我的网站上提供了完整的教程:->ElasticSearch 6–使用RestHighLevelClient和Java进行空间查询–第1部分:地理距离查询

    public Set<?> geoDistanceQuery(String index, String nameGeoPointField, double lat, double lon, double distance, EsQuery esQuery) throws IOException {
    Date startDate = new Date();

    Set<Object> objectsWithinDistance = new LinkedHashSet<>();
    SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();

    QueryBuilder geoDistanceQueryBuilder = QueryBuilders
            .geoDistanceQuery(nameGeoPointField)
            .point(lat, lon)
            .distance(distance, DistanceUnit.KILOMETERS);

    BoolQueryBuilder boolQuery = getBooleanQueryWithConditions(esQuery);

    QueryBuilder completeQuery = QueryBuilders
            .boolQuery()
            .must(boolQuery)
            .filter(geoDistanceQueryBuilder);

    sourceBuilder.query(completeQuery).size(SIZE_ES_QUERY);

    SearchRequest searchRequest = new SearchRequest(index)
            .source(sourceBuilder.sort(SortBuilders.geoDistanceSort(nameGeoPointField, lat, lon)
                    .order(SortOrder.ASC)
                    .unit(DistanceUnit.KILOMETERS)));

    SearchResponse searchResponse = restClient.search(searchRequest, RequestOptions.DEFAULT);

    SearchHits hits = searchResponse.getHits();

    for (SearchHit hit : hits.getHits()) {
        objectsWithinDistance.add(GeoService.getObjectFrom_ES_Hit(hit, nameGeoPointField));
    }

    return timedReturn(LOGGER, new Object() {}.getClass().getEnclosingMethod().getName(), startDate.getTime(), objectsWithinDistance);
}
public Set geoDistanceQuery(字符串索引、字符串名称geopointfield、双lat、双lon、双距离、EsQuery-EsQuery)引发IOException{
日期开始日期=新日期();
Set objectsWithinDistance=new LinkedHashSet();
SearchSourceBuilder sourceBuilder=新的SearchSourceBuilder();
QueryBuilder地理距离QueryBuilder=QueryBuilder
.geoDistanceQuery(名称地理点字段)
.点(横向、纵向)
.距离(距离,距离单位为公里);
BoolQueryBuilder boolQuery=getBooleanQueryWithConditions(esQuery);
QueryBuilder completeQuery=QueryBuilders
.boolQuery()
.must(boolQuery)
.过滤器(地理距离查询生成器);
sourceBuilder.query(completeQuery).size(size\u ES\u查询);
SearchRequest SearchRequest=新的SearchRequest(索引)
.source(sourceBuilder.sort(SortBuilders.geoDistanceSort(nameGeoPointField,lat,lon)
.order(SortOrder.ASC)
.单位(距离单位,公里);;
SearchResponse SearchResponse=restClient.search(searchRequest,RequestOptions.DEFAULT);
SearchHits=searchResponse.getHits();
for(SearchHit:hits.getHits()){
添加(GeoService.getObjectFrom_ES_Hit(Hit,nameGeoPointField));
}
返回timedReturn(记录器,新对象(){}.getClass().GetEnclosuringMethod().getName(),startDate.getTime(),ObjectSwithinInstance);
}
Link死了。