ElasticSearch实战之项目搜索高亮

server/2024/11/15 6:08:48/

在这里插入图片描述

文章目录

  • 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.ppmy.cn/server/10322.html

相关文章

计算机网络-IS-IS链路状态数据库同步

在建立IS-IS邻接关系之后&#xff0c;路由器开始发送LSP报文进行链路状态数据库进行同步。 一、链路状态数据库同步 LSP&#xff08; Link State PDU&#xff0c;链路状态报文&#xff09; 用于交换链路状态信息。LSP分为两种&#xff1a;Level–1 LSP和Level–2 LSP。Level–1…

OpenCV轻松入门(九)——使用第三方库imgaug自定义数据增强器

安装命令&#xff1a;pip install imgaug 代码实现&#xff1a; import cv2 import random import matplotlib.pyplot as pltfrom imgaug import augmenters as iaa # 数据增强——缩放效果 def zoom_img(img):# 获取一个1-1.3倍的线性图像处理器&#xff0c;scale参数是缩放范…

在数字化转型过程中,企业的资产管理需要做出哪些调整?

在数字化转型过程中&#xff0c;企业的资产管理做出调整的常见于以下几个方面&#xff1a; 1、提高工作效率&#xff1a;数字化转型能够让员工在部门与部门之间的沟通更加顺畅&#xff0c;节省时间&#xff0c;提高效率。这要求企业在资产管理中采用数字化工具和流程&#xff…

Okhttp 403 Forbidden

android App 在使用okhttp下载全国中小企业股份转让系统的pdf文件时候,下载完成后使用MuPDF无法解析,提示文件损坏或者不是PDF文件,查看Okhttp的下载请求,发现报403 Forbidden错误: {protocol=http/1.1, code=403, message=Forbidden, url=https://www.neeq.com

Java设计模式-原型模式

概念&#xff1a; 原型模式是一种创建型设计模式&#xff0c;它允许通过复制现有对象来创建新对象&#xff0c;而无需通过标准构造函数来创建。在原型模式中&#xff0c;新对象的创建是通过克隆现有对象而实现的&#xff0c;因此它是基于原型对象的复制而创建新对象的。 在Jav…

RK平台 启动硬件加速

1.xml中添加需要加速的包名 /device/rockchip/rk356x/package_performance.xml <?xml version1.0 encodingutf-8 standaloneyes ?> <performance-package> <app package"com.antutu.ABenchMark" mode"1"/> <app package"com…

自建SQL server 服务无法启动,提示评估期已过

问题背景 在服务器内安装的SQL server无法启动&#xff0c;报错提示如下截图&#xff0c;提示错误代码17051&#xff1a; 结合系统日志查看应用程序日志详情提示评估期已过&#xff0c;报错如下 问题原因 出现此报错原因是SQL server 安装时&#xff0c;使用的评估版本&#xf…

1、初识Linux系统 shell 脚本

shell脚本组成介绍 1、shell脚本命名规则 必须以.sh文件结尾&#xff0c;类似.txt文件&#xff1b;例如创建一个test.sh文件 2、linux系统中shell脚本开头&#xff0c;必须以如下代码开头 test.sh内容如下&#xff1a; #!/bin/bash# 这是一个注释echo "Hello, World!&…