java整合spring-boot-starter-data-elasticsearch4.0.0实现多字段搜索,排序,高亮显示
网上找了很多种方案一直调试不正确,最后自己琢磨半天才调试通过 ,代码实现效果图如下:
附上代码:
@Override
public PageResult fullTextSearch(FullTextParam param) {
Integer pageNum = param.getPageNum();
Integer pageSize = param.getPageSize();
String[] attrType = param.getAttrType();
String[] docType = param.getDocType();
String searchKey = param.getSearchKey();
Pageable pageable = PageRequest.of(pageNum - 1, pageSize);
//es的分页是从0开始的
NativeSearchQueryBuilder searchQueryBuilder = new NativeSearchQueryBuilder();
searchQueryBuilder.withPageable(pageable);
BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery();
//按照分类进行过滤查询
if (attrType != null && attrType.length > 0) {
//过滤精准匹配,用作查询具体的分类
boolQueryBuilder.must(QueryBuilders.termsQuery("attr_type", attrType));
}
//档案类型过滤
if (docType != null && docType.length > 0) {
//过滤精准匹配,用作查询具体的分类
boolQueryBuilder.filter(QueryBuilders.termsQuery("doc_type", docType));
}
boolQueryBuilder.must(QueryBuilders.existsQuery("title"));
if (StringUtils.isNotBlank(searchKey)) {
boolQueryBuilder.should(QueryBuilders.multiMatchQuery(searchKey, "title", "summary"));
}
FunctionScoreQueryBuilder functionScoreQueryBuilder = QueryBuilders.functionScoreQuery(boolQueryBuilder)
.scoreMode(FunctionScoreQuery.ScoreMode.SUM)
.setMinScore(1);
searchQueryBuilder.withQuery(functionScoreQueryBuilder);
// 设置是否按查询匹配度排序
//设置高亮
HighlightBuilder highlighter = new HighlightBuilder();
//设置三要素
highlighter.field("title");
highlighter.field("summary");
//设置前后缀标签
highlighter.preTags("");
highlighter.postTags("");
//加载已经设置好的高亮配置
searchQueryBuilder.withHighlightBuilder(highlighter);
// 过滤查询
// searchQueryBuilder.withFilter(boolQueryBuilder);
//========================过滤查询 结束=====================================
searchQueryBuilder.withSort(SortBuilders.scoreSort().order(SortOrder.DESC));//相关性排序
searchQueryBuilder.withSort(SortBuilders.fieldSort("data_time").order(SortOrder.DESC));//时间排序
// 搜索条件构造器构建:NativeSearchQuery
NativeSearchQuery searchQuery = searchQueryBuilder.build();
log.info("DSL:{}", searchQuery.getQuery());
SearchHits searchHits = elasticsearchRestTemplate.search(searchQuery, SummaryIndex.class);
if(searchHits.getTotalHits()<=0){
return null;
}
List summaryIndices = new ArrayList<>();
List> result = searchHits.getSearchHits();
result.forEach(
res -> {
SummaryIndex index = res.getContent();
Map> highlightFields = res.getHighlightFields();
List highlight = highlightFields.get("title");
if (highlight != null && highlight.size() > 0) {
StringBuffer buffer = new StringBuffer();
for (String s : highlight) {
buffer.append(s);
}
index.setTitle(buffer.toString());
}
List summaryHighlight = highlightFields.get("summary");
if (summaryHighlight != null && summaryHighlight.size() > 0) {
StringBuffer buffer = new StringBuffer();
for (String s : summaryHighlight) {
buffer.append(s);
}
index.setSummary((String[]) Arrays.asList(buffer.toString()).toArray());
}
summaryIndices.add(index);
});
com.github.pagehelper.Page page = new com.github.pagehelper.Page(pageNum, pageSize);
//为Page类中的total属性赋值
long total = searchHits.getTotalHits();
page.setTotal(total);
//从链表中截取需要显示的子链表,并加入到Page
page.addAll(summaryIndices);
//以Page创建PageInfo
PageInfo pageInfo = new PageInfo<>(page);
return PageUtils.getPageResult(pageInfo);
}



