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

Elasticsearch关键字字段折叠:需忽略大小写及标点匹配

解决Elasticsearch中基于keyword字段的标题折叠归一化问题

要实现标题去标点、合并多余空格、转小写的归一化效果,从而让相似标题能通过keyword字段折叠分组,你需要**自定义归一化器(Normalizer)**并应用到目标keyword多字段上,具体步骤如下:

1. 定义自定义归一化器

在索引设置中创建包含多步过滤逻辑的归一化器,依次完成大小写转换、首尾空格去除、标点移除、多空格合并:

{
  "settings": {
    "analysis": {
      "normalizer": {
        "collapse_normalizer": {
          "type": "custom",
          "filter": [
            "lowercase",
            "trim",
            {
              "type": "pattern_replace",
              "pattern": "[^a-zA-Z0-9\\s]",
              "replacement": ""
            },
            {
              "type": "pattern_replace",
              "pattern": "\\s+",
              "replacement": " "
            }
          ]
        }
      }
    }
  }
}
  • lowercase:统一转换为小写
  • trim:去除首尾空格
  • 第一个pattern_replace:移除所有非字母、数字、空格的字符(即标点符号)
  • 第二个pattern_replace:将多个连续空格合并为单个空格

2. 应用归一化器到keyword字段

修改title_collapse字段的映射,指定使用上述自定义归一化器:

"title": {
  "type": "text",
  "fields": {
    "title_collapse": {
      "type": "keyword",
      "normalizer": "collapse_normalizer"
    }
  }
}

3. 验证效果

插入你提供的两个测试文档:

PUT /test_index/_doc/1
{
  "title": "China steps up African economic, trade ties to compete with US\' ‘game changing\' moves"
}

PUT /test_index/_doc/2
{
  "title": "China steps up African economic, trade ties to compete with US’ ‘game changing’ moves"
}

查询两个文档的title_collapse字段值,会发现均被归一化为:china steps up african economic trade ties to compete with us game changing moves,此时使用该字段做折叠就能实现预期的分组效果。

注意事项

  • 若索引已存在,需先关闭索引,更新settings和mapping后重新打开,且已存在的旧数据需要重新索引才能应用新的归一化规则。
  • 如需保留特定标点(如连字符),可调整正则表达式,例如将[^a-zA-Z0-9\\s]改为[^a-zA-Z0-9\\s-]。

内容的提问来源于stack exchange,提问作者Yoni Levine

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.28 20:32:58