Elasticsearch自定义char_filter移除点符号失效问题排查
问题原因及解决办法
核心问题1:keyword字段的analyzer参数不生效
keyword类型字段的特性是原样存储原始值,你配置的analyzer参数不会作用于字段的存储和索引流程。这个分析器仅在该字段以text类型查询时才会触发,对keyword字段的最终存储值没有影响。
核心问题2:mapping字符过滤器的语法错误
你的my_mapping_char_filter中,映射规则写了多余空格:". => ",正确语法应该是无空格的".=>",否则Elasticsearch无法正确识别替换规则。
正确解决方案
要实现存储时移除点号的需求,可采用以下两种方式:
方案1:使用normalizer替代analyzer(推荐)
normalizer是专门为keyword类型字段设计的标准化处理器,修改索引配置如下:
{ "settings": { "refresh_interval": "1s", "analysis": { "normalizer": { "my_custom_normalizer": { "char_filter": ["my_mapping_char_filter"] } }, "char_filter": { "my_mapping_char_filter": { "type": "mapping", "mappings": [".=>"] } } } }, "mappings": { "dynamic": "strict", "properties": { "some_text": { "type": "keyword", "normalizer": "my_custom_normalizer" } } } }
方案2:改用text类型+keyword子字段(需保留原始值时)
如果需要同时存储原始值和处理后的值,可配置text类型配合keyword子字段:
{ "settings": { "refresh_interval": "1s", "analysis": { "analyzer": { "my_custom_analyzer": { "tokenizer": "keyword", "char_filter": ["my_mapping_char_filter"] } }, "char_filter": { "my_mapping_char_filter": { "type": "mapping", "mappings": [".=>"] } } } }, "mappings": { "dynamic": "strict", "properties": { "some_text": { "type": "text", "analyzer": "my_custom_analyzer", "fields": { "raw": { "type": "keyword" } } } } } }
此时查询some_text字段会返回处理后的值,some_text.raw字段保留原始值。
验证方法
创建修改后的索引并插入测试数据后,可通过以下命令验证处理是否生效:
GET /my_index/_analyze { "field": "some_text", "text": "1.23.456" }
内容的提问来源于stack exchange,提问作者gin_sea
相关产品推荐
相关产品推荐

