Elasticsearch 删除多余域映射(字段)

由于Elasticsearch域映射创建后不能随便删改,所以如果没有设计好就开始开发就可能出现域映射会有多余字段(我通常把域映射和字段当做一个东西),对于追求完美同学们心里总是不舒服的

以下测试是在kibana

错误索引域映射

{
  "test" : {
    "mappings" : {
      "properties" : {
        "err_field" : {  # 错误域映射(字段)
          "type" : "text"
        },
        "name" : {
          "type" : "keyword"
        },
        "time" : {
          "type" : "double"
        }
      }
    }
  }
}
方法一
  1. 新建正确域映射的索引
# 新建索引
PUT /test_v5

# 新建域映射
POST /test_v5/_mapping
{
	"properties": {
		"name": {"type": "keyword"},
		"time": {"type": "double"}
	}
}
  1. 数据迁移
POST /_reindex
{
  "source": {"index": "test"},
  "dest": {"index": "test_v5"}

# 执行结果
{
  "took" : 178,  #耗时时长
  "timed_out" : false, # 是否超时
  "total" : 4, # 总数据量(测试数据就用了4个)
  "updated" : 0,
  "created" : 4, # 在test_v5创建4条数据
  "deleted" : 0,
  "batches" : 1, # 批次(一次搞完,数据量较多时应该会分批迁移【猜的)
  "version_conflicts" : 0, # 冲突数据数(被迁移索引有数据时可能会冲突【猜的)
  "noops" : 0,
  "retries" : {
    "bulk" : 0,
    "search" : 0
  },
  "throttled_millis" : 0,
  "requests_per_second" : -1.0,
  "throttled_until_millis" : 0,
  "failures" : [ ]
}
  1. 删除旧索引
DELETE /test
  1. 貌似已经完成了,但最开始的索引名(test)和现在的索引名(test_v5)不一样了,如果想改回test,可以把test_v5当做旧索引,test当做新索引再操作一遍(重命名方法没找到,找到的朋友希望评论告诉我一下),另外就是可以考虑使用方法二
方法二

使用索引别名,这个没有具体操作只说下思路(有同学看不懂【或不想看懂】可以评论留言,我操作一波再来补充)

  1. 新建正确域映射的索引(同上)
  2. 数据迁移(同上)
  3. 对新索引创建索引别名;
POST /_aliases
{
  "actions": [
    {
      "add": {
        "index": "test_v5",
        "alias": "alias_mid" # 可以把别名命名为旧索引名(看情况,【没实际测总感觉心里没底)
      }
    }
  ]
}
  1. 删除旧索引(同上)
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
可以使用 Elasticsearch 的 dynamic templates 功能,通过配置模板来实现字段映射。 首先,在 Spring Boot 中配置 Elasticsearch 的时候,可以使用 `ElasticsearchRestTemplate` 来操作 Elasticsearch。在创建 `ElasticsearchRestTemplate` 的时候,可以指定一个 `ElasticsearchConverter` 对象,用于将 Java 对象转换成 Elasticsearch 中的文档。在 `ElasticsearchConverter` 中,可以使用 `MappingElasticsearchConverter` 对象来实现字段映射。 具体的操作步骤如下: 1. 配置 `ElasticsearchRestTemplate`,指定 `ElasticsearchConverter` 对象: ```java @Configuration public class ElasticsearchConfig { @Bean public ElasticsearchRestTemplate elasticsearchTemplate(RestHighLevelClient client, ElasticsearchConverter converter) { return new ElasticsearchRestTemplate(client, converter); } @Bean public ElasticsearchConverter elasticsearchConverter() { MappingElasticsearchConverter converter = new MappingElasticsearchConverter(elasticsearchMappingContext()); converter.setTypeMapper(new DefaultElasticsearchTypeMapper(null)); return converter; } @Bean public ElasticsearchMappingContext elasticsearchMappingContext() { return new ElasticsearchMappingContext(); } } ``` 2. 在 `ElasticsearchMappingContext` 中配置 dynamic templates: ```java @Configuration public class ElasticsearchConfig { @Bean public ElasticsearchMappingContext elasticsearchMappingContext() { ElasticsearchMappingContext context = new ElasticsearchMappingContext(); context.setInitialEntitySet(getInitialEntitySet()); context.setSimpleTypeHolder(customSimpleTypeHolder()); context.setApplicationContext(applicationContext); // 配置 dynamic templates context.setDynamicTemplates(Arrays.asList( new DynamicTemplate("camel_case_to_underscore", new MappingBuilder() .match("*") .unmatch("*_text") .mapping(new ObjectMapping() .setType("text") .setNormalizer("lowercase") .addProperty("type", "keyword") .addProperty("fields", new ObjectMapping() .addProperty("raw", new ObjectMapping() .setType("keyword") ) ) ) ) )); return context; } } ``` 上述代码中,我们创建了一个名为 `camel_case_to_underscore` 的 dynamic template,并将其应用到所有字段上(使用 `match("*")`),但排除了以 `_text` 结尾的字段(使用 `unmatch("*_text")`)。对于所有匹配的字段,我们都将其映射为 `text` 类型,使用 `lowercase` 正则表达式将其转换为小写,同时添加了一个 `raw` 子字段,用于排序和聚合操作。 这样,我们就完成了将 Java 中的驼峰命名转换为 Elasticsearch 中的下划线命名的操作。在使用 `ElasticsearchRestTemplate` 进行 CRUD 操作时,会自动将 Java 对象转换为 Elasticsearch 中的文档,并将字段映射为下划线命名。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值