java语言,再elasticsearch中根据半径查询数据
时间: 2024-05-02 22:20:16 浏览: 146
在 Elasticsearch 中,可以使用地理位置字段来存储经纬度信息,并使用 Geo Distance Query 进行基于距离的查询。
以下是基于半径查询数据的 Java 代码示例:
```java
import org.elasticsearch.index.query.QueryBuilder;
import org.elasticsearch.index.query.QueryBuilders;
import org.elasticsearch.search.builder.SearchSourceBuilder;
import org.elasticsearch.search.sort.SortBuilders;
import org.elasticsearch.search.sort.SortOrder;
import org.elasticsearch.common.unit.DistanceUnit;
import org.elasticsearch.common.geo.GeoDistance;
import org.elasticsearch.common.geo.GeoPoint;
// 设置查询条件
QueryBuilder queryBuilder = QueryBuilders
.geoDistanceQuery("location") // 地理位置字段名称
.point(centerLat, centerLon) // 圆心经纬度
.distance(radius, DistanceUnit.KILOMETERS) // 半径,单位为公里
.geoDistance(GeoDistance.ARC); // 地理距离计算方式
// 设置排序规则
SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();
sourceBuilder.sort(SortBuilders
.geoDistanceSort("location", new GeoPoint(centerLat, centerLon))
.order(SortOrder.ASC)
.unit(DistanceUnit.KILOMETERS)
.point(new GeoPoint(centerLat, centerLon))
.geoDistance(GeoDistance.ARC));
// 执行查询
SearchResponse response = client.prepareSearch("my_index")
.setTypes("my_type")
.setQuery(queryBuilder)
.setFrom(0)
.setSize(10)
.setFetchSource(true)
.setSource(sourceBuilder)
.execute()
.actionGet();
```
在上述代码中,`location` 是地理位置字段名称,`centerLat` 和 `centerLon` 是圆心的经度和纬度,`radius` 是半径,单位为公里。`GeoDistance.ARC` 表示使用基于弧度的地理距离计算方式。
查询结果将按照距离圆心的距离升序排列。可以通过 `setFrom` 和 `setSize` 方法设置查询结果的分页。
阅读全文