如何在Elasticsearch中使用包含查询?自定义analyzer问题求助
问题解决方案
一、通配符查询失效的处理方法
通配符(如*mil*)查询默认不会走索引时的自定义分析器,而你的索引词条已经经过lowercase和asciifolding处理,所以需要让查询逻辑和索引逻辑对齐:
- 显式指定查询使用自定义分析器
使用wildcard查询时直接指定分析器,确保查询词被标准化后再匹配:
或者用{ "query": { "wildcard": { "你的字段名": { "value": "*mil*", "analyzer": "你的自定义分析器名" } } } }query_string查询并指定分析器,还原之前QueryStringBuilder的逻辑:{ "query": { "query_string": { "query": "*mil*", "analyzer": "你的自定义分析器名", "default_field": "你的字段名" } } } - 注意性能问题:开头带通配符的查询会遍历大量词条,性能较差,若业务允许,建议改用
prefix查询(如mil*)代替。
二、波兰语重音与词干处理的替代方案
除了自定义分析器加asciifolding,还有以下几种选择:
使用Elasticsearch自带波兰语分析器
高版本Elasticsearch默认包含polish分析器,它内置了波兰语词干提取和重音处理逻辑,直接在字段映射中配置即可:{ "mappings": { "properties": { "你的字段名": { "type": "text", "analyzer": "polish" } } } }使用ICU分析器
安装ICU插件后,icu_analyzer支持多语言重音归一化,同时可搭配波兰语词干过滤器使用,对复杂重音字符处理更精准。使用Normalizer处理关键词字段
若字段是关键词类型(不需要分词),可以用normalizer代替分析器,仅做lowercase和asciifolding标准化:{ "settings": { "normalizer": { "my_normalizer": { "type": "custom", "char_filter": [], "filter": ["lowercase", "asciifolding"] } } }, "mappings": { "properties": { "你的字段名": { "type": "keyword", "normalizer": "my_normalizer" } } } }
内容的提问来源于stack exchange,提问作者crosbee
相关产品推荐
相关产品推荐

