Elasticsearch(五)elasticsearch高亮搜索

许多应用都倾向于在每个搜索结果中 高亮 部分文本片段,以便让用户知道为何该文档符合查询条件。在 Elasticsearch 中检索出高亮片段也很容易。
再次执行前面的查询,并增加一个新的 highlight 参数:

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

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

{
   ...
   "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>"  
               ]
            }
         }
      ]
   }
}

Client程序演示

增加一个方法:

/**
     * 高亮搜索
     * SearchRequestBuilder中的addHighlightedField()方法可以定制在哪个域值的检索结果的关键字上增加高亮
     * @param client
     */
    private static void findEmployeesWithHighlight(Client client,String field,String phrase,String highlightField) {
        HighlightBuilder highlightBuilder = new HighlightBuilder().field(highlightField);  
        highlightBuilder.preTags("<em>");  
        highlightBuilder.postTags("</em>");


        SearchRequestBuilder request = client.prepareSearch("megacorp")
                .setTypes("employee")
                .setSearchType(SearchType.DFS_QUERY_THEN_FETCH) 
                .setQuery(QueryBuilders.boolQuery().must(matchPhraseQuery(field, phrase)))
                .highlighter(highlightBuilder);
        SearchResponse response = request.get();

        //处理结果
        SearchHits hits = response.getHits();
        Iterator<SearchHit> iterator = hits.iterator();
        while(iterator.hasNext()) {
            SearchHit hit = iterator.next();
            Map<String, HighlightField> highlightFields = hit.getHighlightFields();  
            Map<String, Object> source = hit.getSource();

            //获取高亮结果
            Set<String> set = highlightFields.keySet();
            for (String str : set) {
//              System.out.println("key="+str+" value="+highlightFields.get(str));

                HighlightField highLight = highlightFields.get(str);
                String name = highLight.getName();

                Text[] texts = highLight.getFragments();
                for (int i = 0; i < texts.length; i++) {
                    Text text = texts[i];
                    System.out.println(name+"="+text);
                }

            }

        }


    }

主方法中增加调用:

// 7.highlight高亮搜索
            findEmployeesWithHighlight(client, "about", "rock climbing", "about");

结果运行显示:

about=I love to go <em>rock</em> <em>climbing</em>
about=I love to go <em>rock</em> <em>climbing</em>
about=I love to go <em>rock</em> <em>climbing</em>
about=I love to go <em>rock</em> <em>climbing</em>
about=I love to go <em>rock</em> <em>climbing</em>
about=I love to go <em>rock</em> <em>climbing</em>
about=I love to go <em>rock</em> <em>climbing</em>

head插件示例

这里写图片描述

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值