/**
* es高亮前缀
*/
public static final String PRE_TAGS_FIELD = "<span style='color:red'>";
/**
* es高亮后缀
*/
public static final String POST_TAGS_FIELD = "</span>";
/**
* 替换高亮字段值
*
* @param cls 被高亮替换的esbean类对象,用于获取子类和父类中的字段对象
* @param searchHits 检索结果
* @param <T>
* @return
*/
public static <T> List<T> repeatHighlightFields(Class cls, List<SearchHit<T>> searchHits) {
//遍历所有记录
List<T> resultList = searchHits.stream().map(x -> {
SearchHit<T> searchHit = x;
T content = searchHit.getContent();
Map<String, List<String>> highlightFields = searchHit.getHighlightFields();
//替换高亮字段值
if (highlightFields.size() > 0) {
highlightFields.forEach((k, v) -> {
try {
//高亮值
List<String> list = v;
/**
* 高亮字段可能是在esbean或bean中,因此需要传入对应的bean对应的类
*/
//获取父类字段
Field[] superClassFields = cls.getSuperclass().getDeclaredFields();
//获取当前类字段
Field[] declaredFields = cls.getDeclaredFields();
Field[] fields = ArrayUtils.addAll(superClassFields, declaredFields);
Field field = Arrays.stream(fields).filter(y -> y.getName().equals(k)).findFirst().orElse(null);
if (field != null) {
field.setAccessible(true);
//如果是字符串类型则直接替换为高亮值
if (field.getType() == String.class) {
if (list != null && list.size() > 0) {
field.set(content, list.get(0));
}
} else if (field.getType() == String[].class) {
if (list != null && list.size() > 0) {
//获取原始值
String[] originVal = (String[]) field.get(content);
List<String> originValList = Arrays.stream(originVal).collect(Collectors.toList());
for (String highlightVal : list) {
//replaceAll方法可以直接将列表中的值替换为高亮值
originValList.replaceAll(s -> {
String replaceVal = highlightVal.replaceAll(ElasticSearchConstants.PRE_TAGS_FIELD, "")
.replaceAll(ElasticSearchConstants.POST_TAGS_FIELD, "");
if (Objects.equals(s, replaceVal)) {
return highlightVal;
}
return s;
});
}
field.set(content, originValList.stream().toArray(String[]::new));
}
}
}
} catch (Exception e) {
throw new BusinessException("高亮字段替换异常:" + e.getMessage());
}
});
}
return content;
}).collect(Collectors.toList());
return resultList;
}
SpringDataElasticSearch中高亮字段的替换(包括数组字段)
最新推荐文章于 2024-08-06 22:30:00 发布