Java结合ElasticSearch根据查询关键字,高亮显示全文数据。

devtools/2024/11/18 19:11:20/

由于es高亮显示机制的问题。当全文内容过多,且搜索中标又少时,就会出现高亮结果无法覆盖全文。因此需要根据需求手动替换。
1.根据es的ik分词器获取搜索词的分词结果。
es部分:

//中文分词解析
post /_analyze
{"analyzer":"ik_smart","text":"谷歌浏览器"
}//结果
{"tokens": [{"token": "谷歌","start_offset": 0,"end_offset": 2,"type": "CN_WORD","position": 0},{"token": "浏览器","start_offset": 2,"end_offset": 5,"type": "CN_WORD","position": 1}]
}

注意:ik_smart 是最粗颗粒度,不会有重复分词。ik_max_word 是最细颗粒度,会有重复分词。高亮显示只需要最粗即可。
ik_smart:
在这里插入图片描述
ik_max_word:
在这里插入图片描述

将es的语句转为Java语句:

java">//主要使用的包
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.elasticsearch.client.Request;
import org.elasticsearch.client.Response;
import org.elasticsearch.client.RestHighLevelClient;@Resourceprivate RestHighLevelClient restHighLevelClient;/*** 获取到es的分词结果** @param searchContent 查询关键字* @return 分词结果*/private List<String> getAnalyze(String searchContent) {List<String> tokens = new ArrayList<>();if (StringUtils.isNotEmpty(searchContent)) {String endpoint = "/_analyze";String body = "{\n" +"  \"analyzer\": \"ik_smart\",\n" +"  \"text\": \"" + searchContent + "\"\n" +"}";try {Request request = new Request("POST", endpoint);request.setJsonEntity(body);Response response = restHighLevelClient.getLowLevelClient().performRequest(request);InputStream content = response.getEntity().getContent();JsonNode jsonNode = objectMapper.readTree(content);if (jsonNode.has("tokens")) {for (JsonNode token : jsonNode.get("tokens")) {tokens.add(token.get("token").asText());}}} catch (IOException | UnsupportedOperationException e) {log.error("ES查询分词异常", e);}}return tokens;}

2.根据获取到的多个分词数据。替换全文内容。

java">    /*** 根据多个需要替换的字符,高效替换全文数据* @param replaceStrList 替换字符* @param content 全文* @return 高亮显示的全文*/private String replaceHighlight(List<String> replaceStrList, String content) {StringBuffer result = new StringBuffer();try {Map<String, String> replacements = new HashMap<>();for (String replaceStr : replaceStrList) {replacements.put(replaceStr, "<font class='eslight'>" + replaceStr + "</font>");}Pattern pattern = Pattern.compile(String.join("|", replacements.keySet()));Matcher matcher = pattern.matcher(content);while (matcher.find()) {matcher.appendReplacement(result, replacements.get(matcher.group(0)));}matcher.appendTail(result);} catch (Exception e) {log.error("替换高亮显示异常", e);}return result.toString();}

此时就能将全文关键词以分词的效果高亮显示了。


http://www.ppmy.cn/devtools/135020.html

相关文章

支持用户注册和登录、发布动态、点赞、评论、私信等功能的社交媒体平台创建!!!

需要整体源代码的可以在我的代码仓下载https://gitcode.com/speaking_me/social-media-platformTest.git 社交媒体平台 描述&#xff1a;社交媒体平台需要支持用户注册、发布动态、点赞、评论、私信等功能。 技术栈&#xff1a; 前端&#xff1a;React, Angular, Vue.js后端…

飞创直线电机模组 VS 传统丝杆模组:谁是自动化传动领域的王者?

在现代自动化技术领域&#xff0c;直线电机模组与传统丝杆模组作为两种常见的传动方式&#xff0c;各自有独特的特点和优势。然而&#xff0c;随着科学的不断进步和应用需求的日益提高&#xff0c;两者在精度、速度、寿命及可拓展性方面的差异愈发显著。本文将重点对比飞创直线…

[模板总结] - 单向链表LinkedList操作

题目汇总 Leetcode 21, 82, 160, 206, 237, 268 Leetcode 21. 合并两个有序链表 归并排序的思路&#xff0c;创建一个哨兵节点从两个链表中按大小插入即可。 /*** Definition for singly-linked list.* struct ListNode {* int val;* ListNode *next;* ListNode(…

【机器学习】机器学习中用到的高等数学知识-4.数值分析 (Numerical Analysis)

优化方法&#xff1a;用于寻找函数的极值&#xff08;如牛顿法、随机梯度下降&#xff09;。插值和拟合&#xff1a;用于处理数据点之间的关系&#xff0c;生成模型。 数值分析&#xff08;Numerical Analysis&#xff09;是数学的一个分支&#xff0c;专注于开发用于数值近似…

一文简单了解Android中的input流程

在 Android 中&#xff0c;输入事件&#xff08;例如触摸、按键&#xff09;从硬件传递到应用程序并最终由应用层消费。整个过程涉及多个系统层次&#xff0c;包括硬件层、Linux 内核、Native 层、Framework 层和应用层。我们将深入解析这一流程&#xff0c;并结合代码逐步了解…

开源科学工程技术软件介绍 – EDA工具KLayout

link 今天向各位知友介绍的 KLayout是一款由德国团队开发的开源EDA工具。 KLayout是使用C开发的&#xff0c;用户界面基于Qt。它支持Windows、MacOS和Linux操作系统。安装程序可以从下面的网址下载&#xff1a; https://www.klayout.de/build.html KLayout图形用户界面&…

css实现斜条纹背景

最近有个模块需求采用斜条纹背景 做标头背景 记录下实现代码 <template><div class"striped-background"><span>货种</span><span>企业数</span><span>企业数</span><span>客户数</span></div> …

Chrome 浏览器开启打印模式

打开开发者工具ctrl shift p输入print 找到 Emulate CSS print media type