Elasticsearch自定义分析器设为索引默认失败,报错Unknown analyzer type
如何将自定义Elasticsearch分析器设为索引默认分析器?
已创建可正常工作的自定义分析器,但无法将其设为索引默认分析器,只能为每个字段单独配置。由于索引映射会随时间变化,希望避免为新增字段重复配置分析器,因此设置默认分析器十分重要。
创建索引的JSON内容:
{ "settings": { "analysis": { "char_filter": { "my_mappings_char_filter": { "type": "mapping", "mappings": [ "- => ¡h¡", ], } }, "analyzer": { "test_analyzer": { "tokenizer": "whitespace", "char_filter": ["my_mappings_char_filter"], "filter": ["lowercase"] }, "default": { "type": "test_analyzer" } }, } }, }
返回错误(状态码400):
{ "error": { "root_cause": [ { "type": "illegal_argument_exception", "reason": "Unknown analyzer type [test_analyzer] for [default]" } ], "type": "illegal_argument_exception", "reason": "Unknown analyzer type [test_analyzer] for [default]" }, "status": 400 }
问题原因
你当前的写法错误:在analyzer下定义default分析器时,直接指定type: "test_analyzer",Elasticsearch会把test_analyzer当成内置分析器类型,而非你自定义的分析器名称,因此报错“未知分析器类型”。
解决方法
完全可以将自定义分析器设为默认,有两种正确方式:
方式一:索引级别设置默认分析器(推荐)
在settings.analysis下定义好自定义分析器后,添加index.default_analyzer参数指定自定义分析器名称:
{ "settings": { "analysis": { "char_filter": { "my_mappings_char_filter": { "type": "mapping", "mappings": [ "- => ¡h¡" ] } }, "analyzer": { "test_analyzer": { "tokenizer": "whitespace", "char_filter": ["my_mappings_char_filter"], "filter": ["lowercase"] } }, "index.default_analyzer": "test_analyzer" } } }
方式二:映射级别设置默认分析器
在mappings的文档类型下(如_doc)直接指定analyzer为自定义分析器名称:
{ "settings": { "analysis": { "char_filter": { "my_mappings_char_filter": { "type": "mapping", "mappings": [ "- => ¡h¡" ] } }, "analyzer": { "test_analyzer": { "tokenizer": "whitespace", "char_filter": ["my_mappings_char_filter"], "filter": ["lowercase"] } } }, "mappings": { "_doc": { "analyzer": "test_analyzer", "properties": {} } } } }
说明
两种方式都能让自定义分析器成为默认,所有未单独指定分析器的新增字段都会自动使用它。其中方式一的索引级别设置优先级更高,是更通用的解决方案。
内容的提问来源于stack exchange,提问作者Cysio
相关产品推荐
相关产品推荐

