解决ES searchHit.getHighlightFields()输出null数据到前端

一、问题调试

1.1 问题:发现后台可以正常搜索数据,但是在for循环输出传递到前端的时候出了问题,highlightFields变为null了

在这里插入图片描述

1.2 debug

分页,遍历搜索的结果for (SearchHit hit : search.getHits())
在这里插入图片描述

接着获取hit.getHighlightFields(),经过调试排查发现获取为null

此时的hit是一个SearchHit对象

在这里插入图片描述

在这里插入图片描述

我们进入SearchHit类中查看hit.getHighlightFields()方法的源码,发现由于this.highlightFields = null,此方法会返回null

return this.highlightFields == null ? Collections.emptyMap() : this.highlightFields;

在这里插入图片描述

因此这里的Map<>自然也就什么都接不到了,highlightFields也为null了。

在这里插入图片描述

1.3 去SearchResponse类查找为什么hit的highlightFields属性会为null

SearchHit类的hit对象是由search.getHits()得到的,而search是一个SearchResponse类

在这里插入图片描述

在这里插入图片描述

我们进入getHits方法

public SearchHits getHits() {
    return this.internalResponse.hits();
}

发现其getHits()是另一个类中的hit()

在这里插入图片描述

二、解决

加高亮操作参考:ElasticSearch7.9.3集成Springboot 高亮查询

SpringBoot+Elasticsearch-7.X实现高亮分词搜索

ElasticSearch7.x版本踩坑记录:SpringBoot2.3.x整合ElasticSearch7.x(ElasticsearchRestTemplate)

最后不加高亮操作,直接转为json,然后转为对象,前端也正常了

public List<Map<String, Object>> serchPageBuilder(String keyword, int pageNo, int pageSize) throws IOException {
    if(pageNo <=1) {
        pageNo = 1;
    }
    //条件搜索
    //1、构建搜索请求
    SearchRequest jd_goods = new SearchRequest("jd_goods");
    //2、设置搜索条件,使用该构建器进行查询
    SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
    // 构建精确匹配查询条件
//        TermQueryBuilder termQuery = QueryBuilders.termQuery("title", keyword);
//        TermQueryBuilder termQuery = QueryBuilders.termQuery("title.keyword", keyword);
//        searchSourceBuilder.query(termQuery);




    // 自试 索引查询
//        QueryBuilder queryBuilder = QueryBuilders.matchAllQuery();
    QueryBuilder queryBuilder = QueryBuilders.matchQuery("title", keyword);   // 成功【单子多字都成功】
    searchSourceBuilder.query(queryBuilder);
//        QueryBuilder queryBuilder = QueryBuilders.matchQuery("title", "轻松");   // 成功【单子多字都成功】
//        searchSourceBuilder.query(queryBuilder);



    searchSourceBuilder.timeout(new TimeValue(60, TimeUnit.SECONDS));
    searchSourceBuilder.from(pageNo);
    searchSourceBuilder.size(pageSize);


//        HighlightBuilder.Field field = new HighlightBuilder.Field("title");
//        field.preTags("<font color='red'>");
//        field.postTags("</font>");
//        field.fragmentSize(100);






    HighlightBuilder highlightBuilder = new HighlightBuilder();
    highlightBuilder.requireFieldMatch(true);
    highlightBuilder.field("title");
    highlightBuilder.preTags("<span style='color:red'>");
    highlightBuilder.postTags("</span>");
    // highlightBuilder.requireFieldMatch(false);//匹配第一个即可
    // highlightBuilder.numOfFragments(0);

    searchSourceBuilder.highlighter(highlightBuilder);
    //3、将搜索条件放入搜索请求中
    jd_goods.source(searchSourceBuilder);
    //4、客户端执行搜索请求
    SearchResponse search = restHighLevelClient.search(jd_goods, RequestOptions.DEFAULT);
    System.out.println("共查询到"+search.getHits().getHits().length+"条数据");

    //5、打印测试
    Map<String, Object> map = new HashMap<>();
    ArrayList<Map<String,Object>> list = new ArrayList();
    for (SearchHit hit : search.getHits()) {

        //

        String value = hit.getSourceAsString();
        Content esProductTO = JSON.parseObject(value, Content.class);

        map.put("fragment", JSON.toJSONString(esProductTO.getTitle()));
        System.out.println(esProductTO.getTitle());


        map.put("fr", JSON.toJSONString(esProductTO.getTitle()));


        map = hit.getSourceAsMap();
        //System.out.println("hit = " + hit);
        list.add(map);

//            System.out.println("hit:\n" + hit);
//            System.out.println(hit.getHighlightFields() == null);
//            System.out.println(hit.getHighlightFields().get("title"));
//            Map<String, HighlightField> highlightFields = hit.getHighlightFields();
//            System.out.println("highlightFields = " + highlightFields);
//            HighlightField title_high = highlightFields.get("title");
//            String fr = "";
//            for (Text fragment : title_high.fragments()) {
//                System.out.println("fragment = " + fragment);
//                fr = fragment.toString();
//                map.put("fragment", JSON.toJSONString(fragment.toString()));
//
//            }
//            System.out.println("fr = " + fr);
//            // map.put("fragment", JSON.toJSONString(fragment));
//            map.put("fr", JSON.toJSONString(fr));
//            //System.out.println("title_high_______fragments = " + title_high.fragments().toString());
//            map = hit.getSourceAsMap();
//            //System.out.println("hit = " + hit);
//            list.add(map);
    }
    return list;
}

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值