ElasticSearch Object Mapping
从 ES 4.0 开始,移除了 Jackson 的 ObjectMapper
,改用 MappingElasticsearchConverter
。
一、模型对象映射
1.1 映射注解
MappingElasticsearchConverter
使用注释来标注实体与属性。
@Document
- 类标注,指示该类是映射到数据库的对象indexName
:存储的索引名称type
:映射类型(从4.0开始)shards
:索引的分片数replicas
:索引的副本数refreshIntervall
:索引的刷新间隔,默认1sindexStoreType
:索引的存储类型,默认 fscreateIndex
:是否创建索引,默认为 trueversionType
:版本管理,默认为 EXTERNAL
@Id
- 字段标记,用于标识唯一字段@Transient
- 默认情况下,存储或检索文档时,所有字段都映射到文档,此注释不包括该字段@PersistenceConstructor
- 指定从数据库实例化对象时要使用的给定构造函数@Field
- 定义属性映射name
:字段名称,如果不写,则为 java 的属性名。type
:字段的类型,可选值:Text, Keyword, Long, Integer, Short, Byte, Double, Float, Half_Float, Scaled_Float, Date, Date_Nanos, Boolean, Binary, Integer_Range, Float_Range, Long_Range, Double_Range, Ip_Range, Object, Nested, Ip, TokenCount, Percolator, Flattened, Search_As_You_Type等,详见。format
:和日期的 pattern 类似store
:是否将原始字段值保存在ES中,默认为falseanalyzer
,searchAnalyzer
,normalizer
用于指定自定义分析
@GeoPoint
- 将字段标记为 geo_point 类型
二、映射规则
类型提示:字段为 _class
,允许通用类型映射,可使用 @TypeAlias
来指定别名。
地理空间类型:如 Point
、GeoPoint
类型,会转换为 经纬度对。
集合:转换为数组。
Map:键必须为字符串。
三、自定义类型转换
在 AbstractElasticsearchConfiguration
中,可以通过 ElasticsearchCustomConversions
来注册类型转换规则。
@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<Address, Map<String, Object>> {
@Override
public Map<String, Object> convert(Address source) {
LinkedHashMap<String, Object> target = new LinkedHashMap<>();
target.put("ciudad", source.getCity());
// ...
return target;
}
}
@ReadingConverter
static class MapToAddress implements Converter<Map<String, Object>, Address> {
@Override
public Address convert(Map<String, Object> source) {
// ...
return address;
}
}
}