应用 elasticsearch 的 python sdk 实现批改一个 index 的 char_filter

在 Elasticsearch 中,能够应用 Python SDK(即 Elasticsearch Python 客户端)来实现批改一个索引的 char_filter。上面是一个简略的示例,阐明如何应用 Python SDK 来实现批改一个索引的 char_filter:

from elasticsearch import Elasticsearch# 创立 Elasticsearch 客户端es = Elasticsearch(["http://localhost:9200/"])# 定义索引名称和 char_filter 名称index_name = "my_index"char_filter_name = "my_char_filter"# 定义要增加的 char_filter 配置char_filter_config = {    "type": "mapping",    "mappings": [        "a => b",        "c => d"    ]}# 获取原始的索引配置index_settings = es.indices.get_settings(index=index_name)# 获取原始的 char_filter 配置char_filters = index_settings[index_name]["settings"]["index"]["analysis"]["char_filter"]# 将新的 char_filter 配置增加到原始配置中char_filters[char_filter_name] = char_filter_config# 更新索引的配置,包含 char_filter 配置body = {    "settings": {        "index": {            "analysis": {                "char_filter": char_filters            }        }    }}# 更新索引的配置es.indices.put_settings(index=index_name, body=body)

在下面的代码中,咱们首先创立了 Elasticsearch 客户端对象 es,而后定义了要批改的索引名称 index_name 和要增加的 char_filter 名称 char_filter_name。接着,咱们应用一个字典对象 char_filter_config 来定义要增加的 char_filter 配置。而后,咱们应用 get_settings() 办法获取原始的索引配置,并从中提取出 char_filter 配置。接着,咱们将新的 char_filter 配置增加到原始配置中,并应用 put_settings() 办法将更新后的索引配置从新写入到 Elasticsearch 中。

须要留神的是,上述代码中的 char_filter_config 是一个蕴含 typemappings 两个局部的字典对象。其中,type 指定 char_filter 的类型,这里咱们应用 mapping 类型;而 mappings 指定了要替换的字符映射,这里咱们将 a 映射为 bc 映射为 d

另外,须要留神的是,批改索引配置可能会影响到索引中已有的文档,因而在进行批改操作时须要审慎,并先在测试环境中进行测试。


当然,间接更新会报错

elasticsearch.exceptions.RequestError: RequestError(400, 'illegal_argument_exception', "Can't update non dynamic settings [[index.analysis.char_filter.my_custom_html_strip_char_filter.mappings, index.analysis.char_filter.my_custom_html_strip_char_filter.type]] for open indices [[meta_text_tracking/8UIVr6OSRMydLgiN5mWI6Q]]")

如何解决?

这个谬误意味着你尝试批改一个曾经关上的 Elasticsearch 索引的非动静设置,这些设置无奈在线批改。默认状况下,Elasticsearch 只容许在线批改一些动静设置,例如分片数或正本数等。在对索引进行非动静设置更改之前,必须首先敞开该索引。在这种状况下,您须要依照以下步骤操作:

  • 敞开索引:
from elasticsearch import Elasticsearches = Elasticsearch()index_name = "your_index_name"es.indices.close(index=index_name)
  • 更新索引设置:
from elasticsearch import Elasticsearches = Elasticsearch()index_name = "your_index_name"body = {    "settings": {        "index": {            "analysis": {                "char_filter": {                    "my_custom_html_strip_char_filter": {                        "type": "html_strip",                        "escaped_tags": []                    }                }            }        }    }}es.indices.put_settings(index=index_name, body=body)
  • 关上索引:
from elasticsearch import Elasticsearches = Elasticsearch()index_name = "your_index_name"es.indices.open(index=index_name)

留神,这些操作可能会影响索引的性能,因而在生产环境中应审慎执行。在进行此类更改之前,强烈建议在测试环境中进行测试,以确保批改操作不会毁坏您的数据或索引。