0

我有一个连接到 ElasticSearch 集群的 Spring Boot 应用程序,我正在对其执行以下操作:

@Autowired
private ElasticsearchOperations operations;

public Page<Metadata> search(Request request){
    Query query = this.queryBuilder(request);
    SearchHits<Metadata> hits = operations.search(query, Metadata.class);
    \\ some code to convert SearchHits<Metadata> to Page<Metadata> type
 }

元数据是我的自定义实体,查询构建器是我定义的另一个函数,它在运行时返回弹性搜索查询类型。问题是,我需要在返回这些传入数据之前对其进行分页。我浏览了 spring data elasticsearch 的整个官方文档,但没有找到任何分页结果的示例。事实上,我在互联网上任何地方都能找到的唯一分页示例是使用 spring 存储库搜索方法,它是这样的,

Page<Metadata> page = repository.search(query, PageRequest.of(0,1));

但该方法现在在 4.x 版本的包中已弃用。我正在使用的查询是由另一个函数(queryBuilder函数)动态构造的,它取决于传入的请求参数,因此在存储库接口上定义方法是不可能的,因为它需要我为每个参数组合定义方法和每次检查哪个与 if-else 条件块一起使用。有没有办法从 ElasticSearchOperations 接口方法返回 Page <T> 类型(官方文档声称 SearchPage <T> 类型是可用于返回值的类型之一,但建议的方法都没有返回该类型)或或者有什么方法可以将 SearchHits<T> 转换为 Page<T> 类型。

任何帮助深表感谢。

4

2 回答 2

1

I have done this in the following way:

SearchPage<YourClass> page = SearchHitSupport.searchPageFor(searchHits, query.getPageable());
return (Page)SearchHitSupport.unwrapSearchHits(page);
于 2021-10-13T10:21:45.087 回答
1

幸运的是我找到了这个问题的答案,这要感谢之前提出的这个问题

如上所述,传递给 search 方法的查询参数有一个 setPageable 方法。所以,代码现在看起来有点像

public SearchPage<Metadata> search(Request request){
    Query query = this.queryBuilder(request);
    query.setPageable(PageRequest.of(PageNumber,PageSize));
    SearchHits<Metadata> hits = operations.search(query, Metadata.class);
    return SearchHitSupport.searchPageFor(hits, query.getPageable());
}

正如评论者所建议的那样, SearchPage 和 Page 都是接口,因此无需更改方法的返回类型

于 2020-12-26T10:01:15.167 回答