使用Elasticsearch Python客户端创建自定义分析器返回400错误如何解决
问题原因
你的配置存在多余的嵌套层级,和ignore=400参数没有关系。
你在settings.py中定义的settings变量本身已经包含"settings"外层键,而Python Elasticsearch客户端的indices.create方法的settings参数只需要接收settings键对应的内层配置内容,不需要额外套一层settings。这就导致最终发送给ES的请求中,配置路径变成了index.settings.settings.analysis.*,ES无法识别这类路径的配置,所以抛出了找不到对应配置的异常。ignore=400参数的作用只是让客户端收到400状态码时不直接抛出异常,而是返回完整的响应内容,并不是引发错误的原因。
解决方案
有两种修改方式任选其一即可:
方式1:修改settings.py中的配置定义
去掉外层的settings键,直接保留analysis相关的配置:
settings = { "analysis": { "analyzer": { "my_custom_analyzer": { "char_filter": [ "emoticons" ], "tokenizer": "punctuation", "filter": [ "lowercase", "english_stop" ] } }, "tokenizer": { "punctuation": { "type": "pattern", "pattern": "[ .,!?]" } }, "char_filter": { "emoticons": { "type": "mapping", "mappings": [ ":) => _happy_", ":( => _sad_" ] } }, "filter": { "english_stop": { "type": "stop", "stopwords": "_english_" } } } }
方式2:调用创建索引方法时传入内层配置
如果不想修改settings.py的原有定义,在调用indices.create方法时,传入settings["settings"]作为参数即可:
self.es_client.indices.create(index=index_name, ignore=400, mappings=mapping, settings=settings["settings"])
修改完成后重新执行创建索引的操作,即可正常创建带自定义分析器的索引。
内容的提问来源于stack exchange,提问作者Lahiru Udayanga
相关产品推荐
相关产品推荐

