Elasticsearch standard analyzer下数字字母组合词条匹配问题咨询
问题根因
- 你当前使用的
fuzzy、wildcard都属于词条级查询,不会对输入的查询文本做分词处理,你输入的300CT会作为完整单个词条,直接和倒排索引中已有的词条(只有拆分后的paper、towel、300、ct等独立词条)做匹配,自然无法命中。 - 你使用的standard分析器会将带空格的
300 CT拆分为两个独立词条,倒排索引中不存在300CT这类合并形态的词条,进一步导致匹配失败。
解决方案
方案1:更换查询方式(无需调整索引,成本最低)
将词条级查询替换为支持自动分词的match查询即可,示例语句如下:
{ "query": { "match": { "ec_item_name": { "query": "300CT", "operator": "or" } } } }
原理:match查询会默认使用字段绑定的standard分析器对输入文本做分词,输入的300CT会被拆分为300、ct两个词条,只要文档中存在任意一个匹配词条就会命中,完全满足你要求的双向匹配效果。
方案2:自定义分析器(匹配精度更高,适合长期业务使用)
可以通过内置的word_delimiter_graph令牌过滤器自定义分析器,该过滤器专门处理数字、字母混合的词条,会自动生成拆分、合并两种形态的词条存入倒排索引,配置示例如下:
{ "settings": { "analysis": { "analyzer": { "alnum_mix_analyzer": { "tokenizer": "standard", "filter": [ "lowercase", "word_delimiter_graph" ] } } } }, "mappings": { "properties": { "ec_item_name": { "type": "text", "analyzer": "alnum_mix_analyzer" } } } }
该分析器的分词效果:
- 输入
300 CT:生成300、ct两个词条 - 输入
300CT:生成300、ct、300ct三个词条
不管输入查询词是300还是300CT都可以实现双向匹配。
内容的提问来源于stack exchange,提问作者Ryanmc174
相关产品推荐
相关产品推荐

