问题
一般使用搜索引擎的时候我们会发现,搜索出来的内容都对我们搜索的关键词进行了高亮显示, 这样我们能很直观的看出是不是我们想要的结果, 最近我也遇到了类似的功能, 因为关于舆情的系统使用到了ES, 一开始心想ES本身就有支持的API实现起来不难, 但我这里的需求还不太一样: 关键词是一开始就给定了并不是通过用户输入的, 而且给定的关键词个数也比较多,也因此使用ES原生的API我觉得不太合适
思路
其实解决这个问题倒也不难, 因为ES加高亮的原理也就是加高亮的html标签, 我们可以理解为查找替换, 因此我们可以通过实现一个工具类来写一个这样功能, 也很简单
代码工具类
/*** 高亮工具类** @author zzt* @version 1.0* @date 2024/06/20*/
public class HighlighterUtil {public static String highlightKeywords(String text, String keywordString) {if (StringUtils.isNotBlank(text) && StringUtils.isNotBlank(keywordString)) {// 将逗号分隔的关键词字符串转换为数组String[] keywords = keywordString.split(",");// 转义所有关键词,以防止正则表达式中的特殊字符String[] escapedKeywords = new String[keywords.length];for (int i = 0; i < keywords.length; i++) {escapedKeywords[i] = Pattern.quote(keywords[i].trim());}// 将所有关键词连接成一个正则表达式String regex = String.join("|", escapedKeywords);// 构建正则模式Pattern pattern = Pattern.compile(regex);Matcher matcher = pattern.matcher(text);// 使用StringBuffer来构建结果字符串StringBuffer result = new StringBuffer();// 替换匹配到的关键词while (matcher.find()) {matcher.appendReplacement(result, "<span style=\"color: red\">" + matcher.group() + "</span>");}matcher.appendTail(result);return result.toString();}return text;}public static void main(String[] args) {String text = "西藏是中国的一个自治区,位于青藏高原。";String keywords = "西藏, 中国, 青藏高原";String highlightedText = highlightKeywords(text, keywords);System.out.println(highlightedText);}}
这样一来该字符串返给前端之后就是一个红色的字体了