@Override
public PageResult fullTextSearch(Integer pageNum, Integer pageSize,
Long startTime, Long endTime,
String attrType,
String docType, String searchKey) {
Pageable pageable = PageRequest.of(pageNum - 1, pageSize);//es的分页是从0开始的
NativeSearchQueryBuilder searchQueryBuilder = new NativeSearchQueryBuilder();
if (StringUtils.isNotBlank(searchKey)) {
List filterFunctionBuilders = new ArrayList<>();
filterFunctionBuilders.add(new FunctionScoreQueryBuilder.FilterFunctionBuilder(QueryBuilders.matchPhraseQuery("attr_value", searchKey),
ScoreFunctionBuilders.weightFactorFunction(10)));
filterFunctionBuilders.add(new FunctionScoreQueryBuilder.FilterFunctionBuilder(QueryBuilders.matchPhraseQuery("summary", searchKey),
ScoreFunctionBuilders.weightFactorFunction(5)));
FunctionScoreQueryBuilder.FilterFunctionBuilder[] builders =
new FunctionScoreQueryBuilder.FilterFunctionBuilder[filterFunctionBuilders.size()];
filterFunctionBuilders.toArray(builders);
FunctionScoreQueryBuilder functionScoreQueryBuilder = QueryBuilders.functionScoreQuery(builders)
.scoreMode(FunctionScoreQuery.ScoreMode.SUM)
.setMinScore(2);
searchQueryBuilder.withQuery(functionScoreQueryBuilder);
}
searchQueryBuilder.withPageable(pageable);
BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery();
//按照分类进行过滤查询
if (StringUtils.isNotEmpty(attrType)) {
//过滤精准匹配,用作查询具体的分类
boolQueryBuilder.filter(QueryBuilders.termQuery("attr_type", attrType));
}
// 过滤查询
searchQueryBuilder.withFilter(boolQueryBuilder);
//========================过滤查询 结束=====================================
searchQueryBuilder.withSort(SortBuilders.scoreSort().order(SortOrder.DESC));//相关性排序
searchQueryBuilder.withSort(SortBuilders.fieldSort("update_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 = searchHits.stream().map(SearchHit::getContent).collect(Collectors.toList());
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);
}