姓名撇号的Token Filter适配:实现多查询与特殊撇号数据匹配
解决方案
要让"lau"、"la'u"和"la u"都能匹配目标"Laʼu"(带U+02BC特殊撇号),我们需要调整字符过滤器和分词过滤逻辑,把所有差异的分隔符(特殊撇号、普通撇号、空格)统一处理,让所有形式最终生成相同的分词。以下是具体配置修改:
1. 最简方案:直接移除所有差异分隔符
这个方案最直接,通过字符过滤器把特殊撇号、普通撇号和空格全部移除,确保所有输入都被归一化为无分隔的小写词。
调整字符过滤器
更新你的extended_punctuation_char_filter,添加对普通撇号和空格的映射:
"char_filter": { "extended_punctuation_char_filter": { "type": "mapping", "mappings": [ "\u02BC=>", // 移除特殊撇号(U+02BC) "\u0027=>", // 移除普通撇号(U+0027) " =>" // 移除空格 ] } }
最终分析器配置
保留你原有的小写和Unicode折叠过滤器即可:
"analyzer": { "folding": { "tokenizer": "icu_tokenizer", "filter": [ "lowercase", "icu_folding_filter" ], "char_filter": [ "extended_punctuation_char_filter" ] } }
生效逻辑
- 目标文本"Laʼu" → 移除特殊撇号后变成"Lau" → 小写处理后生成分词
lau - 查询"lau" → 直接小写处理后生成
lau - 查询"la'u" → 移除普通撇号后变成"lau" → 小写处理后生成
lau - 查询"la u" → 移除空格后变成"lau" → 小写处理后生成
lau
所有形式最终都会匹配到同一个分词,完美解决需求。
2. 灵活备选方案:保留原分词同时生成合并词
如果你不想完全移除空格(避免影响其他带空格的正常分词),可以改用word_delimiter过滤器,在保留原分词的同时,合并分隔符两侧的内容生成新分词。
调整字符过滤器(仅转换特殊撇号)
"char_filter": { "extended_punctuation_char_filter": { "type": "mapping", "mappings": [ "\u02BC => \u0027" // 把特殊撇号转成普通撇号,让词分隔过滤器能识别 ] } }
最终分析器配置
添加word_delimiter过滤器并配置合并规则:
"analyzer": { "folding": { "tokenizer": "icu_tokenizer", "filter": [ "lowercase", "icu_folding_filter", { "type": "word_delimiter", "preserve_original": true, // 保留原分词(比如"la u"会保留"la"和"u") "catenate_all": true, // 合并所有分隔后的部分生成新分词"lau" "split_on_case_change": false, // 不根据大小写分割 "split_on_numerics": false, // 不根据数字分割 "stem_english_possessive": false // 不移除所有格撇号 } ], "char_filter": [ "extended_punctuation_char_filter" ] } }
生效逻辑
- 目标"Laʼu"会生成
lau和la'u两个分词 - 查询"lau"匹配
lau - 查询"la'u"匹配
la'u和lau - 查询"la u"匹配
la、u和lau
这种方案既满足你的匹配需求,又不会破坏其他文本的正常分词逻辑。
内容的提问来源于stack exchange,提问作者Paul B
相关产品推荐
相关产品推荐

