You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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(),
                // 此处省略了其他未展示的代码
            ]
        ]
    ];
    // 后续执行索引创建的逻辑...
}

我自己排查后梳理的可能问题方向,也请大家帮忙验证:

  • 我怀疑核心问题是停用词过滤器没正确关联到分析器——之前可能只是零散加了停用词列表,但没在自定义分析器里加入停用词过滤步骤,也没让产品名字段使用这个带停用词过滤的分析器。
  • 会不会是默认分析器不支持乌克兰语停用词?必须自定义一个包含乌克兰语停用词过滤器的专属分析器才行?

我整理的具体解决步骤建议(供参考):

  1. 先配置自定义分析器和停用词过滤器
    在创建索引的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" // 可选,加上乌克兰语词干提取,能提升搜索匹配的精准度
        ]
      }
    }
  }
}
  1. 让产品名字段绑定这个自定义分析器
    在mapping的properties里,给产品名称对应的字段指定使用上面的自定义分析器:
"properties": {
  "product_title": { // 替换成你实际的产品名字段名
    "type": "text",
    "analyzer": "custom_ukrainian_analyzer",
    "search_analyzer": "custom_ukrainian_analyzer" // 搜索时用同一个分析器,避免分词规则不一致
  }
}
  1. 测试分词效果验证配置
    修改配置后,一定要重新创建索引并重新导入数据,然后用_analyzeAPI测试,看看на会不会被过滤掉:
POST /your_index_name/_analyze
{
  "analyzer": "custom_ukrainian_analyzer",
  "text": "Папір офісний на 500 аркушів"
}

如果返回的tokens里没有на,就说明停用词过滤器生效了,这时候再用带на的关键词搜索,应该就能正常找到目标产品了。

有没有朋友遇到过类似的乌克兰语停用词问题?或者我的思路哪里有疏漏,欢迎大家指点!

备注:内容来源于stack exchange,提问作者Ivan Kachula

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.15 15:00:31