Elasticsearch高亮查询 工具类 及使用方法 【详解】

Elasticsearch高亮查询 工具类 及使用方法 【详解】,第1张

Elasticsearch高亮查询 工具类 及使用方法 【详解】 about

        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 

 

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5656540.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-16
下一篇 2022-12-16

发表评论

登录后才能评论

评论列表(0条)

保存