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
相关产品推荐
相关产品推荐

