之前一值用单字段高亮,今天研究了一下RestHighLevelClient的高亮API

在这里插入图片描述
构建一个HighLightBuilder对象,这个对象有一个field方法,通过多次调用这个方法传入要高亮的字段就可以根据指定的前后缀进行高亮。

这个field又调用了this.field方法
在这里插入图片描述
再继续调用
在这里插入图片描述发现最后是存放了一个List集合中。

但前后缀就不是了

在这里插入图片描述

前后缀只有一种高亮规则,并不是一个数组。

  • 查看高亮结果和文档值
    在这里插入图片描述
  • 完整代码
 /**
     *  highlight
     */
    @Test
    public void testhighlight02() throws IOException {
        SearchRequest searchRequest = new SearchRequest(indexName);
        SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();

        BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery();

        boolQueryBuilder.must(QueryBuilders.matchQuery("name","游戏"));
        boolQueryBuilder.must(QueryBuilders.matchQuery("address","购物"));

        HighlightBuilder highlightBuilder = new HighlightBuilder();

        highlightBuilder.field("name").field("address")
                .preTags("<span style='color: red'>").postTags("</span>");

        searchSourceBuilder.query(boolQueryBuilder);
        searchSourceBuilder.highlighter(highlightBuilder);
        searchRequest.source(searchSourceBuilder);

        SearchResponse search = client.search(searchRequest, ElasticSearchConfig.COMMON_OPTIONS);


        for (SearchHit documentFields : search.getHits().getHits()) {
            //获取本条文档的高亮字段
            Map<String, HighlightField> highlightFields = documentFields.getHighlightFields();
            HighlightField name = highlightFields.get("name");
            HighlightField address = highlightFields.get("address");

            //获取原始的source数据
            Map<String, Object> sourceAsMap = documentFields.getSourceAsMap();

            String newName = "";
            String newAddress = "";
            Text[] namefragments = name.getFragments();
            Text[] addressFragments = address.getFragments();

            if (namefragments != null){
                for (Text namefragment : namefragments) {
                    newName = newName + namefragment.string();
                }
            }
            if (addressFragments != null){
                for (Text addressFragment : addressFragments) {
                    newAddress = newAddress + addressFragment.string();
                }
            }

            if (!"".equals(newName)){
                //覆盖原始数据的name字段的值
                sourceAsMap.put("name",newName);

            }

            if (!"".equals(newAddress)){
                sourceAsMap.put("address",newAddress);
            }

            System.out.println(JSON.toJSONString(sourceAsMap));

        }

    }
  • 控制台输出
    在这里插入图片描述
  • 复制选中的数据,以html文件打开

在这里插入图片描述
多字段高亮搞定

Logo

CSDN联合极客时间,共同打造面向开发者的精品内容学习社区,助力成长!

更多推荐