带嵌套字段的Elasticsearch距离

我有一个看起来像这样的数据集:

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.在上面的示例中,我希望仅退还Company> Office [0]。将不返回Office [1]和Office [2]。

我知道我可以通过编程方式执行此操作,但是我想查看是否可以优化查询以获取我实际想要的结果集。 VS.所有这些,然后再处理。

libenlai04261 回答:带嵌套字段的Elasticsearch距离

不知道“我知道我可以通过编程方式执行此操作”的确切含义,但是通过使用 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);
}

强文本

本文链接:https://www.f2er.com/3150554.html

大家都在问