_原题是:Spring认证中国教育管理中心-Spring Data Elasticsearch教程二(Spring中国教育管理中心)
Spring Data Elasticsearch教程二
6.1.2.映射规则
类型提示
映射使用嵌入在发送到服务器的文档中的类型提示来允许泛型类型映射。这些类型提示_class在文档中表示为属性,并为每个聚合根写入。
示例 56. 类型提示
public class Person {
@Id String id;
String firstname;
String lastname;
}
{
"_class" : "com.example.Person",
"id" : "cb7bef",
"firstname" : "Sarah",
"lastname" : "Connor"
}
默认情况下,域类型类名用于类型提示。
类型提示可以配置为保存自定义信息。使用@TypeAlias注释来执行此操作。
确保@TypeAlias在初始实体集 (
AbstractElasticsearchConfiguration#getInitialEntitySet) 中添加类型,以便在首次从存储中读取数据时已经拥有可用的实体信息。
示例 57. 带别名的类型提示
@TypeAlias("human")
public class Person {
@Id String id;
// ...
}
{
"_class" : "human",
"id" : ...
}
写入实体时使用配置的别名。
除非属性类型是Object、接口或实际值类型与属性声明不匹配,否则不会为嵌套对象编写类型提示。
禁用类型提示
当应该使用的索引已经存在而没有在其映射中定义类型提示并且映射模式设置为严格时,可能需要禁用类型提示的写入。在这种情况下,写入类型提示会产生错误,因为该字段无法自动添加。
通过覆盖writeTypeHints()派生自的配置类中的方法,可以为整个应用程序禁用类型提示
AbstractElasticsearchConfiguration(请参阅Elasticsearch 客户端)。
作为替代方案,可以使用@Document注释为单个索引禁用它们:
@Document(indexName = "index", writeTypeHint = WriteTypeHint.FALSE)
我们强烈建议不要禁用类型提示。只有在被迫时才这样做。禁用类型提示可能会导致无法从 Elasticsearch 正确检索文档,以防多态数据或文档检索可能完全失败。
地理空间类型
像Point&这样的地理空间类型GeoPoint被转换为纬度/经度对。
示例 58. 地理空间类型
public class Address {
String city, street;
Point location;
}
{
"city" : "Los Angeles",
"street" : "2800 East Observatory Road",
"location" : { "lat" : 34.118347, "lon" : -118.3026284 }
}
GeoJson 类型
Spring Data Elasticsearch 通过为GeoJson不同几何提供接口和实现来支持 GeoJson 类型。它们根据 GeoJson 规范映射到 Elasticsearch 文档。实体的相应属性在索引映射中指定,就像geo_shape编写索引映射时一样。(也请查看Elasticsearch 文档)
示例 59. GeoJson 类型
public class Address {
String city, street;
GeoJsonPoint location;
}
{
"city": "Los Angeles",
"street": "2800 East Observatory Road",
"location": {
"type": "Point",
"coordinates": [-118.3026284, 34.118347]
}
}
实现了以下 GeoJson 类型:
GeoJsonPoint
GeoJsonMultiPoint
GeoJsonLineString
GeoJsonMultiLineString
GeoJsonPolygon
GeoJsonMultiPolygon
GeoJsonGeometryCollection
收藏品
对于集合中的值,在类型提示和自定义转换方面应用与聚合根相同的映射规则。
示例 60. 集合
public class Person {
// ...
List friends;
}
{
// ...
"friends" : [ { "firstname" : "Kyle", "lastname" : "Reese" } ]
}
地图
对于 Maps 中的值,在类型提示和自定义转换方面应用与聚合根相同的映射规则。但是,映射键需要一个字符串才能由 Elasticsearch 处理。
示例 61. 集合
public class Person {
// ...
Map knownLocations;
}
{
// ...
"knownLocations" : {
"arrivedAt" : {
"city" : "Los Angeles",
"street" : "2800 East Observatory Road",
"location" : { "lat" : 34.118347, "lon" : -118.3026284 }
}
}
}
6.1.3.自定义转化
望着Configuration从上一节
ElasticsearchCustomConversions允许注册映射域和简单类型的具体规则。
示例 62. 元模型对象映射配置
@Configuration
public class Config extends AbstractElasticsearchConfiguration {
@Override
public RestHighLevelClient elasticsearchClient() {
return RestClients.create(ClientConfiguration.create("localhost:9200")).rest();
}
@Bean
@Override
public ElasticsearchCustomConversions elasticsearchCustomConversions() {
return new ElasticsearchCustomConversions(
Arrays.asList(new AddressToMap(), new MapToAddress()));
}
@WritingConverter
static class AddressToMap implements Converter> {
@Override
public Map convert(Address source) {LinkedHashMap target = new LinkedHashMap<>();
target.put("ciudad", source.getCity());
// ...return target;
}
}
@ReadingConverter
static class MapToAddress implements Converter