当前位置: 首页 > article >正文

基于Es的分词查询通过高亮效果实现前端高亮显示!!!!

引言:

经常我们在浏览器界面搜索关键词的时候,浏览器返回给我们的页面都是高亮显示关键词的效果,

如下:

我们要简单实现这个效果很简单,可以通过多种办法,这里通过Es 的高亮效果实现给我们关键字字段加自定义标签返回给前端,前端通过CSS样式和我们后端达成一致,给指定标签定义一个颜色样式就可以实现了。废话不多少 ->>>>>开始介绍

一.

我们通过Es提供的API在java中操作,具体步骤可以看我的另一篇博客7.7节超详细的~~~~~

Elasticsearch精英进阶:从零到精通的安装,从Kibana到Java API,全面掌握CRUD与DSL查询及聚合技术全攻略icon-default.png?t=O83Ahttps://blog.csdn.net/2301_77058976/article/details/140575189?spm=1001.2014.3001.5501

 后端代码

public CollectVO selectByEs(String name) {


        SearchRequest searchRequest=new SearchRequest("poem");
        BoolQueryBuilder boolQuery = QueryBuilders.boolQuery();
        boolQuery.should(QueryBuilders.matchQuery("header", name));
        boolQuery.should(QueryBuilders.matchQuery("writer", name));
        searchRequest.source().query(boolQuery);

        HighlightBuilder highlightBuilder = new HighlightBuilder();
        HighlightBuilder.Field headerField = new HighlightBuilder.Field("header")
                .preTags("<em>")
                .postTags("</em>");
        HighlightBuilder.Field writerField = new HighlightBuilder.Field("writer")
                .preTags("<em>")
                .postTags("</em>");

        highlightBuilder.field(headerField);
        highlightBuilder.field(writerField);

        searchRequest.source().highlighter(highlightBuilder);

        SearchResponse search = null;
        try {
            search = restHighLevelClient.search(searchRequest, RequestOptions.DEFAULT);
        } catch (IOException e) {
            throw new RuntimeException(e);
        }

        //获取查询的数据数量
        SearchHit[] hits = search.getHits().getHits();
        List<String> header =new ArrayList<>();
        List<String> writer =new ArrayList<>();
        for (SearchHit hit : hits) {
            String json = hit.getSourceAsString();
            PoemHeaderAndWriterDTO bean = JSONUtil.toBean(json, PoemHeaderAndWriterDTO.class);//list.add(item);  添加到集合中在返回给
            System.out.println(bean);
            Map<String, HighlightField> highlightFields = hit.getHighlightFields();
            if (highlightFields.containsKey("writer")) {
                String writerHighlight = highlightFields.get("writer").fragments()[0].string();
                writer.add(writerHighlight);
                header.add(bean.getHeader());

            }
            if (highlightFields.containsKey("header")) {
                String headerHighlight = highlightFields.get("header").fragments()[0].string();
                header.add(headerHighlight);
                writer.add(bean.getWriter());

            }

        }
        CollectVO build = CollectVO.builder()
                .zhus(writer)
                .data(header)
                .build();
       return build;
    }

 效果:

比如我们搜索诗人李白

可以看我们给 关键字加了标签了,这样子返回给前端,他们就可以很好操作了,通过V-html 加css 一条语句就可以了

前端:

当然这是在VsCode可以支持,这里我就简单演示一下,后续也就没什么难度了,因为我这里是用的Hx写的一个APP,可惜的是这里V-html因为安全缘故不支持这样子操作,害得俺弄了半天!

然后这里我选择直接使用第二种,替换关键词嘛!当然方法很多,可以自行选择哦!!!

二.

我只需要通过Es分词通过关键词查询我关联的数据返回给前端,前端帮我实现把原有的数据如果其中包含关键词,就替换标签加上样式也就解决了看效果->>>

后端:

  /**
     * 针对 HbuilderX 查询
     * @param name
     * @return
     */
    public CollectVO selectByEs(String name) {
        SearchRequest searchRequest=new SearchRequest("poem");
        BoolQueryBuilder boolQuery = QueryBuilders.boolQuery();
        boolQuery.should(QueryBuilders.matchQuery("header", name));
        boolQuery.should(QueryBuilders.matchQuery("writer", name));
        searchRequest.source().query(boolQuery);
        SearchResponse search = null;
        try {
            search = restHighLevelClient.search(searchRequest, RequestOptions.DEFAULT);
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
        List<String> header =new ArrayList<>();
        List<String> writer =new ArrayList<>();
        SearchHit[] hits = search.getHits().getHits();
        for (SearchHit hit : hits) {
            String sourceAsString = hit.getSourceAsString();
            PoemHeaderAndWriterDTO bean = JSONUtil.toBean(sourceAsString, PoemHeaderAndWriterDTO.class);
            header.add(bean.getHeader());
            writer.add(bean.getWriter());
        }
        CollectVO build = CollectVO.builder()
                  .ancientPoetry(header)
                .writer(writer)

                .build();
        return build;

    }

前端:

  # 部分代码
  <view    style="font-size: 19px; color: rgb(0, 0, 0)"
           @click="shye(item ) "        
		   v-html="highLight(item)"   >
           {{ item }}
         </view>

# 处理方法
		     highLight(title){
		         // 如果标题中包含,关键字就替换一下
		         if(title.includes(this.query)){
		           title = title.replace(
		               this.query, 
		               // 这里是替换成html格式的数据,最好再加一个样式权重,保险一点
		               '<font style="color:red!important; ">'+ this.query +'</font>'
		           )
		           return title
		         }
		         // 不包含的话还用这个
		         else{
		           return title
		         }
		       },

效果:

我们也就实现了高亮展示了!!!!这里数据不是太多,感兴趣的朋友们可以自己试试呢!!我也就是没事玩玩!!!

 视频效果:

基于Es分词搜索和高亮显示

坤坤 坤坤坤坤坤坤 坤坤坤坤坤坤 坤坤坤坤坤坤 坤坤坤坤坤坤 坤坤坤坤坤坤 坤坤坤坤坤坤 坤坤坤

祝大家工作顺利,天天开心,事事顺利,尽管我们现在的不顺,往往是以后成长与成功的宝贵铺垫 !!!!!!


http://www.kler.cn/news/334399.html

相关文章:

  • 机器学习/数据分析--用通俗语言讲解时间序列自回归(AR)模型,并用其预测天气,拟合度98%+
  • GPTQ vs AWQ vs GGUF(GGML) 速览和 GGUF 文件命名规范
  • iTextPDF中,要实现表格中的内容在数据长度超过边框时自动换行
  • 【德国EnMAP高光谱卫星】
  • 日记学习小迪安全27
  • 【顺序表使用练习】发牌游戏
  • MySQL--聚合查询、联合查询、子查询、合并查询(上万字超详解!!!)
  • 《深度学习》OpenCV 摄像头OCR 过程及案例解析
  • 心觉:成事的基石,需要在“放弃”和“永不放弃”之间找到平衡
  • 冒泡排序,插入排序,快速排序,选择排序
  • 海外合规|新加坡推出智慧国2.0计划 设新网络安全与保障机构
  • 浅析Golang的Context
  • 《软件工程概论》作业一:新冠疫情下软件产品设计
  • JAVA运用中springBoot获取前端ajax提交参数方式汇总
  • Python | 使用Seaborn绘制KDE核密度估计曲线
  • Flutter笔记--通知
  • 【Unity】双摄像机叠加渲染
  • 使用 Vertex AI Gemini 模型和 Elasticsearch Playground 快速创建 RAG 应用程序
  • 12.1 Linux_进程间通信_管道
  • 开发指南066-平台紧凑版