Elasticsearch(ES) 添加/更新映射

Elasticsearch映射管理
本文介绍了如何通过Elasticsearch API向索引添加文档类型及字段,包括向已存在的类型中添加字段、同时向多个索引设置映射、更新字段映射等操作。

原文地址:https://www.exception.site/elasticsearch/elasticsearch-add-mappings

通过 Elasticsearch API 可以向索引(Index) 添加文档类型(Type), 或者向文档类型(Type) 中添加/更新字段(Field)。

PUT http://127.0.0.1:9200/commodity
{
	"mappings": {
		"_doc": {
			"properties": {
				"commodity_id": {
					"type": "long"
				},
				"commodity_name": {
					"type": "text"
				},
				"picture_url": {
					"type": "keyword"
				}
			}
		}
	}
}

接下来,通过 Postman 工具来实际操作一下:

在这里插入图片描述
通过上面 API, 我们创建了一个名称为 commodity(商品) 的索引,类型为_doc, 且包含了三个字段(field), 分别为 commodity_id(商品id)、commodity_name (商品名称)、picture_url(商品图片)。

一、向已存在的类型中添加字段

commodity 索引创建成功后,我们还可以向其中添加新的字段,下面添加一个 price(价格)字段:

PUT http://127.0.0.1:9200/commodity/_mapping/_doc

入参:

{
	"properties": {
		"price": {
			"type": "double"
		}
	}
}

用 Postman 工具演示一下:
在这里插入图片描述

二、同时向多个索引设置映射

Elasticsearch 允许同时向多个索引添加文档类型。

PUT http://127.0.0.1:9200/{index}/_mapping/{type}

{body}
{index}: 索引可以有多种指定方式:
逗号分隔符,比如: comodity1,commodity2;
_all: 表示所有索引;
commodity*:表示以 commodity 为前缀的所有索引;
{type}: 需要添加或更新的文档类型;
{body}:需要添加的字段或字段类型;

接下来,我们测试一下,先创建两个未设置映射的空索引 commodity1、commodity2:

PUT http://127.0.0.1:9200/commodity1
PUT http://127.0.0.1:9200/commodity1

然后向这两个索引同时添加映射:

PUT http://localhost:9200/commodity1,commodity2/_mapping/_doc

入参:

{
	"properties": {
		"commodity_id": {
			"type": "long"
		},
		"commodity_name": {
			"type": "text"
		},
		"picture_url": {
			"type": "keyword"
		}
	}
}

使用 Postman 执行请求:
在这里插入图片描述
设置映射信息成功!

三、更新字段映射

一些情况下,我们需要对某个索引当前类型进行更新,比如:

添加一个新的字段;
更改原有的某个字段;
禁用 doc_values(默认情况是开启的);
添加 ignore_above 参数;
...

Note:关于 ignore_above 参数,若字段长度超过指定的值,则该字段不会被索引起来,也就是说查询不到。

接下来,为了演示,我们先删除之前 commodity 索引,重新建立:

PUT http://127.0.0.1:9200/commdoty

入参:

{
	"mappings": {
		"_doc": {
			"properties": {
				"commodity_id": {
					"type": "long"
				},
				"commodity_name": {
					"properties": {
						"first": {"type": "text"}	
					}
				},
				"picture_url": {
					"type": "keyword"
				}
			}
		}
	}
}

需要注意,commodity_name 字段是一个对象数据类型(Object datatype)。

对象类型指的是,这个字段是个对象,它里面还可以存储多个属性字段。

接着,索引映射新建成功后,我们尝试去更新:

PUT http://127.0.0.1:9200/commdoty/_mapping/_doc

入参:

{
	"properties": {
		"commodity_id": {
			"type": "long"
		},
		"commodity_name": {
			"properties": {
				"last": {
					"type": "text"
				}
			}
		},
		"picture_url": {
			"type": "keyword",
			"ignore_above": 500
		}
	}
}

上述请求中,我们对 commodity_name 对象数据类型增加了一个 last 属性,并且修改了 picture_url 字段,将 ignore_above设置成了 500。

在这里插入图片描述

Java 中为 Elasticsearch 添加映射(Mapping)可以通过使用 Elasticsearch 的高级 Java 客户端 API 来实现。Elasticsearch 提供了多种方式来定义和添加映射,包括通过 Java 对象模型进行映射配置,或者直接使用 JSON 格式的字符串来定义映射规则。 ### 通过 Java 高级客户端添加映射 以下是一个使用 Java 高级客户端 API 来创建索引并添加映射的示例代码: ```java import org.elasticsearch.client.RequestOptions; import org.elasticsearch.client.RestHighLevelClient; import org.elasticsearch.client.indices.CreateIndexRequest; import org.elasticsearch.common.settings.Settings; import org.elasticsearch.common.xcontent.XContentBuilder; import org.elasticsearch.common.xcontent.XContentFactory; import java.io.IOException; public class ElasticsearchMappingExample { public static void createIndexWithMapping(RestHighLevelClient client, String indexName) throws IOException { // 创建索引请求 CreateIndexRequest request = new CreateIndexRequest(indexName); // 设置索引的副本数和分片数 request.settings(Settings.builder() .put("index.number_of_shards", 3) .put("index.number_of_replicas", 1)); // 使用 XContentBuilder 构建映射 XContentBuilder mappingsBuilder = XContentFactory.jsonBuilder() .startObject() .startObject("properties") .startObject("title") .field("type", "text") .field("analyzer", "ik_max_word") .endObject() .startObject("content") .field("type", "text") .field("analyzer", "ik_max_word") .endObject() .startObject("timestamp") .field("type", "date") .field("format", "yyyy-MM-dd HH:mm:ss") .endObject() .endObject() .endObject(); // 将映射添加到索引请求中 request.mapping(mappingsBuilder); try { // 执行创建索引并添加映射的请求 client.indices().create(request, RequestOptions.DEFAULT); System.out.println("索引和映射创建成功"); } catch (IOException | ElasticsearchException e) { e.printStackTrace(); } } } ``` ### 说明 - `CreateIndexRequest` 用于创建一个新索引。 - `settings()` 方法用于设置索引的基本配置,如分片数和副本数。 - `mapping()` 方法用于定义字段的映射规则。 - `XContentBuilder` 是构建 JSON 格式内容的工具类,用于描述映射结构。 - 字段 `title` 和 `content` 的类型为 `text`,并使用了 `ik_max_word` 分词器。 - 字段 `timestamp` 的类型为 `date`,并指定了日期格式为 `yyyy-MM-dd HH:mm:ss`。 ### 注意事项 - 在使用 `XContentBuilder` 构建映射时,需要确保 JSON 结构正确,否则可能会导致映射创建失败。 - Elasticsearch映射一旦创建后,能直接修改现有字段的映射,除非重新创建索引。 - 如果需要动态映射,可以设置 `"dynamic": "true"` 或 `"dynamic": "strict"` 来控制是否允许自动添加新字段。 ### 使用 Spring Data Elasticsearch 添加映射 如果使用的是 Spring Data Elasticsearch,可以通过实体类的注解来定义映射。例如: ```java import org.springframework.data.elasticsearch.annotations.Document; import org.springframework.data.elasticsearch.annotations.Field; import org.springframework.data.elasticsearch.annotations.FieldType; @Document(indexName = "blog", shards = 3, replicas = 1) public class Blog { @Field(type = FieldType.Text, analyzer = "ik_max_word") private String title; @Field(type = FieldType.Text, analyzer = "ik_max_word") private String content; @Field(type = FieldType.Date, format = DateFormat.custom, pattern = "yyyy-MM-dd HH:mm:ss") private String timestamp; // Getters and Setters } ``` 在 Spring Boot 应用中,可以使用 `ElasticsearchOperations` 或 `ElasticsearchRepository` 来管理索引和映射。 ### 示例:使用 `ElasticsearchOperations` 创建索引并映射 ```java import org.springframework.data.elasticsearch.core.ElasticsearchOperations; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; @Service public class ElasticsearchService { @Autowired private ElasticsearchOperations elasticsearchOperations; public void createIndex() { elasticsearchOperations.indexOps(Blog.class).create(); elasticsearchOperations.indexOps(Blog.class).putMapping(Blog.class); } } ``` - `indexOps(Blog.class).create()` 用于创建索引。 - `indexOps(Blog.class).putMapping(Blog.class)` 用于将 `Blog` 类的映射应用到索引中。 通过上述方法,可以灵活地在 Java 代码中为 Elasticsearch 添加映射。[^1] [^2] [^3] ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值