??下文整理的幾個問答勒葱,本人在實際應用中親身經(jīng)歷或解決過的迷捧,主要涉及Elasticsearch地理坐標類型(Geo-point)在Java應用中的一些特殊使用場景庸蔼,核心依賴如下:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-elasticsearch</artifactId>
</dependency>
A1. elasticsearch的geo_point
類型對應java中的哪種數(shù)據(jù)類型喻粹?
Q1. spring data elasticsearch中定義了GeoPoint
這個類來實現(xiàn)兩者之間的類型映射坏快,此外還需要為當前字段添加@GeoPointField
注解進行標志,注意GeoPoint
應該使用org.springframework.data.elasticsearch.core.geo
包下的唯卖。
/**
* 坐標位置
*/
@GeoPointField
private GeoPoint location;
A2. spring data elasticsearch中粱玲,如何以某坐標點為中心搜索指定范圍的其它點?
Q2. 建議盡可能通過繼承ElasticsearchRepository<T, ID extends Serializable>
來簡化完成相關查詢拜轨;
??實現(xiàn)以某點為中心并搜索指定范圍抽减,首先定義如下:
public interface TestRepository extends ElasticsearchRepository<Test, String> {
}
??其次可通過QueryBuilder
接口來實現(xiàn)上述功能,參考如下:
@Service
public class TestService {
@Resource
private TestRepository testRepository;
public Page<Test> findPage(double latitude, double longitude, String distance, Pageable pageable) {
// 間接實現(xiàn)了QueryBuilder接口
BoolQueryBuilder boolQueryBuilder = new BoolQueryBuilder();
// 以某點為中心橄碾,搜索指定范圍
GeoDistanceQueryBuilder distanceQueryBuilder = new GeoDistanceQueryBuilder("location");
distanceQueryBuilder.point(latitude, longitude);
// 定義查詢單位:公里
distanceQueryBuilder.distance(distance, DistanceUnit.KILOMETERS);
boolQueryBuilder.filter(distanceQueryBuilder);
return testRepository.search(boolQueryBuilder, pageable);
}
}
A3. spring data elasticsearch中卵沉,如何計算兩個給定坐標點之間的距離?
Q3. 在GeoDistance
類中定義了相關的計算方法法牲,參考如下:
// 計算兩點距離
double distance = GeoDistance.ARC.calculate(srcLat, srcLon, dstLat, dstLon, DistanceUnit.KILOMETERS);
??關于GeoDistance.ARC
和GeoDistance.PLANE
史汗,前者比后者計算起來要慢,但精確度要比后者高拒垃,具體區(qū)別可以看這里停撞。
A4. spring data elasticsearch應用中,如何以某個坐標點為中心悼瓮,按距離近遠排序搜索指定范圍戈毒?
Q4. 通過SearchQuery
來實現(xiàn)艰猬,參考下面這段代碼中GeoDistanceSortBuilder
的使用:
@Service
public class TestService {
@Resource
private TestRepository testRepository;
public Page<Test> findPage(double latitude, double longitude, String distance, Pageable pageable) {
// 實現(xiàn)了SearchQuery接口,用于組裝QueryBuilder和SortBuilder以及Pageable等
NativeSearchQueryBuilder nativeSearchQueryBuilder = new NativeSearchQueryBuilder();
nativeSearchQueryBuilder.withPageable(pageable)
// 間接實現(xiàn)了QueryBuilder接口
BoolQueryBuilder boolQueryBuilder = new BoolQueryBuilder();
// 以某點為中心副硅,搜索指定范圍
GeoDistanceQueryBuilder distanceQueryBuilder = new GeoDistanceQueryBuilder("location");
distanceQueryBuilder.point(latitude, longitude);
// 定義查詢單位:公里
distanceQueryBuilder.distance(distance, DistanceUnit.KILOMETERS);
boolQueryBuilder.filter(distanceQueryBuilder);
nativeSearchQueryBuilder.withQuery(boolQueryBuilder);
// 按距離升序
GeoDistanceSortBuilder distanceSortBuilder =
new GeoDistanceSortBuilder("location", latitude, longitude);
distanceSortBuilder.unit(DistanceUnit.KILOMETERS);
distanceSortBuilder.order(SortOrder.ASC);
nativeSearchQueryBuilder.withSort(distanceSortBuilder);
return testRepository.search(nativeSearchQueryBuilder.build());
}
}
文章已授權(quán)轉(zhuǎn)載姥宝,原文鏈接:Elasticsearch 地理坐標類型 (Geo-point) 在 Spring Data ES 中的常見使用問題整理解答