【问题标题】:How to convert SearchHits<T> return type to Page<T> return type in spring data elasticsearch 4.0如何在spring data elasticsearch 4.0中将SearchHits<T>返回类型转换为Page<T>返回类型
【发布时间】:2021-04-03 21:34:12
【问题描述】:

我有一个连接到 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 类型(官方文档声称 SearchPage 类型是可用于返回值的类型之一,但建议的方法都没有返回该类型)或或者有什么方法可以将 SearchHits 转换为 Page 类型。

非常感谢任何帮助。

【问题讨论】:

    标签: java spring elasticsearch spring-data-elasticsearch data-paging


    【解决方案1】:

    我是通过以下方式完成的:

    SearchPage<YourClass> page = SearchHitSupport.searchPageFor(searchHits, query.getPageable());
    return (Page)SearchHitSupport.unwrapSearchHits(page);
    

    【讨论】:

      【解决方案2】:

      幸好我找到了这个问题的答案,感谢this之前提出的问题

      如那边所说,传递给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 都是接口,因此无需更改方法的返回类型

      【讨论】:

      • Page&lt;T&gt;SearchPage&lt;T&gt; 都是接口,而不是类。您可以将方法的返回类型保留为Page&lt;MetaData&gt;,然后只返回SearchPage 实例。
      • @P.J.Meisch Page&lt;T&gt;SearchPage&lt;T&gt; 是不兼容的类型,这样做不起作用(?)谢谢!
      猜你喜欢
      • 2012-08-04
      • 1970-01-01
      • 1970-01-01
      • 2010-09-27
      • 2021-02-04
      • 1970-01-01
      • 2014-06-10
      • 2018-06-11
      • 2023-04-02
      相关资源
      最近更新 更多