Elasticsearch如何设置字段查询的最小连续字符匹配规则
Elasticsearch 匹配规则配置方案
核心需求对应实现逻辑
两个需求可通过ES原生能力组合实现,无需额外开发插件:
- 「匹配序列越长、允许模糊度越高」:直接使用ES原生的
AUTO模糊度规则即可,无需自定义逻辑 - 「至少5个连续字符命中才触发匹配」:生产环境优先用N-gram分词器在索引侧实现,存量索引无法重建时可用脚本兜底
详细配置步骤
1. 索引Mapping配置(生产环境推荐)
配置自定义的5-gram分词器,将连续字符按长度5到设定的最大长度切分,只要原文和查询词有连续5个字符重合就会生成匹配的token,从索引层面过滤掉连续匹配字符不足5的结果。
PUT /你的业务索引名 { "settings": { "analysis": { "analyzer": { "5gram_analyzer": { "tokenizer": "5gram_tokenizer" } }, "tokenizer": { "5gram_tokenizer": { "type": "ngram", "min_gram": 5, "max_gram": 15, "token_chars": ["letter", "digit"] } } } }, "mappings": { "properties": { "需要配置规则的目标字段名": { "type": "text", "analyzer": "5gram_analyzer", "search_analyzer": "standard" } } } }
配置说明:
max_gram根据业务场景调整,设为日常查询词的最大长度即可,不要超过20,避免索引体积过度膨胀- 如果字段包含中文、特殊符号,直接删掉
token_chars配置,会对所有字符做切分 - 如果是已有索引,需要新建索引配置后做reindex迁移数据
2. 查询语句配置
查询时直接指定fuzziness为AUTO即可实现模糊度随匹配长度自动提升,默认规则为:
- 匹配序列长度≤2:必须完全精确匹配,无模糊空间
- 匹配序列长度3~5:最多允许1个字符的编辑距离(增/删/改1个字符)
- 匹配序列长度>5:最多允许2个字符的编辑距离
查询示例:
GET /你的业务索引名/_search { "query": { "match": { "需要配置规则的目标字段名": { "query": "用户输入的查询内容", "fuzziness": "AUTO", "prefix_length": 1, "max_expansions": 50 } } } }
查询参数说明:
- 如果要调整模糊度的阶梯阈值,可以写成
"AUTO:4,7"格式,代表长度≤3必须精确、4~6允许1个编辑距离、≥7允许2个编辑距离,数值可根据业务需求自行修改 prefix_length代表查询词开头多少个字符必须精确匹配,设为1可以大幅降低模糊查询的性能消耗max_expansions限制模糊匹配扩展的词项数量,高并发场景建议设为50以内,避免集群内存占用过高
存量索引兜底方案(不推荐生产高并发用)
如果无法重建索引迁移数据,可以在查询时加脚本实时校验查询词和字段值的最长公共连续子串长度,过滤掉不足5个连续匹配字符的结果。
GET /你的业务索引名/_search { "query": { "bool": { "must": [ { "match": { "需要配置规则的目标字段名": { "query": "用户输入的查询内容", "fuzziness": "AUTO" } } } ], "filter": [ { "script": { "script": { "source": """ def q = params.query; def f = doc['需要配置规则的目标字段名.keyword'].value; if(f.length() <5 || q.length()<5) return false; int maxLen = 0; int[][] dp = new int[q.length()+1][f.length()+1]; for(int i=1;i<=q.length();i++){ for(int j=1;j<=f.length();j++){ if(q.charAt(i-1) == f.charAt(j-1)){ dp[i][j] = dp[i-1][j-1]+1; maxLen = Math.max(maxLen, dp[i][j]); } } } return maxLen >=5; """, "params": { "query": "用户输入的查询内容" } } } } ] } } }
注意:该方案用脚本实时计算最长公共子串,性能远低于N-gram方案,仅适合低并发、临时使用的场景。
内容的提问来源于stack exchange,提问作者mmmm
相关产品推荐
相关产品推荐

