Elasticsearch:内置法语分析器自定义分词器后停用词失效问题
问题解答
1. 当前配置确实完全重定义了法语分析器
你直接在analysis.analyzer下定义了名为french的自定义分析器,这会直接覆盖Elasticsearch内置的同名法语分析器——相当于完全重新编写了一个分析器,并没有基于内置版本做增量修改。
2. 停用词未被过滤的原因
你配置的过滤器里用了通用的stop过滤器,但这个过滤器默认绑定的是英文停用词表,根本不识别法语停用词(比如ou、le)。而内置法语分析器用的是专门的french_stop过滤器,它会自动加载法语专属的停用词列表,这才是能过滤法语停用词的关键。
3. 可以基于内置法语分析器仅替换分词器
不需要完全重写分析器,正确的做法是继承内置法语分析器的配置,只替换你需要修改的分词器部分。推荐把自定义分析器改名(比如叫custom_french),避免覆盖内置的french分析器,具体配置如下:
SETTINGS = \ { "settings": { "analysis": { "analyzer": { # 自定义分析器,继承内置法语分析器的配置 "custom_french": { "type": "french", # 指定继承内置法语分析器 "tokenizer": "dot_and_boundary_tokeniser" # 仅替换分词器 } }, "tokenizer": { "dot_and_boundary_tokeniser": { "type": "pattern", "pattern": r"[\.\W]+" # 包含"."作为分词分隔符 } } } } } MAPPINGS = \ { "properties": { "french_normalised_content": { "type": "text", "term_vector": "with_positions_offsets", "fields": { "french_stemmed": { "type": "text", "analyzer": "custom_french", # 使用自定义的继承版分析器 "term_vector": "with_positions_offsets", } } } } }
配置说明
- 用
"type": "french"让自定义分析器继承内置法语分析器的所有默认配置(包括lowercase、french_stop、french_stemmer这些专属过滤器) - 只需要指定要替换的
tokenizer,其他配置会自动沿用内置版本 - 改名成
custom_french避免覆盖内置分析器,防止影响其他字段的使用
如果一定要覆盖内置的french分析器,也可以把上面的custom_french改成french,但不推荐这么做,会增加后续维护的混淆风险。
内容的提问来源于stack exchange,提问作者mike rodent
相关产品推荐
相关产品推荐

