elasticsearch 嵌套字段的弹性搜索距离,elasticsearch,elasticsearch" /> elasticsearch 嵌套字段的弹性搜索距离,elasticsearch,elasticsearch" />

elasticsearch 嵌套字段的弹性搜索距离

elasticsearch 嵌套字段的弹性搜索距离,elasticsearch,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 一家公司可以有许多办公室。办公室有一个与之关联的lat long。我有一个

我有一个类似以下内容的数据集:

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
一家公司可以有许多办公室。办公室有一个与之关联的lat long。我有一个查询,它使用Office lat long基于距离搜索返回公司。到目前为止还不错

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

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

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]。办公室[1]和办公室[2]不会被退回


我知道我可以通过编程来实现这一点,但我想看看是否可以优化查询以获得我真正想要的结果集。与所有的,然后处理它之后

我不知道“我知道我可以通过编程实现这一点”的确切含义,但通过使用地理距离查询您可以优化您的查询(但仍然是通过编程实现的)

请在下面找到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);
}
public Set geoDistanceQuery(字符串索引、字符串名称geopointfield、双lat、双lon、双距离、EsQuery-EsQuery)引发IOException{
日期开始日期=新日期();
Set objectsWithinDistance=new LinkedHashSet();
SearchSourceBuilder sourceBuilder=新的SearchSourceBuilder();
BoolQueryBuilder boolQuery=getBooleanQueryWithConditions(esQuery);
QueryBuilder地理距离QueryBuilder=QueryBuilder
.geoDistanceQuery(名称地理点字段)
.点(横向、纵向)
.距离(距离,距离单位为公里);
QueryBuilder completeQuery=QueryBuilders.boolQuery().must(boolQuery).filter(地理距离QueryBuilder);
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);
}
strong文本