Elasticsearch自动补全提示器:索引时如何去除非字母字符?
解决Elasticsearch 7.17自动补全字段去除非字母字符的问题
问题核心在于Elasticsearch的completion类型字段默认分析逻辑无法直接移除非字母字符,即使切换simple或standard分析器也不满足需求——这两个分析器会按非字母分割文本而非清除特殊字符。要实现索引时去除非字母字符,需要自定义分析器结合pattern_replace过滤器来处理。
步骤1:创建带自定义分析器的索引
定义一个仅保留字母的分析器,通过正则替换清除所有非字母字符,同时可选添加小写转换以支持大小写不敏感的补全:
PUT autocomplete-food { "settings": { "analysis": { "analyzer": { "alpha_only_completion": { "tokenizer": "keyword", "filter": [ "lowercase", "alpha_filter" ] } }, "filter": { "alpha_filter": { "type": "pattern_replace", "pattern": "[^a-zA-Z]", "replacement": "" } } } }, "mappings": { "properties": { "suggest": { "type": "completion", "analyzer": "alpha_only_completion", "search_analyzer": "alpha_only_completion" } } } }
步骤2:插入测试文档
和你之前的插入逻辑一致,无需修改输入内容:
PUT autocomplete-food/_doc/1?refresh { "suggest": [ { "input": "Starbucks", "weight": 10 }, { "input": ["+(Coffee","Latte","Flat White"], "weight": 5 } ] }
步骤3:执行自动补全查询
使用你原来的查询语句:
POST autocomplete-food/_search?pretty { "suggest": { "suggest": { "prefix": "coff", "completion": { "field": "suggest" } } } }
效果说明
此时索引会自动将+(Coffee处理为coffee,查询coff返回的结果中text字段会是coffee,而非带特殊字符的原始值。
内容的提问来源于stack exchange,提问作者Vivek Singh
相关产品推荐
相关产品推荐

