恢复Elasticsearch 8中SearchResponse的旧行为

bgibtngc  于 2023-03-29  发布在  ElasticSearch
关注(0)|答案(1)|浏览(205)

由于缺少与GeoBoundingBox查询的兼容性,我被迫使用新的Elasticsearch 8 Java客户端。根据文档,当使用搜索时,现在必须指定一个将用于去沙漠化的文档类。在旧的搜索中,此时返回一个简单的Map,其中Key(String)Value(Any)。
如何恢复这种行为?我们使用跨多个实体的搜索,所以我们不能将特定类型(如“Product”)应用到搜索结果中。除了JsonNode/ObjectNode之外,我还尝试跟随Jackson并使用类似这样的东西:

val searchResponse = elasticsearchClient.search(searchRequest, object : TypeReference<Map<String, Any?>>(){}::class.java)

但是这样我得到以下错误消息:

com.fasterxml.jackson.databind.exc.UnrecognizedPropertyException: Unrecognized field "name" (class com.test.test.elasticsearch.QueryService$geoBoundingBoxQuery$searchResponsey$1), not marked as ignorable (0 known properties: ])

如何从旧的Java客户端恢复行为?

omvjsjqw

omvjsjqw1#

我最终得到了以下解决方案:

val searchResponse = elasticsearchClient.search(searchRequest, JsonNode::class.java)

val content = searchResponse.hits().hits().mapNotNull { hit ->
    jsonMapper.convertValue(hit.source(), object : TypeReference<Map<String, Any?>>() {})
        .filterValues { it != null }
        .mapValues { it.value as Any }
}

JsonNode来自jackson-databind(如果您想使用新的Elasticsearch客户端,无论如何都需要它)
在第二步中,使用TypeReference收集并相应地转换各个json节点。因此,最后我有一个map列表,与之前相同。

相关问题