我正在使用spring-data-elasticsearch(4.0版)。现在,我需要将搜索结果从其他高级客户端转换为POJO对象。
我将使用Jackson库中的ObjectMapper。我相信有更好的方法可以做到这一点。
Spring数据弹性搜索现在(从4.0开始)使用MappingElasticsearchConverter。不幸的是,我不知道如何完成此操作-我看不到任何相关文档。
实体
@Document(indexName="addresses")
public class Address {
@Id
private String uam;
@Field
private String street;
....
}
我只需要将SearchHits转换为地址实体
@SpringBootTest
@RunWith(SpringRunner.class)
@ActiveProfiles(profiles = "dev")
public class TestElasticSearch {
@Autowired
private RestHighLevelClient highLevelClient;
@Test
void convertToPojo() throws Exception {
SearchRequest searchRequest = new SearchRequest();
SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
searchSourceBuilder.query(QueryBuilders.matchAllQuery());
searchRequest.source(searchSourceBuilder);
SearchResponse searchResponse = client.search(searchRequest, RequestOptions.DEFAULT);
SearchHit[] hits = searchResponse.getHits().getHits();
Arrays.stream(hits).map(hit -> hit.toString()).forEach(System.out::println);
}
正如P.J. Meisch所述,最好使用ElasticsearchOperations
void convertToPojo() {
SearchHits<Address> hits = operations.search(Query.findAll(), Address.class);
List<Address> addresses = hits.stream().map(hit -> hit.getContent()).collect(Collectors.toList());
}
SearchHits类扩展了Streamable类,因此,如果您像leiblix所说的那样使用ElasticsearchOperations,甚至不需要在其上调用stream()
public <T> List<T> search(Query query, Class<T> clazz) {
return elasticsearchOperations.search(query, clazz).map(SearchHit::getContent).toList();
}