//分页并高亮显示之多字段查询(multi_match)
public List<Mytest> queryHighlightAndPageable(String keywords, Integer page, Integer pageSize) throws IOException {
MultiMatchQueryBuilder queryBuilder =
QueryBuilders.multiMatchQuery(keywords, "title", "subTitle");
//分页设置
if (pageSize == null) pageSize = 20;
if (page == null) page = 1;
Integer from = (page - 1) * pageSize;
if (from <= 0) from = 0;
//高亮
//设置需要高亮的es字段
HighlightBuilder highlightBuilder = new HighlightBuilder();
highlightBuilder.preTags("<em style='color:yellow'>");
highlightBuilder.postTags("</em>");
highlightBuilder.field("title");
highlightBuilder.field("subTitle");
SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
//绑定高亮,查询条件
searchSourceBuilder.query(queryBuilder).highlighter(highlightBuilder);
//分页
searchSourceBuilder.from(from);
searchSourceBuilder.size(pageSize);
System.out.println("searchSourceBuilder = " + searchSourceBuilder);
//构建查询器
SearchRequest searchRequest = new SearchRequest(indexName);
searchRequest.source(searchSourceBuilder);
//处理返回值:封装到list中
SearchResponse searchResponse =
restHighLevelClient.search(searchRequest, RequestOptions.DEFAULT);
SearchHits searchHits = searchResponse.getHits();
System.out.println("总数 = " + searchHits.getTotalHits());
//封装数据
List<Mytest> items = new ArrayList<>();
SearchHit[] hits = searchHits.getHits();
for (SearchHit hit : hits) {
//把每条数据封入对象
Mytest mytest = new Mytest();
Map source = hit.getSourceAsMap();
//把非高亮字段封进对象
Object id = source.get("id");
mytest.setId(Integer.parseInt(id.toString()));
Object price = source.get("price");
mytest.setPrice(BigDecimal.valueOf(Double.parseDouble(price.toString())));
//首先从highlight获取es字段,如果命中关键字则有,没有命中直接从Source获取
if (hit.getHighlightFields().get("title") != null) {
Text[] titleTexts = hit.getHighlightFields().get("title").getFragments();
String title = "";
for (Text text : titleTexts) {
title += text;
}
System.out.println("title:" + title);
mytest.setTitle(title);
} else {
mytest.setTitle(source.get("title").toString());
}
//获取es字段subTitle
if (hit.getHighlightFields().get("subTitle") != null) {
Text[] titleTexts = hit.getHighlightFields().get("subTitle").getFragments();
String subTitle = "";
for (Text text : titleTexts) {
subTitle += text;
}
System.out.println("subTitle:" + subTitle);
mytest.setSubTitle(subTitle);
} else {
mytest.setSubTitle(source.get("subTitle").toString());
}
items.add(mytest);
}
for (Mytest item : items) {
System.out.println("neibushuju:"+item);
}
return items;
}
Tab and highlight the key code
Guess you like
Origin blog.csdn.net/qq_38205881/article/details/104467204
Ranking