老师我这个查询结果是这样,已经使用了ik分词器,正常应该是华为啊,麻烦老师帮看下
Item{id='20201', title='<em>华</em><em>为</em>荣耀play手机', sellPoint=' 打游戏', price=199900, num=999}
Item{id='20200', title='<em>华</em><em>为</em> p30 手机', sellPoint=' 拍照好', price=399900, num=999}
代码
@Test
public void testHighlight(){
HighlightBuilder.Field field = new HighlightBuilder.Field("title");
field.preTags("<em>");
field.postTags("</em>");
NativeSearchQuery query =
new NativeSearchQueryBuilder()
//分页
.withSort(SortBuilders.fieldSort("price").order(SortOrder.ASC))
//排序
.withPageable(PageRequest.of(0, 2))
//搜索条件
.withQuery(QueryBuilders.matchQuery("title","华为"))
//设置高亮字段
.withHighlightFields(field)
.build();
AggregatedPage<Item> pageResult =restTemplate.queryForPage(query, Item.class, new SearchResultMapper() {
//处理搜索结果,搜索完整结果,也就是那个集合
//response -就是搜索结果,相当一 kibana 中执行搜索的结果内容
//clazz -就是返回结果的具体类型
//pageable -分页处理,就是 queryForPage 方法参数query 中的 pageable 对象
@Override
public <T> AggregatedPage<T> mapResults(SearchResponse searchResponse, Class<T> aClass, Pageable pageable) {
//获取搜索结果数据 相当于在查询结果中的 hits
SearchHit[] hits =searchResponse.getHits().getHits();
List<T> resultList = new ArrayList<>();//最终结果集合
for (SearchHit hit :hits) {
//搜索的 source 源
Map<String,Object> map=hit.getSourceAsMap();
Item item =new Item();
item.setId(map.get("id").toString());
item.setSellPoint(map.get("sellPoint").toString());
item.setPrice(Long.parseLong(map.get("price").toString()));
item.setNum(Integer.parseInt(map.get("num").toString()));
//高亮数据处理 key-字段名 value-高亮数据结果
Map<String , HighlightField> highlightFieldMap=hit.getHighlightFields();
HighlightField highlightField = highlightFieldMap.get("title");
if (highlightField==null){
item.setTitle(map.get("title").toString());
}else{//有高亮的 title
item.setTitle(highlightField.getFragments()[0].toString());
}
resultList.add((T)item);
}
//返回结果处理
return new AggregatedPageImpl<T>(resultList,pageable,searchResponse.getHits().getTotalHits());
}
//不提供实现,这个是处理每个搜索结果方法
@Override
public <T> T mapSearchHit(SearchHit searchHit, Class<T> aClass) {
return null;
}
});
for (Item item :pageResult.getContent()) {
System.out.println(item);
}
}
}