ElasticSearch实战之项目搜索高亮

在这里插入图片描述

文章目录

  • 1. 前情配置
  • 2、数据操作
    • 2.1 操作API
    • 2.2 数据入库
  • 3. 高亮搜索
    • 3.1 方法封装
    • 3.2 高亮搜索

1. 前情配置


为满足ElasticSearch可在项目中实现搜索高亮,我们需要先做一些前情配置

  1. 导入ElasticSearch依赖
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-elasticsearch</artifactId>
</dependency>
  1. 修改propertise配置
server.port=9090
spring.thymeleaf.cache=false
# 保证url可以输入中文,防止乱码
server.servlet.encoding.charset=UTF-8
server.servlet.encoding.enabled=true
server.servlet.encoding.force=true
  1. 构建一个搜索类对象,这里假设我们存在一个搜索对象为Content,其中我们要进行查询的字段是title
@AllArgsConstructor
@NoArgsConstructor
@Data
@Component
public class Content {private String title;private String img;private String price;
}

同时,假设我们拥有List<Content>数据集合,至此,我们做好了所有的前情准备


2、数据操作


2.1 操作API


我们拥有List<Content>数据集合,我们要将其插入到es

步骤分为三步:判断索引是否存在 -> 索引不存在则创建索引 -> 索引存在则插入文档

则数据操作的API分为三个,我们一一实现

API(1):判断索引是否存在

public boolean existIndex(String indexName) throws IOException {GetIndexRequest request = new GetIndexRequest(indexName);boolean isExists = client.indices().exists(request, RequestOptions.DEFAULT);return isExists;
}

API(2):创建索引

这里的indexName利用jd_goods传入,即我们创建的索引名称为jd_goods

public boolean createIndex(String indexName) throws IOException {CreateIndexRequest request = new CreateIndexRequest(indexName);CreateIndexResponse response = client.indices().create(request, RequestOptions.DEFAULT);return response.isAcknowledged();
}

API(3):批量插入数据

这里的indexName利用jd_goods传入,即我们将的List<Content>数据插入到jd_goods

public boolean bulkAddDoc(String indexName, List<Content> listContent) throws IOException {//判断是否存在索引if (indexService.existIndex()){BulkRequest bulkRequest = new BulkRequest();bulkRequest.timeout("10s");//存入数据for (Content content : listContent) {bulkRequest.add(new IndexRequest(indexName).source(JSON.toJSONString(content), XContentType.JSON));}//执行请求BulkResponse bulkResponse = client.bulk(bulkRequest, RequestOptions.DEFAULT);//不失败表示插入成功return !bulkResponse.hasFailures();}return false;
}

2.2 数据入库


整合上述方法,我们可以将List<Content>存入es

public boolean parseContent(String indexName,List<Content> list) throws IOException {//1. 某个获取数据的方法List<Content> list = function();//2. 判断索引是否存在,并且插入数据if (!indexService.existIndex(String indexName)){indexService.createIndex(String indexName);}//3. 插入数据return docService.bulkAddDoc(String indexName,list);
}

再次查看es,数据已经被插入

在这里插入图片描述

3. 高亮搜索


3.1 方法封装


封装用于搜索的方法,这里指定利用term搜索

//param搜索字段名称 searchWord搜索关键字,from和size用于分页
public List<Map<String, Object>> searchDoc(String indexName, String param, String searchWord, Integer from, Integer size) throws IOException {//构建搜索类SearchSourceBuilder searchBuilder = new SearchSourceBuilder();//匹配查询TermQueryBuilder termQuery = QueryBuilders.termQuery(param, searchWord);//设置超时searchBuilder.timeout(new TimeValue(60, TimeUnit.SECONDS));//高亮HighlightBuilder highlightBuilder = new HighlightBuilder();//设置高亮的字段highlightBuilder.field(param);//多个高亮显示highlightBuilder.requireFieldMatch(false);highlightBuilder.preTags("<span style='color:red'>");highlightBuilder.postTags("</span>");searchBuilder.highlighter(highlightBuilder);//分页if (from <= 0){from = 0;}if (size != 0){searchBuilder.from(from);searchBuilder.size(size);}//封装搜索searchBuilder.query(termQuery);//创建查询请求,并将搜索类放入SearchRequest request = new SearchRequest(indexName).source(searchBuilder);//客户端查询请求SearchResponse response = client.search(request, RequestOptions.DEFAULT);//解析结果,第一次getHits()返回了全部的数据,包括版本信息等//第二次getHits()返回了数据中的查询对象//getSourceAsMap()表示将查询对象转化为map集合,其中键就是属性,值就是属性对应的值ArrayList<Map<String, Object>> list = new ArrayList<>();for(SearchHit hit:response.getHits().getHits()){//使用新的高亮字段,覆盖旧字段Map<String, Object> sourceAsMap = hit.getSourceAsMap();//获取全部的高亮字段Map<String, HighlightField> highlightFields = hit.getHighlightFields();HighlightField title = highlightFields.get(param);//开始替换,将旧的title值替换为高亮的值if (title != null){Text[] fragments = title.getFragments();StringBuilder newTitle = new StringBuilder();for (Text text:fragments){newTitle.append(text);}sourceAsMap.put(param,newTitle);}//再次添加进去list.add(sourceAsMap);}return list;
}

整合上述方法,假设我们在jd_goods中搜索title字段

public List<Map<String, Object>> searchContent(String indexName, String keyword,Integer from,Integer size) throws IOException {return docService.searchDoc("jd_goods","title",keyword,from,size);
}

3.2 高亮搜索


绑定浏览器地址,尝试查询

@GetMapping("/search/{keyword}/{from}/{size}")
public List<Map<String, Object>> searchContent(@PathVariable("keyword") String keyword,
@PathVariable("from") Integer from,@PathVariable("size") Integer size) throws IOException {return contentService.searchContent(keyword,from,size);
}

假设我们需要搜索jd_goods中搜索title字段包含java的字段,同时从第1条数据开始获取,获取的数据大小为20

访问浏览器,关键字已经被设置高亮,只需要传递到前端即可

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/630654.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

解析数据科学,探索ChatGPT背后的奥秘

在当今这个由数据驱动和AI蓬勃发展的时代&#xff0c;数据科学作为一门融合多种学科的综合性领域&#xff0c;对于推动各行各业实现数字化转型升级起着至关重要的作用。近年来&#xff0c;大语言模型技术发展态势强劲&#xff0c;为数据科学的进步做出了巨大贡献。其中&#xf…

基于ChatGPT打造安全脚本工具流程

前言 以前想要打造一款自己的工具&#xff0c;想法挺好实际上是难以实现&#xff0c;第一不懂代码的构造&#xff0c;只有一些工具脚本构造思路&#xff0c;第二总是像重复造轮子这种繁琐枯燥工作&#xff0c;抄抄改改搞不清楚逻辑&#xff0c;想打造一款符合自己工作的自定义的…

centos修改启动项加载不同内核

一.背景&#xff1a; 虚拟机中有时需要编译好几个内核版本&#xff0c;make install后系统存在几个内核版本。需要再哪个内核上开发调试就启动特定的内核版本。这就需要修改启动时的内核版本&#xff0c;再物理机或虚拟机启动时可以上下键选择。但有时是docket云环境中或远程时…

【Spring】Spring MVC入门

Spring MVC入门 一、什么是Spring Web MVC&#xff1f; 1.1 MVC定义 MVC是Model View Controller的缩写&#xff0c;是一种软件架构的设计模式&#xff0c;将软件系统分为模型、视图、控制器三个部分。 示意图如下: 可以看到&#xff0c;Controller作为一个“粘合剂”处于M…

Hive进阶(2)----HDFS写入数据流程(赋图助君理解)

HDFS写入数据流程 一、写入流程 1、 Client向NameNode发起RPC请求&#xff0c;来确定请求文件block所在的位置&#xff1b; 2、 NameNode会视情况返回文件的部分或者全部block列表&#xff0c;对于每个block&#xff0c;NameNode都会返回含有该block副本的DataNode地址&…

Go 单元测试之mock接口测试

文章目录 一、gomock 工具介绍二、安装三、使用3.1 指定三个参数3.2 使用命令为接口生成 mock 实现3.3 使用make 命令封装处理mock 四、接口单元测试步骤三、小黄书Service层单元测试四、flags五、打桩&#xff08;stub&#xff09;参数 六、总结6.1 测试用例定义6.2 设计测试用…

[蓝桥杯 | 暴搜] 学会暴搜之路

虽然会调侃蓝桥杯是暴力求解的&#xff0c;但是本弱弱不会搜&#xff0c;不知道如何搜&#xff0c;于是写下这篇碎碎念&#xff0c;记录看到过的&#xff0c;惊艳自己的暴搜。 小总结 题目特征&#xff1a;很复杂的排列组合 说是暴力&#xff0c;其实就是枚举罢了&#xff0…

量子时代加密安全与区块链应用的未来

量子时代加密安全与区块链应用的未来 现代密码学仍然是一门相对年轻的学科&#xff0c;但其历史却显示了一种重要的模式。大多数的发展都是基于几年甚至几十年前的研究。而这种缓慢的发展速度也是有原因的&#xff0c;就像药物和疫苗在进入市场之前需要经过多年的严格测试一样&…

【结构型模式】组合模式

一、组合模式概述 组合模式的定义与意图&#xff1a;将对象组合成树形结构来表现“整体/部分”层次结构。组合能让客户以一致的方式处理个别对象以及对象组合。&#xff08;对象结构型&#xff09; 组合模式分析&#xff1a; 1.当容器对象的某一个方法被调用时&#xff0c;将遍…

VulnHub靶机 DC-5 打靶 渗透测试详情过程

VulnHub靶机 DC-5 打靶 详细渗透测试过程 目录 VulnHub靶机 DC-5 打靶 详细渗透测试过程一、将靶机导入到虚拟机当中二、渗透流程主机发现端口扫描目录爆破文件包含getshell反弹shell提权 一、将靶机导入到虚拟机当中 靶机地址&#xff1a; https://download.vulnhub.com/dc/…

【QT+OpenCV】车牌号检测 学习记录 遇到的问题

【QTOpenCV】车牌号检测 学习记录 首先在QT里面配置好OpenCV .pro文件中加入&#xff1a; INCLUDEPATH G:/opencv/build/include LIBS -L"G:/opencv/build/x64/vc14/lib"\-lopencv_core \-lopencv_imgproc \-lopencv_highgui \-lopencv_ml \-lopencv_video \-lo.c…

ElasticSearch虚拟机安装(单机版)

1.下载7.10.2 下载链接&#xff0c;选择LINUX X86_64下载 2.创建用户 useradd es也可以使用系统默认用户&#xff08;非root&#xff09;,root用户会报错 3.解压 tar xvf elasticsearch-7.10.2-linux-x86_64.tar.gz假定目录在/home/es/elasticsearch-7.10.2-linux-x86_64 …