ES multi_match 你真的懂了吗

2021-09-16  本文已影响0人  郭彦超

ES的核心就是全文检索,在实际业务中全文检索用到最多的查询方式就是multi_match语法,该语法参数比较多,用的不好不但效果出不来而且还会影响性能,故这里对 multi_match 使用做下参数详解

基本语法

multi_match 顾名思义就是提供在多个字段上查询的意思,基本语法:

GET /_search
{
  "query": {
    "multi_match" : {
      "query":    "this is a test", 
      "fields": [ "title^2", "*_name" ] 
    }
  }
}

其它参数

说明
best_fields 按照match检索,所有字段单独计算得分并取最高分的field为最终_score,虽然是默认值,但不建议使用,数据量上来后查询性能会下降
most_fields 按照match检索,融合所有field得分为最终_score
cross_fields 将fields中的所有字段融合成一个大字段进行match检索,此时要求所有字段使用相同分析器
phrase 按照match_phrase检索,默认slop为0,执行短语精确匹配,所以即便设置 minimum_should_match 也无效; 取最高字段得分
phrase_prefix 按照match_phrase_prefix检索,滑动步长slop默认为0;取最高字段得分
bool_prefix 按照match_bool_prefix检索

需要注意的是当best_fields、most_fields与operator 或 minimum_should_match 参数连用时会要求用户输入词必须在任意单一字段上完全满足的文档才会出现,如

GET /_search
{
  "_source": ["title","desc"], 
  "query": {
     "multi_match": {
       "query": "高端婚礼邀请函",
       "fields": ["title","desc"],
       "operator": "and"
     }
  }
}

其匹配逻辑为:
(title:高端 + title:婚礼 + title:邀请函) || (desc:高端 + desc:婚礼 + desc:邀请函)
可调整为如下方式,提升命中效果:

{
  "_source": ["title","desc"], 
  "query": {
     "multi_match": {
       "query": "高端婚礼邀请函",
       "fields": ["title","desc"],
       "operator": "and",
       "type": "cross_fields"
     }
  }
}
# 这种方式会将所有字段组合在一起作为一个大字段来用,在精确匹配时效果提升明显,命中商品数量比之前多
# 当词长度>3时可以有一个模糊,>6时允许两个,超过10个则模糊一半
"minimum_should_match": "3<-1 6<-2 10<50%" 
#如在analysis/synonym.txt中设置可爱同义词为粉色、卡通,可爱风格将会被改写为
(可爱 OR (粉色 AND 卡通))风格

关于同义词的详细用法请参看我的另一篇文章ES同义词配置

上一篇 下一篇

猜你喜欢

热点阅读