当前位置:   article > 正文

ElasticSearch创建后的索引如何修改数据类型_es修改数据类型

es修改数据类型

一、前言

在 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、获取原索引
  1. //获取源索引的mapping数据
  2. GET my_index/_mapping
  3. //返回示例如下
  4. {"my_index": {
  5. "mappings": {
  6. "cdp_doc": {
  7. "properties": {
  8. "whyBuy": {
  9. "type": "keyword"
  10. },
  11. "zipcode": {
  12. "type": "keyword"
  13. }
  14. }
  15. }
  16. }
  17. }
2、创建一个临时索引,并备份原索引的数据
  1. //代码如下(示例):
  2. //# 创建Mapping
  3. PUT my_index_temp
  4. {
  5. "mappings": {
  6. "cdp_doc": {
  7. "properties": {
  8. "whyBuy": {
  9. "type": "keyword"
  10. },
  11. "zipcode": {
  12. "type": "keyword"
  13. }
  14. }
  15. }
  16. }
  17. }
3、备份原数据
  1. // 同步数据值临时索引
  2. POST _reindex?refresh&wait_for_completion=false
  3. {
  4. "conflicts": "proceed",
  5. "source": {
  6. "index": "my_index"
  7. },
  8. "dest": {
  9. "index": "my_index_temp",
  10. "op_type": "create"
  11. }
  12. }
  13. //查询确认数据是否复制过去
  14. GET my_index_temp/_search
  15. {
  16. "query": {
  17. "term": {
  18. }
  19. }
  20. }
4、删除原索引及数据
  1. //删除索引及数据
  2. delete my_index
5、重新创建正确的索引(注意是修改后的索引)

同步骤2

6、迁移旧数据回新索引

同步骤3

7、删除临时索引

同步骤4

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

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

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

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

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

操作步骤如下:

  1. PUT my_index/_mapping
  2. {
  3. "properties": {
  4. "my_fields": {
  5. "type": "text",
  6. "analyzer": "ik_smart",
  7. "fields": {
  8. "keyword": {
  9. "type": "keyword",
  10. "ignore_above": 256
  11. }
  12. }
  13. }
  14. }
  15. }
  16. // 结果:
  17. {
  18. "acknowledged" : true
  19. }

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

  1. POST my_index/_update_by_query
  2. # 后台执行
  3. POST my_index/_update_by_query?wait_for_completion=false

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

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

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

  1. POST _reindex
  2. {
  3. "source": {
  4. "index": "my_index"
  5. },
  6. "dest": {
  7. "index": "my_new_index"
  8. },
  9. "script": {
  10. "source": "ctx._source.my_integer_field = ctx._source.my_integer_field.toString()",
  11. "lang": "painless"
  12. },
  13. "mappings": {
  14. "properties": {
  15. "my_integer_field": {
  16. "type": "text"
  17. }
  18. }
  19. }
  20. }

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

切换到新的索引

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

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

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/article/detail/37483
推荐阅读
相关标签
  

闽ICP备14008679号