为何Elasticsearch索引settings中的analyzer设置不生效?
问题解答:Elasticsearch全局分析器配置未生效原因及用途
为什么settings.analysis.analyzer配置未生效?
你之前的操作误区在于:settings.analysis.analyzer节点仅用于定义分析器(包括内置分析器的声明、或自定义组合分词器/过滤器),它并不会自动将该分析器设置为所有text字段的默认分析器。
Elasticsearch中,text字段默认使用standard分析器(中文场景下会拆分单字)。你虽然在settings里定义了ik_smart分析器,但没有指定让name、title字段使用它,所以写入数据时,这两个字段依然用standard分析器分词,倒排索引中存储的是单个汉字。而你搜索时用ik_smart分词得到['李四', '工程师'],这两个词在倒排索引中不存在,自然搜不到结果。
当你给每个text字段单独配置"analyzer": "ik_smart"后,字段在写入时会用ik_smart分词,倒排索引中存储的是['李四', '工程师']这类整词,搜索时用同样的分析器分词就能匹配到,所以结果正常。
settings.analysis.analyzer的用途
这个配置节点的核心作用是管理分析器的定义:
- 对于Elasticsearch内置的分析器(比如
ik_smart),你可以在这里显式声明(也可直接引用);如果需要基于内置分析器扩展(比如添加同义词过滤器、停用词过滤器),也需要在这里组合tokenizer和filter创建自定义分析器。 - 定义完成的分析器,可以通过字段的
analyzer参数直接引用,或者通过index.default_analyzer设置为全局默认分析器,让所有未单独指定分析器的text字段自动使用它。
正确的全局配置示例
如果想让所有text字段默认使用ik_smart分析器,需要在settings中额外设置index.default_analyzer:
PUT /customers { "settings": { "index": { "default_analyzer": "ik_smart" // 指定全局默认分析器 }, "analysis": { "analyzer": { "ik_smart": { "tokenizer": "ik_smart" } } } }, "mappings": { "properties": { "name": {"type": "text"}, "title": {"type": "text"} } } }
注:如果使用的是官方提供的IK分词插件,ik_smart是内置分析器,其实可以省略analysis.analyzer里的定义,直接设置index.default_analyzer: ik_smart即可。
内容的提问来源于stack exchange,提问作者chouyangv3
相关产品推荐
相关产品推荐

