Elastic Search 实现返回结果高亮

2021-11-20 From 程序之心 By 丁仪

众所周知,Google、百度等搜索引擎在返回查询结果时都会有高亮处理,让用户能够方便地快速识别出内容相关性。

在 elastic search 中也提供了 highlight 高亮功能,可以返回与检索词相关的句子,以确认查询结果相关性。

JSON 接口实现高亮

查询条件增加一个新的 highlight 参数:

GET /megacorp/employee/_search
{
    "query" : {
        "match_phrase" : {
            "about" : "rock climbing"
        }
    },
    "highlight": {
        "fields" : {
            "about" : {}
        }
    }
}

当执行该查询时,返回结果与之前一样,与此同时结果中还多了一个叫做 highlight 的部分。这个部分包含了 about 属性匹配的文本片段,并以 HTML 标签 <em></em> 封装:

{
   ...
   "hits": {
      "total":      1,
      "max_score":  0.23013961,
      "hits": [
         {
            ...
            "_score":         0.23013961,
            "_source": {
               "first_name":  "John",
               "last_name":   "Smith",
               "age":         25,
               "about":       "I love to go rock climbing",
               "interests": [ "sports", "music" ]
            },
            "highlight": {
               "about": [
                  "I love to go <em>rock</em> <em>climbing</em>" 
               ]
            }
         }
      ]
   }
}

Java 客户端实现高亮

在 SearchSourceBuilder 中设置一个 HighlightBuilder,可以用于设置高亮的字段。

SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
HighlightBuilder highlightBuilder = new HighlightBuilder(); 
HighlightBuilder.Field highlightTitle = new HighlightBuilder.Field("title"); 
highlightTitle.highlighterType("unified");  
highlightBuilder.field(highlightTitle);  
HighlightBuilder.Field highlightUser = new HighlightBuilder.Field("user");
highlightBuilder.field(highlightUser);
searchSourceBuilder.highlighter(highlightBuilder);

在搜索返回结果中获取高亮字段的内容。

SearchHits hits = searchResponse.getHits();
for (SearchHit hit : hits.getHits()) {
    Map<String, HighlightField> highlightFields = hit.getHighlightFields();
    HighlightField highlight = highlightFields.get("title"); 
    Text[] fragments = highlight.fragments();  
    String fragmentString = fragments[0].string();
}
高亮字段默认使用 HTML 标签 <em></em> 封装。如需自定义可以配置 preTags 和 postTags。
highlightBuilder.preTags("<span class=\"bg-danger text-white\">");
highlightBuilder.postTags("</span>");

本文来源:程序之心,转载请注明出处!

君子曰:学不可以已。
《计算机组成原理》

从计算机组成和结构的有关概念、计算机的发展历程及存储程序计算机开始讲起,介绍了计算机系统的组成和体系结构的基本概念,讨论了数据在计算机中的表示方法和运算方法。讲解ISA的基本概念,并以ARM指令集为例介绍了ISA设计时需要考虑的主要问题。介绍了设计控制器的两种经典方法—微程序与组合逻辑,详细讨论了流水线技术、影响流水线性能的因素及一些可行的解决方法。

发表感想

© 2016 - 2024 chengxuzhixin.com All Rights Reserved.

浙ICP备2021034854号-1    浙公网安备 33011002016107号