修改Elasticsearch的ASCII Folding Token Filter,将Ə/ə映射为E/e
解决Elasticsearch中Ə/ə字符折叠为E/e的问题
刚好处理过一模一样的场景——默认的ASCII Folding Token Filter会把Ə(U+018F)和ə(U+0259)折叠成A/a,但我们需要让它们映射到E/e,同时还要保留原字符。用char_filter确实没法同时满足修改映射和保留原字符的需求,所以咱们可以通过自定义分析器来实现:
具体实现步骤
- 自定义ASCII折叠过滤器:创建一个带自定义映射的
asciifolding过滤器,明确指定Ə/ə要映射到E/e,同时开启preserve_original: true来保留原始字符。 - 替换默认分析器:把这个自定义过滤器配置到索引的默认分析器中,确保所有文本都会按这个规则处理。
执行配置命令
直接运行以下curl命令来更新目标索引(这里以myix为例)的设置:
curl -XPUT 'localhost:9200/myix/_settings?pretty' -H 'Content-Type: application/json' -d' { "analysis" : { "analyzer" : { "default" : { "tokenizer" : "standard", "filter" : ["standard", "my_ascii_folding"] } }, "filter" : { "my_ascii_folding" : { "type" : "asciifolding", "preserve_original" : true, "mapping" : [ "Ə=>E", "ə=>e" ] } } } } '
关键细节说明
mapping参数:默认的asciifolding过滤器里,Ə/ə是映射到A/a的,所以必须通过这个参数手动覆盖映射规则,才能让它们转成E/e。preserve_original: true:这个配置会让过滤器同时输出原始字符和折叠后的字符,这样无论是搜索原始的Ələ还是折叠后的Ele,都能匹配到对应的文档,完美解决char_filter无法保留原字符的问题。
验证效果
可以用_analyze接口测试分析器是否生效:
curl -XGET 'localhost:9200/myix/_analyze?pretty' -H 'Content-Type: application/json' -d' { "analyzer": "default", "text": "Ələ" } '
返回的tokens里应该会包含Ə、l、ə(原始字符)和E、l、e(折叠后字符),这就说明配置成功了。
内容的提问来源于stack exchange,提问作者nikli




