Elasticsearch 7查询如何配置以匹配完整词与部分词?
Elasticsearch 7 查询配置解决方法
问题根源:你当前的配置仅处理字符级模糊匹配(比如
sea和tea的编辑距离匹配),但seaside是包含sea的更长词汇,默认分词后两者是独立词条,模糊匹配不会关联这类子串场景。方案1:用bool查询结合多条件,同时覆盖模糊匹配和子串匹配
示例查询:{ "query": { "bool": { "must": [ { "match": { "name": "something" } }, { "bool": { "should": [ { "match": { "name": { "query": "sea", "fuzziness": "auto" } } }, { "wildcard": { "name": "*sea*" } } ], "minimum_should_match": 1 } } ] } } }说明:
mustclause先确保something精准匹配,子bool的shouldclause同时覆盖两种场景——模糊匹配sea(命中tea这类变体)、通配符匹配包含sea的词汇(命中seaside),只要满足其中一个should条件即可。方案2:配置ngram分词器,从底层支持子串匹配
如果这类子串查询是高频场景,建议给name字段配置ngram分词器,提前将词汇拆分为子词条:- 创建索引时的配置:
{ "settings": { "analysis": { "analyzer": { "ngram_analyzer": { "tokenizer": "ngram_tokenizer" } }, "tokenizer": { "ngram_tokenizer": { "type": "ngram", "min_gram": 2, "max_gram": 3 } } } }, "mappings": { "properties": { "name": { "type": "text", "analyzer": "ngram_analyzer", "search_analyzer": "standard" } } } }- 配置完成后,原有的
multi_match+模糊查询即可命中seaside——因为ngram会把seaside拆分为sea、eas、asi等子词条,搜索sea时自然能匹配到。
注意事项:以
*开头的通配符查询性能较差,数据量大时优先选择ngram分词方案;另外你设置的90%匹配度(minimum_should_match)如果是全局配置,可能会过滤掉仅满足单个should条件的结果,建议放到子boolclause中单独设置。
内容的提问来源于stack exchange,提问作者Stratocaster
相关产品推荐
相关产品推荐

