Elasticsearch расстояние с вложенными полями - PullRequest
0 голосов
/ 06 ноября 2019

У меня есть набор данных, который выглядит примерно так:

company: 
  offices[]

У компании может быть много офисов. У офиса есть длинный лат, связанный с этим. У меня есть запрос, который возвращает компании, основанные на удаленном поиске, используя офисы по всему миру. Все идет нормально.

То, что я сейчас хочу сделать, это ТОЛЬКО вернуть офисы внутри компании, которые находятся в пределах исходного радиуса расстояния, который я ищу.

Так что, если у меня будет такой результат:

Company: 
  Office[0]: 
    lat: 1
    long: 2
    distance: 10
  Office[1]: 
    lat: 4
    long: 5
    distance: 30
  Office[2]: 
    lat: 7
    long: 8
    distance: 100

Как мне вернуть компанию, но также только те офисы, которые находятся на расстоянии: 20. В приведенном выше примере я ожидал бытолько получить Компания> Офис [0]. Офис [1] и Офис [2] не будут возвращены.

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

1 Ответ

0 голосов
/ 06 ноября 2019

Не знаю, что именно вы имеете в виду под словом «я знаю, что я могу сделать это программно», но с помощью geoDistanceQuery вы можете оптимизировать свой запрос (хотя и программно).

Ниже приведен фрагмент кода Java. Надеюсь, это поможет, дайте мне знать, когда вам понадобится дополнительная информация.

    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();

    BoolQueryBuilder boolQuery = getBooleanQueryWithConditions(esQuery);

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

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

сильный текст

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...