Как искать область рядом с местоположением, используя долготу широты в упругом поиске - PullRequest
0 голосов
/ 24 октября 2019

Я хочу найти все близлежащие места по паре широты и длины в моем упругом поиске, которые имеют два отдельных столбца для широты и долготы. Как это сделать

1 Ответ

0 голосов
/ 24 октября 2019

Вам придется использовать geoDistanceQuery. Ниже приведен фрагмент кода (написанный на Java с использованием клиента высокого уровня Elasticsearch REST.

К вашему сведению: полное руководство доступно на моем веб-сайте: www.ictdynamic.be -> ElasticSearch6 - Пространственные запросы с RestHighLevelClient и Java - Часть 1: geoDistanceQuery

    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);
}
...