无类型键的聚合和建议序列化

编辑

无类型键的聚合和建议序列化

编辑

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}}}"));