java - 从 Spring Data Elastic Search 4.0.0 的 SearchHits 类获取 InnerHits 结果

标签 java spring spring-data-elasticsearch

我目前正在从 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/

相关文章:

java - ElasticSearch 日期直方图聚合 填充缺失数据

java - Spring Java Config期间的加载顺序

java - 如何使用lookback API获取计划估计变更的功能记录

java - 在 Spring 中使用 Java 驱动程序的无尽 MongoDB ReplicaSetStatus 更新程序异常

elasticsearch - Spring boot、elasticsearch和spring data elasticsearch的兼容版本

spring-boot - 需要为ElasticsearchRepository findBy查询编写自定义分析器

java - Retrofit 2 编码中的特殊字符问题

java - SQLiteDatabase android 中的特殊字符

java - jdbc 查询抛出异常

控制台中的 Spring 表达式语言 (SpEL)