springboot 集成elasticsearch

1、 现在下载安装 elasticsearch

2、添加配置信息

2.1、 根据你要使用的环境 application-local.yaml    application-prod.yaml    application-test.yaml

增加配置信息

spring:
  elasticsearch:
    uris: http://es的IP:端口号

2.2、pom文件添加依赖

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

 3、同步数据

  @Resource
    private ElasticsearchOperations elasticsearchOperations;

3.1、创建同步数据实体类

单条保存

 public void esSave(CluePoolEsVO esVO) {

        IndexCoordinates indexCoordinates = elasticsearchOperations.getIndexCoordinatesFor(esVO.getClass());

        IndexQuery indexQuery = new IndexQueryBuilder()
                .withId(String.valueOf(esVO.getId()))
                .withObject(esVO)
                .build();
        String documentId = elasticsearchOperations.index(indexQuery, indexCoordinates);
    }

 多条保存

 public void bulkInsert(List<CluePoolEsVO> esList) {
        List<IndexQuery> indexQueries = new ArrayList<>();

        // 构建 IndexQuery 对象
        esList.forEach(es -> {
            IndexQuery indexQuery = new IndexQueryBuilder()
                    .withId(String.valueOf(es.getId()))
                    .withObject(es)
                    .build();
            indexQueries.add(indexQuery);
        });

        // 分批处理
        for (int i = 0; i < esList.size(); i += 1000) {
            int end = Math.min(i + 1000, esList.size());
            List<IndexQuery> batchQueries = indexQueries.subList(i, end);

            // 执行批量插入
            elasticsearchOperations.bulkIndex(batchQueries, CluePoolEsVO.class);
        }
    }

定时任务 同步

   @Scheduled(cron = "0 0 0 * * ?") // 每天凌晨执行
    public void executeAtMidnight() {
        List<CluePoolDO> cluePool = cluePoolMapper.selectList();
        List<CluePoolEsVO> esList = BeanUtils.toBean(cluePool, CluePoolEsVO.class);

        // 转换字典数据
        for (CluePoolEsVO esVO : esList) {
            esVO.setSex(DictFrameworkUtils.getDictDataLabel("system_user_sex", esVO.getSex()));
            esVO.setPastPost(DictFrameworkUtils.getDictDataLabel("position", esVO.getPastPost())); // 示例其他字段
            // 其他需要转换的字段
        }

        // 进行全量同步
        bulkInsert(esList);
    }

4、使用es查询数据

 public CommonResult<PageResult<CluePoolRespVO>> getEs(
            @RequestParam(value = "name", required = false) String name,
            @RequestParam("pageNo") String pageNo,
            @RequestParam("pageSize") String pageSize) {

        // 参数校验
        int pageNoInt = Math.max(1, Integer.parseInt(pageNo));
        int pageSizeInt = Math.max(1, Integer.parseInt(pageSize));

        // 空值处理
        name = name == null ? "" : name.trim();

        // 构建查询条件
        NativeSearchQueryBuilder searchQueryBuilder = new NativeSearchQueryBuilder();

        // 创建多字段匹配查询,并设置权重
        MultiMatchQueryBuilder multiMatchQueryBuilder = QueryBuilders.multiMatchQuery(name)
//                .field("name", 1)  // 增加权重
//                .field("phones", 1)
//                .field("via", 2)
//                .field("mainPhone", 3)
//                .field("education", 2)
//                .field("sex", 1)
//                .field("age", 1)
//                .field("idCard", 2)
                .field("homeAdress", 3)
//                .field("jobIntentionCityCode", 1)
                .field("jobIntentionCity", 2)
//                .field("homeAdressCode", 1)
                .field("pastIndustry", 2)
                .field("pastPost", 3)
                .field("salaryRangeUp", 1)
                .field("salaryRangeDown", 1)
//                .field("yearsOfWorking", 1)
//                .field("skillCertificateUrls", 1)
                .field("remark", 3)
//                .field("tpostName", 2)
                .field("jnTags", 1)
                .field("tags", 3)
//                .field("flag", 1)
                .field("adressDetil", 1)
                .field("tagIds", 1)
                .field("projectName", 1)
//                .minimumShouldMatch("80%")
                ;  // 至少匹配 80%
        TermQueryBuilder termQueryBuilder = QueryBuilders.termQuery("isFollow", CommonStatusEnum.is_Not_Follow.getStatus());

// 组合查询
        BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery()
                .must(multiMatchQueryBuilder)
                .filter(termQueryBuilder);
        if (name.isEmpty()) {
            searchQueryBuilder.withQuery(QueryBuilders.matchAllQuery());
        } else {
            searchQueryBuilder.withQuery(boolQueryBuilder);
        }

        // 设置分页
        searchQueryBuilder.withPageable(PageRequest.of(pageNoInt - 1, pageSizeInt));

        // 构建 count 查询
        NativeSearchQueryBuilder countQueryBuilder = new NativeSearchQueryBuilder();
        if (name.isEmpty()) {
            countQueryBuilder.withQuery(QueryBuilders.matchAllQuery());
        } else {
            countQueryBuilder.withQuery(boolQueryBuilder);
        }

        // 执行 count 查询
        long totalElements = elasticsearchOperations != null ? elasticsearchOperations.count(countQueryBuilder.build(), CluePoolEsVO.class) : 0;

        // 执行查询
        NativeSearchQuery searchQuery = searchQueryBuilder.build();
        SearchHits<CluePoolEsVO> searchHits = elasticsearchOperations != null ? elasticsearchOperations.search(searchQuery, CluePoolEsVO.class) : null;

        List<CluePoolEsVO> content = searchHits != null ? searchHits.stream()
                .map(SearchHit::getContent)
                .collect(Collectors.toList()) : Collections.emptyList();

        for (CluePoolEsVO esVO : content){
            esVO.setSex(DictFrameworkUtils.parseDictDataValue("system_user_sex", esVO.getSex()));
        }
        return success(new PageResult<>(BeanUtils.toBean(content, CluePoolRespVO.class), totalElements));
    }

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值