解决ES searchHit.getHighlightFields()输出null数据到前端
SearchHit类的hit对象是由search.getHits()得到的,而search是一个SearchResponse类。我们进入SearchHit类中查看hit.getHighlightFields()方法的源码,发现由于。最后不加高亮操作,直接转为json,然后转为对象,前端也正常了。发现其getHits()是另一个类中的hit()因此这里的Map自然也就什么都接不到了,此时的hit是一
一、问题调试
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)