elasticsearch根据地理坐标查询按照距离从近到远排序
功能需求
1. 查询方圆3000米范围内的所有用户/商户数据
2. 根据距离排序(查询我附近的用户/商户,按距离排序并显示距离,单位米(前端要传location字段))
/**
* 排序封装(查询我附近的用户/商户,按距离排序并显示距离,单位米(前端要传location字段))
*
* @param param
* @param request
*/
private void buildBasicSort(EsNearbyDTO param, SearchRequest request) {
// 查询我附近的用户/商户,并显示距离,单位米(前端要传location字段)
String location = NjBeanUtils.convertToFieldName(NearbyIndex::getLocation);
request.source().sort(SortBuilders
.geoDistanceSort(location, new GeoPoint(param.getLocation()))
.order(SortOrder.ASC)
.unit(DistanceUnit.METERS) //单位米
);
// 深度分页通过id排序,全局唯一值
if(param.getPage() == null || Constant.ZERO.equals(param.getPage())) {
String id = NjBeanUtils.convertToFieldName(NearbyIndex::getId);
request.source().sort(id, SortOrder.ASC);
}
}
/**
* 条件查询封装
*
* @param param
* @param request
*/
private void buildBasicQuery(EsNearbyDTO param, SearchRequest request) {
// 1.准备Boolean查询
BoolQueryBuilder boolQuery = QueryBuilders.boolQuery();
// 用户ID/商户ID
if(param.getId() != null) {
boolQuery.filter(QueryBuilders.termQuery(NjBeanUtils.convertToFieldName(NearbyIndex::getId), param.getId()));
}
// 角色类型(0:用户,1:商户)
if(param.getRoleType() != null) {
boolQuery.filter(QueryBuilders.termQuery(NjBeanUtils.convertToFieldName(NearbyIndex::getRoleType), param.getRoleType()));
}
// 用户进来超过24小时后失效,数据不再显示
if(RoleTypeEnum.VIP.getCode().equals(param.getRoleType())) {
String expiryDate = NjBeanUtils.convertToFieldName(NearbyIndex::getExpiryDate);
boolQuery.filter(QueryBuilders.rangeQuery(expiryDate).gte(new Date().getTime()));
}
//按距离查询,单位米,eg:查询3000米范围内的数据
if(null != param.getDistance()) {
GeoDistanceQueryBuilder distanceQueryBuilder = new GeoDistanceQueryBuilder("location");
distanceQueryBuilder.point(new GeoPoint(param.getLocation()));
distanceQueryBuilder.distance(param.getDistance(), DistanceUnit.METERS);
boolQuery.filter(distanceQueryBuilder);
}
request.source().query(boolQuery);
}
标签:
es geo
, Elasticsearch geo
, Elasticsearch 地理坐标
, es 地理坐标
, Elasticsearch 坐标范围
, es 坐标范围
, es 空间位置
, Elasticsearch 空间位置
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· 写一个简单的SQL生成工具
· AI 智能体引爆开源社区「GitHub 热点速览」
· C#/.NET/.NET Core技术前沿周刊 | 第 29 期(2025年3.1-3.9)
2017-11-02 后备干部,究竟应该提拔什么样的员工?
2017-11-02 git常用命令
2013-11-02 win7+jdk环境变量配置
2011-11-02 二十九、Google Map实现地图查询案例