使用ElasticsearchRestTemplate 来对es进行操作
改代码实现了 es 的 分页 根据关键词 对标题 OR文章 进行中文分词搜索
模拟存入es 的文章 根据 文章标题 和文章内容 进行关键词搜索,
@Autowired
@Lazy
private ElasticsearchRestTemplate elasticsearchRestTemplate;
/**
* 查询文章
*/
@Override
public EsArticleDataListVO getArticleList(String keywords,Integer current, Integer size) {
BoolQueryBuilder queryBuilder = QueryBuilders.boolQuery();
NativeSearchQueryBuilder searchQuery;
//根据文章标题 & 文章内容 查询关键字
if (Objects.nonNull(keywords))
{ String str = "被搜索的字段名称(文章标题)"+","+"被搜索的字段名称(文章内容)";
MultiMatchQueryBuilder builder = QueryBuilders.multiMatchQuery(param.getArticleKeywords(), str.split(","));
builder.field("被搜索的字段名称(文章标题)");
builder.field("被搜索的字段名称(文章内容)");
//分词
builder.analyzer("ik_smart");
queryBuilder = QueryBuilders.boolQuery().must(builder);
}else {
queryBuilder = QueryBuilders.boolQuery();
}
if (Objects.nonNull(current)) {
// 分页 es 分页是从0开始的
PageRequest pageRequest = PageRequest.of(current-1, size);
searchQuery = new NativeSearchQueryBuilder()
.withQuery(queryBuilder)
.withSort(SortBuilders.fieldSort("排序字段").order(SortOrder.DESC))
.withPageable(pageRequest);
} else {
searchQuery = new NativeSearchQueryBuilder()
.withSort(SortBuilders.fieldSort("排序字段").order(SortOrder.DESC))
.withQuery(queryBuilder);
}
//es搜索 方法 EsArticleDataVO文章返回对象
SearchHits<EsArticleDataVO> searchResults = elasticsearchRestTemplate.search(searchQuery.build(), EsArticleDataVO.class);
// 设置一个需要返回的实体类集合
List<EsArticleDataVO> dataVOList = new ArrayList<>();
// 遍历返回的内容进行处理
searchResults.getSearchHits().forEach(searchHit -> {
// 放到实体类中
EsArticleDataVO searchProdDto = new EsArticleDataVO();
BeanUtils.copyProperties(searchHit.getContent(), searchProdDto);
dataVOList.add(searchProdDto);
});
//创建返回集合对象
EsArticleDataListVO esSearchListVO = new EsArticleDataListVO();
//文章数据集合
esSearchListVO.setDataVOList(dataVOList);
//返回总数
esSearchListVO.setTotal(searchResults.getTotalHits());
return esSearchListVO;
}