spring-data-elasticsearch,Java,Spring,spring Data Elasticsearch" /> spring-data-elasticsearch,Java,Spring,spring Data Elasticsearch" />

Java 从Spring Data Elastic Search 4.0.0中的SearchHits类获取InnerHits结果

Java 从Spring Data Elastic Search 4.0.0中的SearchHits类获取InnerHits结果,java,spring,spring-data-elasticsearch,Java,Spring,spring Data Elasticsearch,我目前正在从SpringDataElasticSearch3.2.X迁移到4.0.0 我一直依赖于通过原始SearchResponse类获得内部点击结果,方法是利用现在不推荐使用的低级函数org.springframework.data.elasticsearch.core.ElasticsearchOperations.query(SearchQuery查询,ResultsExtractor ResultsExtractor) 基本上,我所做的是创建自定义ResultTextRactor,它

我目前正在从SpringDataElasticSearch3.2.X迁移到4.0.0

我一直依赖于通过原始SearchResponse类获得内部点击结果,方法是利用现在不推荐使用的低级函数org.springframework.data.elasticsearch.core.ElasticsearchOperations.query(SearchQuery查询,ResultsExtractor ResultsExtractor)

基本上,我所做的是创建自定义ResultTextRactor,它将公开低级SearchResponse,这样我就可以提取内部点击结果

现在4.0.0版不再提供该功能,ElasticSearchOperations和ElasticSearchRestTemplate都使用名为SearchHits的新结果类,AFAIK不存储内部点击信息

除了直接使用restHighLevelClient(当然这是不可取的,因为我会丢失对象映射和其他东西)之外,我可以想到的解决方法是扩展ElasticSearchRestTemplate,基本上创建搜索的新实现(查询查询、类分类、索引协调索引)它将返回SearchHits和原始搜索响应(类似于我的自定义ResultTextRactor过去的操作)

之后,由于所有返回页面实例的api都被弃用,我现在必须依靠SearchHitSupport.searchPageFor(SearchHits SearchHits,@Nullable Pageable Pageable)来获得通常的分页功能

我觉得这不是一个非常直接和干净的解决方案,当然更像是一个解决办法。是否有更直接的方法获取innerHitsResult并将结果内容映射到4.0.0版的页面?

有一个关于InnerHits的方法。返回内部点击应该在
SearchHit
类中完成,而不是通过公开内部Elasticsearch数据

至于分页:当使用可分页的查询的结果是
SearchHits
对象时,您可以调用

SearchHits<Entity> searchHits = operations.search(query, Entity.class);
SearchPage<Entity> page = SearchHitSupport.searchPageFor(searchHits, query.getPageable)
SearchHits SearchHits=operations.search(查询,实体.class);
SearchPage page=SearchHitSupport.searchPageFor(searchHits,query.getPageable)
SearchPage
实现
Page
界面

编辑:


问题已经解决,下一个版本(4.1)将在上返回内部点击。

Hi@p.J.Meisch感谢您的回答并指出Jira的问题。自2016年以来,这张罚单似乎一直悬而未决:(.我想从搜索响应中获取内部点击是目前唯一的方法…我的意思是,如果可能的话,我也更愿意从搜索点击中获取内部点击结果,因为这也会简化我的代码。但是,正如已经指出的,searchHit类根本不存储任何内部点击信息。目前没有,我们必须添加它。我们想要要为每个用户提供类似问题的解决方案,如果我们要公开原始Elasticsearch数据,每个人都必须编写自己的解析代码。至于票证开放这么久:是的,我们有这些。我在2019年4月接管了该项目的维护。这是一个社区驱动的项目,没有多少贡献许多旧的票据不再符合代码或内部结构,因此必须对它们进行讨论,直到它们能够被接受为止implemented@P.K.Meisch我理解您的立场,并完全同意未来需要一个健壮的解决方案(可能是Jira票证中提到的内部hits注释方式).话虽如此,我只是觉得现在应该删除旧的低级org.springframework.data.elasticsearch.core.ElasticsearchOperations.query(SearchQuery查询,resultextractor resultextractor);考虑到SearchHit类还没有封装来自SearchResponse的所有数据,这未免有些过早。@ChristophenSpielmann脚本字段是另一回事。你看过
@ScriptedField
吗?我知道根据JIRA,它固定在spring数据ES 4.1中。由于我使用的是spring boot 2.3.4,我不知道是否可以我的要求与我想要得到脚本化字段的要求类似。