Elasticsearch乌克兰语停用词不生效问题求助
Elasticsearch乌克兰语停用词不生效问题求助
大家好,我最近在用Elasticsearch 7.9.1做乌克兰语产品搜索时卡壳了,折腾好一阵没解决,想请同行们帮忙分析下!
具体情况是这样的:我有个产品名称是Папір офісний Double A, A5 (148 х 210 мм), Premium 80г/м2 500 аркушів,用搜索词Папір офісний 500 аркушів能正常搜到这个产品;但只要在搜索词里加个乌克兰语介词на,变成Папір офісний на 500 аркушів,就完全搜不到了。
我的需求很明确:希望на(对应英文on)、в(对应in)、і(对应and)这类介词在搜索时被直接忽略,不要影响结果匹配。我试着把这些词设为停用词,但完全没效果,搜索时系统还是会把на当成有效关键词来匹配,导致找不到目标产品。
下面是我创建索引的部分代码:
public function createIndex() { $mappingParams = [ 'index' => $this->getIndexName(), 'body' => [ 'mappings' => [ '_source' => [ 'enabled' => true ], 'properties' => $this->getMappingProperties(), // 此处省略了其他未展示的代码 ] ] ]; // 后续执行索引创建的逻辑... }
我自己排查后梳理的可能问题方向,也请大家帮忙验证:
- 我怀疑核心问题是停用词过滤器没正确关联到分析器——之前可能只是零散加了停用词列表,但没在自定义分析器里加入停用词过滤步骤,也没让产品名字段使用这个带停用词过滤的分析器。
- 会不会是默认分析器不支持乌克兰语停用词?必须自定义一个包含乌克兰语停用词过滤器的专属分析器才行?
我整理的具体解决步骤建议(供参考):
- 先配置自定义分析器和停用词过滤器
在创建索引的settings里,添加乌克兰语专用的停用词过滤器和分析器:
"settings": { "analysis": { "filter": { "ukrainian_stop_filter": { "type": "stop", "stopwords": "_ukrainian_" // 直接用ES内置的乌克兰语停用词列表,省心高效 // 如果内置列表不全,也可以换成自定义数组:["на", "в", "і", ...] } }, "analyzer": { "custom_ukrainian_analyzer": { "tokenizer": "standard", "filter": [ "lowercase", "ukrainian_stop_filter", // 关键:把停用词过滤器加入分词流程 "ukrainian_stemmer" // 可选,加上乌克兰语词干提取,能提升搜索匹配的精准度 ] } } } }
- 让产品名字段绑定这个自定义分析器
在mapping的properties里,给产品名称对应的字段指定使用上面的自定义分析器:
"properties": { "product_title": { // 替换成你实际的产品名字段名 "type": "text", "analyzer": "custom_ukrainian_analyzer", "search_analyzer": "custom_ukrainian_analyzer" // 搜索时用同一个分析器,避免分词规则不一致 } }
- 测试分词效果验证配置
修改配置后,一定要重新创建索引并重新导入数据,然后用_analyzeAPI测试,看看на会不会被过滤掉:
POST /your_index_name/_analyze { "analyzer": "custom_ukrainian_analyzer", "text": "Папір офісний на 500 аркушів" }
如果返回的tokens里没有на,就说明停用词过滤器生效了,这时候再用带на的关键词搜索,应该就能正常找到目标产品了。
有没有朋友遇到过类似的乌克兰语停用词问题?或者我的思路哪里有疏漏,欢迎大家指点!
备注:内容来源于stack exchange,提问作者Ivan Kachula
相关产品推荐
相关产品推荐

