刚开始接触ES,今天写了一段代码,记录一下,有不足的地方,欢迎评论指教。
基于 ElasticsearchRestTemplate 对象操作ES库,新版本的ES没有什么特殊的需求,不需要设置,直接注入即可。
@Resource
ElasticsearchRestTemplate elasticsearchRestTemplate;
原SQL:***代表要传入的参数,需要查询,然后排序,排序中还有根据距离排序
SELECt * FROM sys_events e where e.status != *** and (e.user_id = **** or (e.user_id != **** and e.is_delete != 1)) and e.type in (***, ***, ***) order by list_order desc,create_day desc, distance asc;
这是我的解决方案:
// 查询对象
BoolQueryBuilder baseBuilder = new BoolQueryBuilder();
// 构建查询条件
if (types != null && types.length > 0){
baseBuilder.must(QueryBuilders.termsQuery("type", (Object[]) types));
}
baseBuilder.mustNot(QueryBuilders.termQuery("status", status));
baseBuilder.must(QueryBuilders.termQuery("is_delete", 0));
baseBuilder.should(QueryBuilders.termQuery("user_id", currentUser.getUserId()));
// 按照距离排序
GeoDistanceSortBuilder sortBuilder = SortBuilders.geoDistanceSort("gs",new GeoPoint(lat.doublevalue(), lng.doublevalue())) // 字段和经度、纬度
.unit(DistanceUnit.KILOMETERS)
.geoDistance(GeoDistance.ARC) // 计算方式
.order(SortOrder.ASC);
NativeSearchQuery query = new NativeSearchQueryBuilder()
.withQuery(baseBuilder)
.withSort(SortBuilders.fieldSort("list_order").order(SortOrder.DESC))
.withSort(SortBuilders.fieldSort("create_time").order(SortOrder.DESC))
.withSort(sortBuilder)
.build();
if(pageNum >= 0 && pageSize > 0){
query.setPageable(PageRequest.of((pageNum - 1) * pageSize, pageSize));
}
// 开始查询
SearchHits search = elasticsearchRestTemplate.search(query, EsEvent.class);
List> searchHits = search.getSearchHits();
ArrayList list = new ArrayList<>();
searchHits.forEach((x) -> {
Events event = esEventToEventHandler(x.getContent(), lat, lng, currentUser.getUserId());
event.setCurrentId(currentUser.getUserId());
list.add(event);
});
ES距离字段映射:
"gs" : {
"type" : "geo_point"
},
其中一条记录存储的值:
"gs" : {
"lon" : 103.976981,
"lat" : 30.634684
},
java中实体类:
@GeoPointField
@Field(name = "gs", type = FieldType.Auto)
private GeoPoint lonLat;



