第六节 若依框架集成ElasticSearch并实现分页查询

亮子 | 2025-12-03 19:44:30 | 56 | 0 | 0 | 0

1、引入依赖

在需要集成ElasticSearch的项目的pom文件中,添加下面依赖:

<dependency>
    <groupId>org.springframework.data</groupId>
    <artifactId>spring-data-elasticsearch</artifactId>
    <version>4.4.18</version>
</dependency>

image.png

2、修改nacos对应的微服务的配置

# spring配置
spring:
  redis:
    host: 192.168.80.192
    port: 6379
    password: 
  elasticsearch:
    rest:
      uris: http://192.168.80.192:9200

image.png

3、引入ElasticSearch的模板引擎

@Autowired
ElasticsearchRestTemplate elasticsearchRestTemplate;

4、检查并创建索引和映射

es对象的创建,没有给出代码

@PostConstruct
public void readProductForEs() {
    // 项目启动时,从数据库中读取商品信息,并保存到ES中
    List<TbProduct> tbProducts = tbProductMapper.selectTbProductList(null);

    // 检查并创建索引和映射
    IndexOperations indexOps = elasticsearchRestTemplate.indexOps(TbProduct.class);
    if (!indexOps.exists()) {
        // 创建索引
        indexOps.create();

        // 创建映射
        Document mapping = indexOps.createMapping(TbProduct.class);
        indexOps.putMapping(mapping);
    }

    // 批量插入
    elasticsearchRestTemplate.save(tbProducts);

    log.info("商品信息保存到ES成功");
}

5、高亮查询

@Override
public AjaxResult listFromEs(String pageNum, String pageSize, TbProduct tbProduct) {
    //--1 构造参数
    Integer num = Integer.parseInt(pageNum);
    if(num >= 1) {
        num = num - 1;
    }
    PageRequest pageRequest = PageRequest.of(num, Integer.parseInt(pageSize));

    //--2
    NativeSearchQueryBuilder nativeSearchQueryBuilder = new NativeSearchQueryBuilder();

    BoolQueryBuilder boolQueryBuilder = new BoolQueryBuilder();
    if(org.apache.commons.lang3.StringUtils.isNotEmpty(tbProduct.getProductName())) {
        boolQueryBuilder.should(QueryBuilders.matchQuery("productName", tbProduct.getProductName()));
    }

    HighlightBuilder highlightBuilder = new HighlightBuilder().field("productName").preTags("<font color='red'>").postTags("</font>");

    nativeSearchQueryBuilder.withQuery(boolQueryBuilder)
            .withPageable(pageRequest)
            .withHighlightBuilder(highlightBuilder);

    //--3
    SearchHits<TbProduct> searchHits = elasticsearchRestTemplate.search(nativeSearchQueryBuilder.build(), TbProduct.class);

    //--4 读取查询结果
    Long total = searchHits.getTotalHits();
    List<TbProduct> list = new ArrayList<TbProduct>();

    List<SearchHit<TbProduct>> searchHitList = searchHits.getSearchHits();
    for (SearchHit<TbProduct> tbProductSearchHit : searchHitList) {
        TbProduct content = tbProductSearchHit.getContent();

        // 高亮处理
        List<String> productNames = tbProductSearchHit.getHighlightField("productName");
        if(productNames != null && productNames.size() > 0) {
            content.setProductName(productNames.get(0));
        }

        list.add( content);
    }

    HashMap<String, Object> map = new HashMap<>();
    map.put("total", total);
    map.put("rows", list);

    return AjaxResult.success("读取成功", map);
}