栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 前沿技术 > 大数据 > 大数据系统

ElasticSearch7.12 较复杂查询包含ES按距离排序

ElasticSearch7.12 较复杂查询包含ES按距离排序

刚开始接触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;

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/326813.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号