Spring Boot Elasticsearch中级查询实现-ES索引别名查询

本文介绍了如何在SpringBoot项目中使用Elasticsearch进行中级查询,特别是通过索引别名进行查询。首先引入了相关依赖,然后展示了如何构建复合查询条件,包括term查询、match Phrase查询和range查询。同时,实现了分页和时间排序功能。最后,将查询结果转换并封装为业务对象,返回给前端。
摘要由CSDN通过智能技术生成

Spring Boot Elasticsearch中级查询实现-ES索引别名查询

注意:我的版本是elasticsearch7.6.2、spring-boot-starter-data-elasticsearch-2.5.6

引入依赖

	<dependency>
		<groupId>org.springframework.boot</groupId>
		<artifactId>spring-boot-starter-data-elasticsearch</artifactId>
	</dependency>

ES分页查询接口实现,直接通过ES索引别名查询

	@Override
    public Page<AlarmHistoryVO> alarmHistoryPage(PageParams<FindHistoryDTO> pageParams, Boolean flag) {
        SearchRequest searchRequest = new SearchRequest("alarm_history_search");
        SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();
        //使用BoolQueryBuilder进行复合查询
        BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery();
//        boolQueryBuilder.must(QueryBuilders.termQuery("companyId", SecurityUtils.getCompanyId()));
        if (StrUtil.isNotBlank(pageParams.getModel().getDeviceIp())){
            boolQueryBuilder.must(QueryBuilders.termQuery("deviceIp",pageParams.getModel().getDeviceIp()));
        }
        if (StrUtil.isNotBlank(pageParams.getModel().getAlarmName())){
            boolQueryBuilder.must(QueryBuilders.matchPhraseQuery("alarmName",pageParams.getModel().getAlarmName()));
        }
        if (pageParams.getModel().getAlarmLevel() != null && pageParams.getModel().getAlarmLevel() != -1){
            boolQueryBuilder.must(QueryBuilders.termQuery("alarmLevel",pageParams.getModel().getAlarmLevel()));
        }
        if (flag) {
            boolQueryBuilder.must(QueryBuilders.termQuery("status", StaticConstant.ZERO));
        } else {
            if (pageParams.getModel().getStatus() != null && pageParams.getModel().getStatus() != -1) {
                boolQueryBuilder.must(QueryBuilders.termQuery("status", pageParams.getModel().getStatus()));
            }
        }
        //时间区间查询 时间段 一定要有头有尾 不然会出现慢查询
        if (StrUtil.isNotBlank(pageParams.getModel().getStartTime()) && StrUtil.isNotBlank(pageParams.getModel().getEndTime())){
            boolQueryBuilder.filter(QueryBuilders.rangeQuery("createTime").from(pageParams.getModel().getStartTime()).to(pageParams.getModel().getEndTime()));
        }
        /*if (StrUtil.isNotBlank(pageParams.getModel().getStartTime())) {
            boolQueryBuilder.must(QueryBuilders.rangeQuery("createTime").gte(pageParams.getModel().getStartTime()));
        }
        if (StrUtil.isNotBlank(pageParams.getModel().getEndTime())) {
            boolQueryBuilder.must(QueryBuilders.rangeQuery("createTime").lte(pageParams.getModel().getEndTime()));
        }*/
//        NativeSearchQueryBuilder searchQueryBuilder = new NativeSearchQueryBuilder().withTrackTotalHits(true)
//                .withQuery(boolQueryBuilder)
//                .withPageable(PageRequest.of((int) pageParams.getCurrent() - 1, (int) pageParams.getSize()));
//        //时间
//        searchQueryBuilder.withSort(SortBuilders.fieldSort("createTime").order(SortOrder.DESC));
//
//        NativeSearchQuery searchQuery = searchQueryBuilder.build();
//        SearchHits<EsAlarmHistoryVO> search = elasticsearchRestTemplate.search(searchQuery, EsAlarmHistoryVO.class);
        NativeSearchQuery build = new NativeSearchQueryBuilder().withQuery(boolQueryBuilder).withTrackTotalHits(true)
                .withPageable(PageRequest.of((int) pageParams.getCurrent() - 1, (int) pageParams.getSize()))
                .withSort(SortBuilders.fieldSort("createTime").order(SortOrder.DESC)).build();
        searchRequest.source(sourceBuilder);
        SearchHits<EsAlarmHistoryVO> search = elasticsearchRestTemplate.search(build, EsAlarmHistoryVO.class);
        List<EsAlarmHistoryVO> list = search
                .stream()
                .map(SearchHit::getContent)
                .collect(Collectors.toList());
        Page<AlarmHistoryVO> page = new Page();
        //封装最终返回前端数据
        List<AlarmHistoryVO> alarmHistoryVOS = BeanUtilPlus.toBeanList(list, AlarmHistoryVO.class);
        if (list.size()>0) {
            List<String> ids = list.stream().map(EsAlarmHistoryVO::getId).collect(Collectors.toList());
            List<AlarmHistoryVO> voList = alarmHistoryService.getPageListByIds(ids);
            for (AlarmHistoryVO historyVO : alarmHistoryVOS) {
                for (AlarmHistoryVO vo : voList) {
                    if (historyVO.getId().equals(vo.getId())) {
                        historyVO.setAlarmDescriptionId(vo.getAlarmDescriptionId());
                        historyVO.setAlarmDescription(vo.getAlarmDescription());
                        alarmHistoryService.addAlarmInfo(historyVO);
                        break;
                    }
                }
            }
        }
        page.setRecords(alarmHistoryVOS);
        page.setPages(pageParams.getSize());
        page.setCurrent(pageParams.getCurrent());
        page.setTotal(search.getTotalHits());
        return page;
    }

实体中无需添加ES索引名信息

@Data
public class EsAlarmHistoryVO implements Serializable {
}

下一篇: Spring Boot Elasticsearch高级查询实现-ES索引别名查询升级版.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值