ElasticSearch创建后索引修改数据类型方法步骤

 更新时间:2023年09月22日 10:29:40   作者:云上周郎  
Elasticsearch存储数据之前需要先创建索引,类似于结构型数据库建库建表,创建索引时定义了每个字段的索引方式和数据类型,这篇文章主要给大家介绍了关于ElasticSearch创建后索引修改数据类型的方法步骤,需要的朋友可以参考下

一、前言

在 Elasticsearch 中,一旦创建索引,就不能更改现有字段的数据类型。如果您需要更改数据类型,则需要重新创建索引并使用新的数据类型。以下针对各种业务场景总结几种修改方法。

二、【方法一】删除重建

这种方式的使用场景为当前索引库数据量不大,而且可以及时同步数据到该索引库。一般用在实时采集数据到ES中,删除旧的索引后,重新采集数据即可。

delete /my_index

三、【方法二】使用备份数据重建

当你数据量也不算太大,_reindex的执行速度还算快的,几十万的数据量大概在十分钟以内,百万级的大概在半个小时内就可以完全备份,可以先使用备份库,具体思路如下:

1、获取源索引的数据(mapping) 并 创建临时索引:my_index_temp,

2、备份数据到临时索引:my_index_temp

3、删除原索引: my_index,

4、重新创建正确数据类型索引:my_index

5、再把临时索引:my_index_temp的数据备份到新创建索引 my_index。

操作步骤如下:

1、获取原索引

//获取源索引的mapping数据
GET my_index/_mapping
//返回示例如下
  {"my_index": {
    "mappings": {
      "cdp_doc": {
        "properties": {
	        "whyBuy": {
	          "type": "keyword"
	        },
	        "zipcode": {
	          "type": "keyword"
	        }
        }
      }
    }
  }

2、创建一个临时索引,并备份原索引的数据

//代码如下(示例):
//# 创建Mapping
PUT my_index_temp
{
  "mappings": {
    "cdp_doc": {
      "properties": {
        "whyBuy": {
          "type": "keyword"
        },
        "zipcode": {
          "type": "keyword"
        }
      }
    }
  }
}

3、备份原数据

// 同步数据值临时索引
POST _reindex?refresh&wait_for_completion=false
{
  "conflicts": "proceed",
  "source": {
    "index": "my_index"
  },
  "dest": {
    "index": "my_index_temp",
    "op_type": "create"
  }
}
//查询确认数据是否复制过去
GET  my_index_temp/_search
{
  "query": {
    "term": {
    }
  }
}

4、删除原索引及数据

//删除索引及数据
delete my_index

5、重新创建正确的索引(注意是修改后的索引)

同步骤2

6、迁移旧数据回新索引

同步骤3

7、删除临时索引

同步骤4

四、【方法三】使用嵌套增加属性

这种方法针对索引字段类型text,添加keyword类型操作。

首先区分一下text类型和keyword类型:

text类型:会进行分词、分词后建立索引、支持模糊查询、不支持准确查询、不支持聚合查询。

keyword类型:不会分词、直接建立索引、不支持模糊查询、支持准确查询、支持聚合查询。

操作步骤如下:

PUT my_index/_mapping
{
	"properties": {
		"my_fields": {
			"type": "text",
            "analyzer": "ik_smart",
			"fields": {
				"keyword": {
					"type": "keyword",
					"ignore_above": 256
				}
			}
		}
	}
}
// 结果:
{
  "acknowledged" : true
}

注意这里有个问题,如果直接执行完后,数据不会及时更新,所以执行到这里如果去聚合,旧数据是一样没有聚合到的,还需要执行以下语句更新数据

POST my_index/_update_by_query
# 后台执行
POST my_index/_update_by_query?wait_for_completion=false

修改完成之后,新的数据就会按照新的mapping来走了,可以通过my_fields.keyword的形式进行完全匹配和聚合搜索。

五、【方法四】使用数据从原索引导入新索引中

假设您要将一个名为 my_index 的索引中的整数类型更改为字符串类型。以下示例代码将源索引中的数据复制到新索引中,并使用新的字段映射规则:

POST _reindex
{
  "source": {
    "index": "my_index"
  },
  "dest": {
    "index": "my_new_index"
  },
  "script": {
    "source": "ctx._source.my_integer_field = ctx._source.my_integer_field.toString()",
    "lang": "painless"
  },
  "mappings": {
    "properties": {
      "my_integer_field": {
        "type": "text"
      }
    }
  }
}

在上面的代码中,我们使用脚本将原始索引中的整数类型字段 my_integer_field 转换为字符串类型,并将其保存到新的索引中。同时,在新索引中定义了一个新的数据类型 text,用于存储该字段。

切换到新的索引

最后,一旦新索引准备就绪并包含原始索引的所有数据,就可以切换应用程序以使用新的索引。

需要注意的是,重新创建索引可能会导致数据丢失或不可用性。在执行此操作之前,请务必备份和验证数据。

总结

到此这篇关于ElasticSearch创建后索引修改数据类型的文章就介绍到这了,更多相关ES创建索引修改数据类型内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 关于Spring Cloud健康检查的陷阱

    关于Spring Cloud健康检查的陷阱

    这篇文章主要介绍了关于Spring Cloud健康检查的陷阱,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-07-07
  • Java 注解学习笔记

    Java 注解学习笔记

    这篇文章主要介绍了Java 注解的相关资料,帮助大家更好的理解和学习使用Java,感兴趣的朋友可以了解下
    2021-03-03
  • SpringBoot整合Redis使用@Cacheable和RedisTemplate

    SpringBoot整合Redis使用@Cacheable和RedisTemplate

    本文主要介绍了SpringBoot整合Redis使用@Cacheable和RedisTemplate,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-07-07
  • Java(JDK/Tomcat/Maven)运行环境配置及工具(idea/eclipse)安装详细教程

    Java(JDK/Tomcat/Maven)运行环境配置及工具(idea/eclipse)安装详细教程

    这篇文章主要介绍了Java(JDK/Tomcat/Maven)运行环境配置及工具(idea/eclipse)安装,本文给大家介绍的非常想详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-03-03
  • 在Spring中自动装配Bean的属性

    在Spring中自动装配Bean的属性

    今天小编就为大家分享一篇关于在Spring中自动装配Bean的属性,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2019-01-01
  • springboot中用fastjson处理返回值为null的属性值

    springboot中用fastjson处理返回值为null的属性值

    在本篇文章里小编给大家整理的是一篇关于springboot中用fastjson处理返回值问题详解内容,需要的朋友们参考下。
    2020-03-03
  • RabbitMQ进阶之消息可靠性详解

    RabbitMQ进阶之消息可靠性详解

    这篇文章主要介绍了RabbitMQ进阶之消息可靠性详解,abbitmq消息的投递过程中,怎么确保消息能不丢失,这是一个很重要的问题,哪怕我们做了Rabbitmq持久化,也不能保证我们的业务消息不会被丢失,需要的朋友可以参考下
    2023-08-08
  • Java实现调用第三方相关接口

    Java实现调用第三方相关接口

    最近在做一个项目,需要调用第三方接口,本文主要介绍了Java实现调用第三方相关接口,具有一定的参考价值,感兴趣的可以了解一下
    2023-09-09
  • Java创建数组的3种方式代码举例

    Java创建数组的3种方式代码举例

    数组是相同类型数据的有序集合,数组描述的是若干个相同类型的数据按照一定的先后次序排列组合而成,其中每一个数据称为数组的元素,可以通过下标进行访问,这篇文章主要给大家介绍了关于Java创建数组的3种方式,需要的朋友可以参考下
    2024-01-01
  • 详解如何保证Java本地缓存的一致性

    详解如何保证Java本地缓存的一致性

    所谓的一致性是指在同时使用缓存和数据库的场景下,要确保数据在缓存与数据库中的更新操作保持同步,那么,怎么保证Java本地缓存的一致性?所以本文将给大家介绍了如何保证Java本地缓存的一致性,需要的朋友可以参考下
    2024-01-01

最新评论