Elasticsearch分析器定义中type字段的作用及相关疑问
type字段的疑问解答 先贴出你定义的索引设置代码:
settings = new { index = new { number_of_shards = 1, number_of_replicas = 1, analysis = new { analyzer = new { analyzer_standard_with_html_strip = new { type = "standard", char_filter = new string[] { "html_strip" }, stopwords = "_english_" } } } } }
咱们逐个拆解你的问题:
1. type字段的作用是什么?
type字段的核心作用是告诉Elasticsearch你要基于哪个内置分析器来构建自定义分析器,或者定义一个完全自定义的分析器类型。
当你设置type: "standard"时,相当于给Elasticsearch一个明确指令:我要复用内置standard分析器的基础配置(比如它的分词器、默认过滤器),然后在这个基础上修改或添加额外的配置项(比如你这里的html_strip字符过滤器、英文停用词)。
2. 它是否让该分析器基于standard分析器?
没错,完全正确。
standard是Elasticsearch的默认分析器,默认包含standard分词器、lowercase过滤器,并且默认不启用停用词过滤。当你指定type: "standard"后,你的自定义分析器会完整继承这些核心组件,同时你可以通过配置参数来覆盖或扩展它——比如你这里添加了html_strip来去除HTML标签,又设置stopwords: "_english_"来启用英文停用词过滤,这些都是在standard分析器的基础上做的增强。
3. 去掉type字段仍能正常工作,这是为什么?
这是因为Elasticsearch会做默认配置推断:
- 当你没有指定
type时,Elasticsearch会默认将分析器类型设为custom(这是完全自定义分析器的类型,允许你自由组合分词器、过滤器、字符过滤器)。 - 同时,如果你没有显式指定
tokenizer(分词器),Elasticsearch会自动使用standard分词器作为默认值。
不过这里要注意一个细节:这种默认推断出来的分析器,和你指定type: "standard"的分析器行为并非完全一致。比如standard分析器默认会包含lowercase过滤器,但如果是默认的custom类型分析器,如果你没有手动添加lowercase到filter数组里,你的分析器就不会对文本做小写转换。你现在的例子里看起来正常,只是因为你没涉及到大小写转换的场景,但如果实际场景需要,两者的差异就会显现出来。
内容的提问来源于stack exchange,提问作者Adam Benson

