RestHighLevelClient v/s ElasticsearchClient Java客户端在Elasticsearch 8.x中搜索

gfttwv5a  于 5个月前  发布在  ElasticSearch
关注(0)|答案(2)|浏览(73)

我使用RestHighLevelClient搜索和检索List<Map<String,Object>>中的数据。

final SearchResponse response = client.search(searchRequest, RequestOptions.DEFAULT);
    RestStatus statusCode = response.status();
    log.info("Status code : {} ", statusCode.getStatus());
    if(RestStatus.OK.equals(response.status())) {
        final SearchHits hits = response.getHits();
        Long totalHits = hits.getTotalHits();
        log.info("Total number of hits : {} ", totalHits);
        final SearchHit[] results = hits.getHits();
        List<Map<String, Object>> list = new ArrayList<>(totalHits.intValue());
        for(SearchHit hit : results) {
            final Map<String, Object> sourceAsMap = hit.getSourceAsMap();
            list.add(sourceAsMap);
        }
        return list;
    }

字符串
ElasticSearchClient中search()的签名是不同的。它需要提供Class作为方法参数的一部分。在我的情况下,我不想将其转换为任何具体对象。我尝试使用“Object.class”(例如elasticSearchClient.search(searchRequest,Object.class))。但它没有提供我在RestHighLevelClient中使用的Map列表。我的问题是如何提取List<Map <String,使用新的API从响应中调用对象>>?

SearchResponse<Object> response = elasticSearchClient.search(searchRequest, Object.class);
        List<Hit<Object>> hits = response.hits().hits();
        for (Hit<Object> hit : hits) {
            // how do I get Map<String, Object> here? 
        }

1zmg4dgp

1zmg4dgp1#

我可以将其转换为Map.class以获得预期的结果。

SearchResponse<Map> response = elasticSearchClient.search(searchRequest, Map.class);
    List<Hit<Map>> hits = response.hits().hits();
    for (Hit<Object> hit : hits) {
           Map<String, Object> source = hit.source();
    }

字符串

z4bn682m

z4bn682m2#

你也可以使用ObjectNode类:

ObjectNode json = response.source();
String name = json.get("name").asText();
logger.info("Product name " + name);

字符串
来源:文件

相关问题