elasticsearch

【es】Elasticsearch新增和删除索引中的字段

2023-06-03  本文已影响0人  Bogon

为什么es对某个索引增加字段容易,删除字段困难?

在ES中,增加字段相对比较容易,因为ES支持动态映射(Dynamic Mapping)。
当索引中新增文档时,ES可以根据文档中的字段自动创建对应的映射关系。如果新字段类型与已有字段类型不同,ES会自动将已有字段类型转换为新类型。

而删除字段则比较困难,因为ES的索引是基于倒排索引的。
当一个字段被索引后,它就会被写入到倒排索引中。
如果删除该字段,就需要删除所有文档中该字段对应的倒排索引,这个过程非常耗时和复杂。
另外,如果删除了一个字段,可能会影响已有的查询和聚合操作,因为这些操作可能依赖于该字段。

因此,在ES中删除字段不是一个常见的操作,通常需要通过创建新的索引来实现。
可以通过创建新的索引并将数据导入新索引的方式来实现增删字段的需求。
虽然这种方式需要重新建立索引,但可以保证数据的完整性和一致性。

Elasticsearch删除索引中的字段

  1. 原索引mappings如下,有full_name和short_name两个字段
{
    "audit_demo": {
        "mappings": {
            "_doc": {
                "properties": {
                    "full_name": {
                        "type": "text",
                        "analyzer": "ik_max_word"
                    },
                    "short_name": {
                        "type": "keyword"
                    }
                }
            }
        }
    }
}
  1. 想要删掉short_name字段,修改后mappings如下
{
    "audit_demo_bak": {
        "mappings": {
            "_doc": {
                "properties": {
                    "full_name": {
                        "type": "text",
                        "analyzer": "ik_max_word"
                    }
                }
            }
        }
    }
}
  1. 删除原索引中待删除字段的数据
POST  /audit_demo/_update_by_query
{
    "script": {
        "lang": "painless",
        "inline": "ctx._source.remove(\"short_name\")"
    },
    "query": {
        "match_all": {}
    }
}

注意:
只是删除数据,不是删除字段
如果不删除字段数据,后面reindex时依然会把待删除字段的值带到新索引,即使设置新索引的dynamic为false

  1. 新建一个索引,索引结构在原索引上删除short_name字段
PUT /audit_demo_bak
{
    "settings": {
        "number_of_shards": "2",
        "number_of_replicas": "2",
        "max_result_window": 100000,
        "analysis": {
            "analyzer": {
                "ik": {
                    "tokenizer": "ik_max_word"
                }
            }
        }
    },
    "mappings": {
        "_doc": {
            "properties": {
                "full_name": {
                    "type": "text",
                    "analyzer": "ik_max_word"
                }
            }
        }
    }
}
  1. 同步数据
POST /_reindex
{
    "source": {
        "index": "audit_demo"
    },
    "dest": {
        "index": "audit_demo_bak"
    }
}
  1. 删除原索引
DELETE  /audit_demo
  1. 新建一个名为原索引名的索引,reindex同步数据,然后删除步骤2新建的索引

注意事项:
步骤6和步骤7,这两个步骤,耗时较长,在这段时间,索引是不可用的,一般在业务低峰期执行操作没啥问题。
如果想要减少索引不可用的时间,有以下两个方案:

方案1:
删除原索引后,为新索引设置别名为原索引
注意,原索引未删除时,为新索引设置别名为原索引会报错

PUT  /audit_demo_bak/_alias/audit_demo

方案2:
删除原索引中待删除字段的数据这步开始之前,就为原索引设置别名,应用程序通过别名访问索引,删除原索引开始之前,删除原索引与别名的关系,新增新索引与别名的关系,应用程序通过别名可以访问到新索引。
虽然这两个步骤的耗时极小,但是还是有可能在这段期间有数据更改,所以还是尽量在业务低峰期操作。

参考

ES 新增字段和删除字段
https://www.cnblogs.com/yezigege/p/15918105.html

Elastic Docs ›Elasticsearch Guide [7.1]/Mapping
https://www.elastic.co/guide/en/elasticsearch/reference/7.1/mapping.html

一文搞懂 Elasticsearch 之 Mapping
https://zhuanlan.zhihu.com/p/114029036

上一篇下一篇

猜你喜欢

热点阅读