对POJO的弹性搜索结果

问题描述 投票:0回答:2

我正在使用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);
    }
java spring-data-elasticsearch
2个回答
0
投票

正如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());
}

0
投票

SearchHits类扩展了Streamable类,因此,如果您像leiblix所说的那样使用ElasticsearchOperations,甚至不需要在其上调用stream()

    public <T> List<T> search(Query query, Class<T> clazz) {
        return elasticsearchOperations.search(query, clazz).map(SearchHit::getContent).toList();
    }
© www.soinside.com 2019 - 2024. All rights reserved.