使用效果:2000年左右,Shay Banon和他的新婚妻子来到伦敦,他的妻子开了一家餐馆。而他在伦敦寻找工作的期间,接触到了Lucene的早期版本,他想为自己的妻子开发一个方便搜索菜谱的应用。
直接使用Lucene构建搜索,代码量非常大且复杂。后来,Shay找到了一份新工作。工作中他逐渐发现,越来越需要一个易用的高性能、实时、分布式搜索服务,于是便在Lucene的基础上造成了一个独立的服务,并将其更名为Elasticsearch。
Elasticsearch发布的第一个版本是在2010年的二月份,自那之后,Elasticsearch便成为了Github上最受瞩目的项目之一。
匹配查询条件的信息高亮显示且分片(不会显示所有,避免冗余)再参考百度~
话不多说,工具类代码:// 高亮工具类 实现SearchResultMapper接口 重写如下方法 根据分页查询结果替换匹配结果集
public class HighLightResultMapper implements SearchResultMapper {
@Override
public AggregatedPage mapResults(SearchResponse response, Class clazz, Pageable pageable) {
ArrayList list = new ArrayList<>(); // 新建list集合
SearchHits searchHits = response.getHits(); // 获取击中的结果对象
long totalHits = searchHits.totalHits; // 获取击中的信息长度
SearchHit[] hits = searchHits.getHits(); // 获取击中的信息长度数组
for (SearchHit hit : hits) { // 遍历该数组
Map highlightFields = hit.getHighlightFields(); // 获取高亮字段属性
String sourceAsString = hit.getSourceAsString(); // 获取信息字符串
T t = JSON.parseObject(sourceAsString, clazz); // 将匹配到的信息字符串通过JSON转换为对象
Field[] fields = clazz.getDeclaredFields(); // 通过反射获取对应对象的所有属性
for (Field field : fields) { // 遍历所有字段属性
field.setAccessible(true); // 打破封装
String name = field.getName(); // 获取属性名称
if (highlightFields.containsKey(name)) { // 判断查找高亮属性
// 根据map集合的key获取值(即匹配的高亮信息)
HighlightField highlightField = highlightFields.get(name);
// 默认选取分片后第一片的信息并转换为字符串
String s = highlightField.fragments()[0].toString();
try {
field.set(t, s); // 为查询结果 赋新值
} catch (IllegalAccessException e) {
e.printStackTrace();
}
}
}
list.add(t); // 添加到list集合中
}
// 为聚合后的分页对象赋值,传入的三个参数分别为 赋值后的list集合,分页信息,击中总条数
AggregatedPageImpl ts = new AggregatedPageImpl<>(list, pageable, totalHits);
return ts; // 返回该对象
}
}
使用方式:
如此这般,便可以成功实现高亮查询啦~
祝 玩得开心
如有错误,欢迎指正
Thanks



