Elasticsearch如何在同一查询中实现multi_match与articlecode精确匹配
Elasticsearch 同时支持商品编码精确匹配与名称模糊查询的实现方案
该需求可直接通过调整查询语句实现,无需大幅修改原有索引配置,仅需要提前保证articlecode字段配置了keyword类型的子字段用于精确匹配。
前提配置参考
如果还未给articlecode配置多字段类型,可参考以下Mapping调整:
{ "properties": { "articlecode": { "type": "text", // 保留用于编码的模糊匹配,不需要可删除 "fields": { "keyword": { "type": "keyword", "ignore_above": 256 } } }, "name": { "type": "text", "analyzer": "ngram_analyzer" // 保留你原有配置的ngram分词器 }, "IdLang": { "type": "text", "fields": { "keyword": { "type": "keyword" } } } } }
调整后的查询语句
{ "size": 10, "query": { "bool": { "filter": { "term": { "IdLang.keyword": "sv" } }, "should": [ // 第一部分:编码精确匹配,命中后优先级最高 { "term": { "articlecode.keyword": { "value": "v400", // 替换为实际搜索词 "boost": 1000 } } }, // 第二部分:模糊匹配,仅无精确匹配结果时生效 { "bool": { "must": [ { "multi_match": { "query": "v400", // 替换为实际搜索词 "fields": [ "articlecode^10", "name^7" ] } } ], "must_not": [ { "term": { "articlecode.keyword": "v400" // 替换为实际搜索词 } } ] } } ], "minimum_should_match": 1 } } }
逻辑说明
- 保留原有语言过滤规则,不影响搜索评分
should查询要求至少命中一个匹配块:- 精确匹配块命中时评分极高,会排在结果最前列
- 模糊匹配块增加了
must_not规则:只要搜索词和任意商品编码完全匹配,这部分的所有结果都会被过滤,实现搜索v400时仅返回精确匹配结果的需求
- 若没有商品编码和搜索词完全匹配,精确匹配块无命中,模糊匹配块的
must_not规则自动失效,返回所有名称、编码模糊匹配的结果,符合搜索400时返回两条结果的要求
内容的提问来源于stack exchange,提问作者F.Wigarde
相关产品推荐
相关产品推荐

