我有一个如下所示的数据集:
company:
offices[]一家公司可以有多个办公室。办公室有一个与之相关联的lat long。我有一个查询,它根据使用稍后的办公室的距离搜索返回公司。到目前一切尚好。
我现在想要做的是只返回公司内部在我正在寻找的原始距离半径内的办公室。
所以如果我有这样的结果:
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.所有这些,然后再进行处理。
发布于 2019-11-07 02:50:58
我不知道你说的“我知道我可以通过编程来做这件事”是什么意思,但是通过使用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://stackoverflow.com/questions/58734454
复制相似问题