问题
一般使用搜索引擎的时候我们会发现,搜索出来的内容都对我们搜索的关键词进行了高亮显示, 这样我们能很直观的看出是不是我们想要的结果, 最近我也遇到了类似的功能, 因为关于舆情的系统使用到了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);
}
}
这样一来该字符串返给前端之后就是一个红色的字体了