前言

本篇文章我们来学习一下如何使用ElasticSearch实现搜索字段的高亮,许多应用都倾向于在每个搜索结果中 高亮 部分文本片段,以便让用户知道为何该文档符合查询条件。在 Elasticsearch 中检索出高亮片段也很容易。

使用Kibana演示高亮

ElasticSearch允许给搜索的字段进行高亮显示,下面是天猫的搜索效果如下:

我们通过开发工具分析所谓的高亮就是给搜索的关键字加上颜色样式,当然也可以加上其他样式,如下

下面是使用Kibana演示给ES搜索的结果增加高亮效果语法如下

GET /_search
{"query" : {"match": { "content": "kimchy" }},"highlight" : {"fields" : {"field": {"pre_tags": ["<span style='color:red'>"],"post_tags": ["</span>"]}}}
}

下面是演示效果

当执行该查询时,返回结果与之前一样,与此同时结果中还多了一个叫做 highlight 的部分。这个部分包含了 title属性匹配的文本片段,并以 HTML 标签 封装来达到高亮效果。

高亮代码实战

下面案例基于 《ElasticSearch Java实战》的DSL查询案例进行开发,使用ES我们可以轻松做到高亮功能,第一步:增加结果处理器,在集成SpringBoot之后高亮功能失效,需要做高亮结果处理。

@Component
public class HighlightResultMapper implements SearchResultMapper {@Overridepublic <T> AggregatedPage<T> mapResults(SearchResponse response, Class<T> aClass, Pageable pageable) {// 记录总条数long totalHits = response.getHits().getTotalHits();// 记录列表(泛型) - 构建Aggregate使用List<T> list = Lists.newArrayList();// 获取搜索结果(真正的的记录)SearchHits hits = response.getHits();for (SearchHit hit : hits) {if(hits.getHits().length <= 0){return null;}// 将原本的JSON对象转换成Map对象Map<String, Object> map = hit.getSourceAsMap();// 获取高亮的字段MapMap<String, HighlightField> highlightFields = hit.getHighlightFields();for (Map.Entry<String, HighlightField> highlightField : highlightFields.entrySet()) {// 获取高亮的KeyString key = highlightField.getKey();// 获取高亮的ValueHighlightField value = highlightField.getValue();// 实际fragments[0]就是高亮的结果,无需遍历拼接Text[] fragments = value.getFragments();StringBuilder sb = new StringBuilder();for (Text text : fragments) {sb.append(text);}// 因为高亮的字段必然存在于Map中,就是key值// 可能有一种情况,就是高亮的字段是嵌套Map,也就是说在Map里面还有Map的这种情况,这里没有考虑map.put(key, sb.toString());}// 把Map转换成对象T item = JSON.parseObject(JSONObject.toJSONString(map),aClass);list.add(item);}// 返回的是带分页的结果return new AggregatedPageImpl<>(list, pageable, totalHits,response.getAggregations());}public <T> T mapSearchHit(SearchHit searchHit, Class<T> aClass) {return null;}
}

该结果映射器把高亮结果进行了映射,同时还对聚合结果进行了映射。

第二步:给搜索的字段设置高亮,通过builder.withHighlightFields设置高亮


@Autowired
private CourseRepository repository;@Autowired
private ElasticsearchRestTemplate template;@Autowired
private HighlightResultMapper highlightResultMapper;...省略...@Test
public void testSearch(){//查询构建器NativeSearchQueryBuilder builder = new NativeSearchQueryBuilder();//设置分页: 第2页 (0开始), 每页10数builder.withPageable(PageRequest.of(1,10));//设置排序 : 金额倒排builder.withSort(SortBuilders.fieldSort("amount").order(SortOrder.DESC));//构建组合查询BoolQueryBuilder boolQuery = QueryBuilders.boolQuery();//标题包含鼠标boolQuery.must(QueryBuilders.matchQuery("title","鼠标"))//状态值查询.filter(QueryBuilders.termQuery("status",1))//金额范围查询.filter(QueryBuilders.rangeQuery("amount").gte(10).lte(2000));//添加查询条件builder.withQuery(boolQuery);//===============================================================================//给title字段设置高亮,使用color:red来高亮HighlightBuilder.Field  highlightField = new HighlightBuilder.Field("title").preTags("<span style='color:red'>").postTags("</span>");builder.withHighlightFields(highlightField);//================================================================================//Page<OrderDoc> page = orderRepository.search(builder.build());Page<OrderDoc> page = template.queryForPage(builder.build(), OrderDoc.class, highlightResultMapper);//获取条数System.out.println("总元素个数:"+page.getTotalElements());//打印列表page.getContent().forEach(System.out::print);}

打印结果如下:

总元素个数:3
OrderDoc(id=2, title=买了一个<span style='color:red'>鼠标</span>, count=1, status=1, amount=200)
OrderDoc(id=1, title=买了一个<span style='color:red'>鼠标</span>, count=1, status=1, amount=200)
OrderDoc(id=3, title=买了一个<span style='color:red'>鼠标</span>, count=1, status=1, amount=200)

我们看到 <span style='color:red'>鼠标</span> 说明高亮成功


六.全文检索ElasticSearch经典入门-高亮相关推荐

  1. 七.全文检索ElasticSearch经典入门-聚合查询

    前言 今天我们讲ES的高亮和聚合查询,聚合功能是ES很重要的功能,它基于查询条件来对数据进行分桶和计算.它提供了类似于关系型数据库的SUM,COUNT, AVG , Group By 等功能.聚合也可 ...

  2. C4D致富经典入门到精通(一)

    基本快捷工具使用杂谈: C4D基础界面的介绍与常用快捷键:  C4D致富经典入门到精通(一) C4D父子关系的理解与创建参数几何体与可编辑对象: C4D致富经典入门到精通(二) C4D样条曲线创建 : ...

  3. MongoDB开发学习开天辟地,经典入门

    如果你从来没有接触MongoDB或对MongoDB有一点了解,如果你是C#开发人员,那么你不妨花几分钟看看本文.本文将一步一步带您轻松入门. 阅读目录 一:简介 二:特点 三:下载安装和开启服务器 四 ...

  4. Elasticsearch 教程--入门

    1.1 初识 Elasticsearch 是一个建立在全文搜索引擎 Apache Lucene(TM) 基础上的搜索引擎,可以说 Lucene 是当今最先进,最高效的全功能开源搜索引擎框架. 但是 L ...

  5. ElasticSearch第一讲:ElasticSearch从入门到精通

    ElasticSearch第一讲:ElasticSearch从入门到精通 业内目前来说事实上的一个标准,就是分布式搜索引擎一般大家都用elasticsearch.本文是ElasticSearch第一讲 ...

  6. C4D致富经典入门到精通(十)

    C4D中渲染操作与AE交互 C4D基础界面的介绍与常用快捷键:  C4D致富经典入门到精通(一) C4D父子关系的理解与创建参数几何体与可编辑对象: C4D致富经典入门到精通(二) C4D样条曲线创建 ...

  7. C4D致富经典入门到精通(三)

    C4D样条曲线创建 C4D基础界面的介绍与常用快捷键:  C4D致富经典入门到精通(一) C4D父子关系的理解与创建参数几何体与可编辑对象: C4D致富经典入门到精通(二) C4D样条曲线创建 :  ...

  8. C4D致富经典入门到精通(八)

    材质与纹理 C4D基础界面的介绍与常用快捷键:  C4D致富经典入门到精通(一) C4D父子关系的理解与创建参数几何体与可编辑对象: C4D致富经典入门到精通(二) C4D样条曲线创建 :   C4D ...

  9. C4D致富经典入门到精通(七)

    灯光的使用与种类 C4D基础界面的介绍与常用快捷键:  C4D致富经典入门到精通(一) C4D父子关系的理解与创建参数几何体与可编辑对象: C4D致富经典入门到精通(二) C4D样条曲线创建 :    ...

  10. C4D致富经典入门到精通(四)

    C4D中的Nurbs建模 C4D基础界面的介绍与常用快捷键:  C4D致富经典入门到精通(一) C4D父子关系的理解与创建参数几何体与可编辑对象: C4D致富经典入门到精通(二) C4D样条曲线创建  ...

最新文章

  1. (一).NET SubSonic2.0 的配置
  2. C++ XML解析之TinyXML篇
  3. Object.create()和Object.assign()
  4. vue vuex 挂载_vue.js,javascript_Vuex的初始化失败,一直显示没有挂载到根组件上,奇怪了!,vue.js,javascript - phpStudy...
  5. 硬件工程师如何成为焊接界的高手
  6. 【遥感数字图像处理】实验:遥感图像分析方法大全(Erdas版)
  7. python调用jenkinsAPI构建jenkins,并传递参数
  8. Eclisp配置Maven(基础简易版)
  9. 2.5D休闲娱乐生活类插画素材,给设计添彩!
  10. photorec_如何在Linux / Ubuntu中使用PhotoRec恢复已删除的文件
  11. Python画数码晶体管日期(年月日时分秒)
  12. Java实现万年历【升级版】
  13. Log4j漏洞及解决方案,亲测
  14. 儿童“益”站线上课堂 战“疫”不停学
  15. 学习笔记——MongDB非关系型数据库的脚本代码汇总
  16. 时空数据生成对抗网络研究综述(上)
  17. 测试用例的设计-面试常见问题(基础篇)
  18. pc端js获取当前经纬度_js获取用户当前地理位置(省、市、经纬度)
  19. Redis入门(2):五大数据类型(key,string,list,set,sortset)将其实战,配置文件详解,发布与订阅
  20. android 远程调试工具,【教程】搭配Android studio,如何实现app远程真机debug...

热门文章

  1. 怎么检测硬盘是否有坏道
  2. 如何把模糊照片变清晰把相片变高清修图#ps教程#ps学习视频
  3. 2021年西电计算机学院软专复试问题总结
  4. 基于树莓派的智能图像识别垃圾分类系统
  5. 斐波那契(黄金分割法)查找算法
  6. 【GNSS】GNSS数据下载工具
  7. 数电课程设计数字钟c语言编程,数电数字钟设计,含源码
  8. python截图黑屏_【Python】视频黑屏检测
  9. 「猪齿鱼」助力汉得信息智能制造集中交付高效协同
  10. !!股票大作手操盘术【图解】