【Elastic Search 学习总结】8.ES的Mapping

本文介绍Elasticsearch自动创建映射的功能及支持的数据类型,并演示了如何查看自动创建的映射。此外,还介绍了ES底层如何存储Object类型及对象数组类型的数据。

一、ES自动创建Mapping

我们添加一个文档对象时,如果索引与类型都不存在,那么es会帮我们自动创建!不仅如此,es还会帮我们创建Mapping

 

查询一下自动创建的Mapping GET /index_name/type/_mapping

 

我们可以看到ES会自动识别我们传递的数据的数据类型!

 

二、ES支持的数据类型

 

等等。还有很多,这里面只是展示了一些常用的。

 

三、ES底层对Object类型、对象数组类型的数据存储的格式

1. Object类型

2. 对象数组类型

四、手动创建Mapping

【提示】这只是一个Demo,里面的内容还有很多!

<think> 我们讨论的是Elasticsearch Java API Client中的`co.elastic.clients.elasticsearch._types.mapping.Properties`类。 这个类用于表示索引映射中的字段集合(即properties部分)。在Elasticsearch中,映射(mapping)定义索引的结构,包括每个字段的类型和属性。 `Properties`类实际上是一个`Map<String, Property>`,其中键是字段名,值是一个`Property`对象。`Property`是一个联合类型(union type),可以表示各种字段类型(如TextProperty, KeywordProperty, DateProperty等)。 使用步骤: 1. 创建`Properties`对象:通常使用`Properties`的`Builder`模式来构建。 2. 添加字段映射:为每个字段指定类型和配置。 3. 在创建索引或更新映射时使用。 示例:创建一个包含两个字段(一个文本字段和一个关键字字段)的映射。 注意:在Java API Client中,我们使用构建器(Builder)模式来创建对象。 具体代码示例: </think> ### Elasticsearch Java API 中 `co.elastic.clients.elasticsearch._types.mapping.Properties` 使用详解 `Properties` 类是 Elasticsearch Java API Client 中定义索引映射的核心组件,用于声明索引的字段结构。其本质是 `Map<String, Property>` 类型,键为字段名,值为字段配置对象[^1]。 #### 1. **基础用法** ```java import co.elastic.clients.elasticsearch._types.mapping.*; // 创建 Properties 实例 Properties properties = new Properties.Builder() .put("title", new Property.Builder() .text(t -> t .fields("keyword", new Property.Builder() .keyword(k -> k.ignoreAbove(256)) ) ) .build() ) .put("price", new Property.Builder() .integer(i -> i) .build() ) .build(); // 应用映射到索引 client.indices().create(c -> c .index("products") .mappings(m -> m.properties(properties)) ); ``` - `Property.Builder()`: 字段配置构建器 - `.text()/keyword()/integer()`: 声明字段类型 - `.fields()`: 定义多字段(multi-fields) #### 2. **配置字段参数** ```java .put("email", new Property.Builder() .keyword(k -> k .index(false) // 不参与搜索 .docValues(true) // 允许聚合 .nullValue("N/A") // 空值替换 ) .build() ) ``` #### 3. **复杂类型定义** ```java // 对象类型 .put("address", new Property.Builder() .object(o -> o .properties("city", new Property.Builder().keyword().build()) .properties("street", new Property.Builder().keyword().build()) ) .build() ) // 嵌套类型 .put("tags", new Property.Builder() .nested(n -> n .properties("name", new Property.Builder().keyword().build()) ) .build() ) ``` #### 4. **动态映射操作** ```java // 获取现有映射 GetMappingResponse response = client.indices().getMapping(b -> b.index("products")); Properties existingProps = response.get("products").mappings().properties(); // 添加新字段 Properties newProps = new Properties.Builder() .putAll(existingProps) // 保留原有字段 .put("new_field", new Property.Builder().keyword().build()) .build(); // 更新映射 client.indices().putMapping(b -> b .index("products") .properties(newProps) ); ``` ### 核心注意事项 1. **类型安全** - 使用 `Property` 的子类确保类型安全: ```java TextProperty textProp = property.text(); // 获取text类型配置 if (textProp != null) { System.out.println(textProp.analyzer()); } ``` 2. **空值处理** ```java .keyword(k -> k.nullValue("undefined")) ``` 3. **性能优化** ```java .text(t -> t .indexOptions(IndexOptions.Offsets) // 减少存储 .norms(false) // 关闭评分因子 ) ``` 4. **类型转换** ```java // Property 转 JSON JsonpMapper mapper = ...; JsonGenerator generator = ...; properties.serialize(generator, mapper); // JSON 转 Property JsonParser parser = ...; Properties props = Properties._DESERIALIZER.deserialize(parser, mapper); ``` > **重要提示**:修改已存在字段的映射类型需通过 `Reindex API` 重建索引[^1]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值