使用效果: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
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)