首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >嵌套字段的Elasticsearch距离

嵌套字段的Elasticsearch距离
EN

Stack Overflow用户
提问于 2019-11-07 00:18:29
回答 1查看 94关注 0票数 0

我有一个如下所示的数据集:

代码语言:javascript
复制
company: 
  offices[]

一家公司可以有多个办公室。办公室有一个与之相关联的lat long。我有一个查询,它根据使用稍后的办公室的距离搜索返回公司。到目前一切尚好。

我现在想要做的是只返回公司内部在我正在寻找的原始距离半径内的办公室。

所以如果我有这样的结果:

代码语言:javascript
复制
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。不会返回Office1和Office2。

我知道我可以通过编程来做到这一点,但我想看看是否可以优化查询以获得我真正想要的结果集。Vs.所有这些,然后再进行处理。

EN

回答 1

Stack Overflow用户

发布于 2019-11-07 02:50:58

我不知道你说的“我知道我可以通过编程来做这件事”是什么意思,但是通过使用geoDistanceQuery,你能够优化你的查询(但仍然是通过编程)。

请在下面找到Java代码片段。希望这能帮助你,让我知道你什么时候需要更多的信息。

代码语言:javascript
复制
    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);
}

强文本

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58734454

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档