【Elasticsearch】SpringBoot整合ES实现搜索功能 | 高亮显示

先看代码:
controller:

//根据关键字搜索
@RequestMapping(value = "/searchWC", produces = "application/json; charset=utf-8")
public Resp searchWC(Integer page, Integer limit, String kw){
    return searchService.searchWC(page, limit, kw);
}
//ft http://localhost:11011/search-api/search/searchWC?page=1&limit=5&kw=白色

serviceImpl:

   @Override
    public Resp searchWC(Integer page, Integer limit, String kw) {
        //todo: 搜索ES中的数据,保存到data中。
        //准备需要用到的变量:搜索请求、存放最终响应数据的Map、搜索源构造器、
        //  高亮构造器、搜索结果、存放搜索结果的List。
        SearchRequest request = new SearchRequest("item");
        Map searchResultMap = new HashMap<>();
        SearchSourceBuilder builder = new SearchSourceBuilder();
        HighlightBuilder highlightBuilder = new HighlightBuilder();
        SearchResponse searchResponse = null;
        List list = new ArrayList<>();

        //添加搜索条件:关键字模糊查询、分页、高亮
        if(kw != null && !"".equals(kw)){
            //★★注意这里是matchQuery,不是fuzzyQuery,模糊搜索有空再学★★
            builder.query(QueryBuilders.matchQuery("title", kw).maxExpansions(1));
        }
        builder.from((page - 1) * limit);
        builder.size(limit);
        highlightBuilder.preTags("<em style='color: red'>");
        highlightBuilder.postTags("</em>");
        highlightBuilder.field("title");
        builder.highlighter(highlightBuilder);
        
        //设置查询条件,查询
        request.source(builder);
        try {
            searchResponse = highLevelClient.search(request, RequestOptions.DEFAULT);
            long hitsTotalValue = searchResponse.getHits().getTotalHits().value;//总条数
//            System.out.println("hitsTotalValue: " + hitsTotalValue);//ft
            searchResultMap.put("total", hitsTotalValue);
            //页数(ceil后结果类型是double)
            searchResultMap.put("pages", (long) Math.ceil(hitsTotalValue * 1.0 / limit));
            searchResultMap.put("currPage", page);
            
            //用高亮数据替换原数据
            SearchHits hits = searchResponse.getHits();
            for(SearchHit hit: hits){
                //数据,不包含高亮数据
                Map<String, Object> sourceMap = hit.getSourceAsMap();
                //单独取出高亮数据
                Map<String, HighlightField> highlightFields = hit.getHighlightFields();
                HighlightField highlightTitle = highlightFields.get("title");//注意是数组
                
                if(highlightTitle != null){
                    Text[] fragments = highlightTitle.getFragments();
                    if(fragments != null && fragments.length > 0){
                        //替换(fargment[0]是Text类型的)
                        sourceMap.replace("title", fragments[0].toString());
                    }
                }
                list.add(sourceMap);//循环将数据添加入列表
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        
        searchResultMap.put("data", list);//设置最终结果数据域

        return Resp.ok("搜索成功", searchResultMap);
    }

小结
1、添加ES场景启动器

<!-- 添加ES的场景启动器的依赖 -->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-elasticsearch</artifactId>
</dependency>

2、yaml配置ES

spring:
  application:
    name: buy-search
  elasticsearch:
    rest:
      uris: 
        - 192.168.66.132:9200

3、准备需要用到的变量
在这里插入图片描述
注:还有一个注入的RestHighLevelClient

结构如下:
在这里插入图片描述
具体调用的方法以及设置页码等参看代码。

加断点查看对应searchResponse数据结构:
在这里插入图片描述
HighlightFields的数据结构:
在这里插入图片描述
对照kinaba结果:

在这里插入图片描述
3、根据结构图,完成相关构造器的配置,调用对应方法,完成查询,处理结果,响应。

最终响应结果:
在这里插入图片描述

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

_小鹰

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值