我目前正在从 spring 数据 Elasticsearch 3.2.X 迁移到 4.0.0。
我一直依赖于通过使用现在已弃用的低级函数 通过原始 SearchResponse 类获取内部点击结果org.springframework.data.elasticsearch.core.ElasticsearchOperations.query(SearchQuery query, ResultsExtractor resultsExtractor);
https://docs.spring.io/spring-data/elasticsearch/docs/4.0.0.RELEASE/reference/html/#elasticsearch-migration-guide-3.2-4.0
基本上我所做的是创建自定义的 resultExtractor,它将公开低级别的 SearchResponse,以便我可以提取内部点击结果。
现在 4.0.0 版本不再存在该功能,ElasticSearchOperations 和 ElasticSearchRestTemplate 都使用称为 SearchHits 的新结果类,AFAIK 不存储内部命中信息。
除了直接使用 restHighLevelClient(这当然是不可取的,因为我会丢失对象映射和东西)之外,我能想到的解决方法是扩展 ElasticSearchRestTemplate 并基本上创建 的新实现。 search(Query query, Class clazz, IndexCoordinates index) 这将返回 SearchHits 和原始搜索响应(类似于我的自定义 ResultExtractor 过去所做的)。
之后,由于所有 api 返回页面实例已被弃用,我现在不得不依赖 SearchHitSupport.searchPageFor(SearchHits searchHits, @Nullable Pageable pageable) 获得通常的分页功能。
我觉得这不是很简单和干净的解决方案,当然感觉更像是一种解决方法。在 4.0.0 版本中,是否有更直接的方法来获取 innerHitsResult 并将结果内容映射到页面?
最佳答案
有一个open issue关于inner_hits。返回inner_hits 应该在SearchHit<T>
中完成类,而不是通过公开内部 Elasticsearch 数据。
至于分页:当你有SearchHits<T>
对象作为使用 Pageable
的查询的结果,你可以打电话
SearchHits<Entity> searchHits = operations.search(query, Entity.class);
SearchPage<Entity> page = SearchHitSupport.searchPageFor(searchHits, query.getPageable)
SearchPage
实现 Page
界面。编辑:
问题已修复,从下一个版本 (4.1) 开始返回内部命中。
关于java - 从 Spring Data Elastic Search 4.0.0 的 SearchHits 类获取 InnerHits 结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62115096/