在没有类型键的情况下序列化聚合和建议

编辑

在没有类型键的情况下序列化聚合和建议编辑

Elasticsearch 搜索请求接受一个 typed_key 参数,该参数允许在聚合和建议结果中返回类型信息以及名称(有关其他详细信息,请参阅聚合文档)。

Java API 客户端始终将此参数添加到搜索请求中,因为需要类型信息才能知道应用于反序列化聚合和建议结果的具体类。

类似地,Java API 客户端也使用此 typed_keys 格式序列化聚合和建议结果,以便它可以正确反序列化自身序列化的结果。

ElasticsearchClient esClient = ...
JsonpMapper mapper = esClient._jsonpMapper();

StringWriter writer = new StringWriter();
try (JsonGenerator generator = mapper.jsonProvider().createGenerator(writer)) {
    mapper.serialize(searchResponse, generator);
}
String result = writer.toString();

// The aggregation property provides the "avg" type and "price" name
assertTrue(result.contains("\"aggregations\":{\"avg#price\":{\"value\":3.14}}}"));

但是,在某些用例中,以 typed_keys 格式序列化对象可能并不可取,例如,当 Java API 客户端用作其他服务的接口应用程序时,这些服务期望聚合和建议的默认格式。

您可以通过在映射器对象上将 JsonpMapperFeatures.SERIALIZE_TYPED_KEYS 属性设置为 false 来禁用 typed_keys 序列化

ElasticsearchClient esClient = ...
// Create a new mapper with the typed_keys feature disabled
JsonpMapper mapper = esClient._jsonpMapper()
    .withAttribute(JsonpMapperFeatures.SERIALIZE_TYPED_KEYS, false);

StringWriter writer = new StringWriter();
try (JsonGenerator generator = mapper.jsonProvider().createGenerator(writer)) {
    mapper.serialize(searchResponse, generator);
}
String result = writer.toString();

// The aggregation only provides the "price" name
assertTrue(result.contains("\"aggregations\":{\"price\":{\"value\":3.14}}}"));