美文网首页
ES multi_match 你真的懂了吗

ES multi_match 你真的懂了吗

作者: 郭彦超 | 来源:发表于2021-09-16 18:06 被阅读0次

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

基本语法

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

GET /_search
{
  "query": {
    "multi_match" : {
      "query":    "this is a test", 
      "fields": [ "title^2", "*_name" ] 
    }
  }
}
  • query
    来自用户输入的查询短语
  • fields
    数组,默认支持最大长度1024,可以单独为任意字段设置相关度权重,支持通配符;fields可以为空,为空时会取mapping阶段配置的所有支持term查询的filed组合在一起进行查询

其它参数

  • type
    定义内部查询方式和打分方式
说明
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"
     }
  }
}
# 这种方式会将所有字段组合在一起作为一个大字段来用,在精确匹配时效果提升明显,命中商品数量比之前多
  • tie_breaker
    取值范围0-1,当type使用默认值 best_fields ,tie_breaker将会改变默认_score计算方式,采用best_field_score + tie_breaker*other_field_score

  • analyzer
    用户搜索输入词采用哪种解析器进行分词,默认使用mapping阶段指定的分词器;如果analyzer设置和索引阶段的分词器不一致时,且operator为and 那么在执行查询时可能理应完全匹配的短语结果检索为空的情况。

  • fuzziness
    指定模糊程度,支持数字或auto

  • prefix_length
    当使用模糊查询时,用来指定前缀不变长度

  • lenient
    当查询报错时是否忽略该文档,默认为false

  • operator
    匹配关系的逻辑判断,默认为or,当为and时表示所有输入词必须完全匹配

  • minimum_should_match
    该参数生效的前提是operator为or,支持数字、百分比或者混合配置,如:

# 当词长度>3时可以有一个模糊,>6时允许两个,超过10个则模糊一半
"minimum_should_match": "3<-1 6<-2 10<50%" 
  • zero_terms_query
    当用户输入词全部为停用词时是否返回文档,默认为none即不返回数据,设置为all时,查询将被改写为match_all

  • auto_generate_synonyms_phrase_query
    是否开启同义词查询,默认为true

#如在analysis/synonym.txt中设置可爱同义词为粉色、卡通,可爱风格将会被改写为
(可爱 OR (粉色 AND 卡通))风格

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

相关文章

网友评论

      本文标题:ES multi_match 你真的懂了吗

      本文链接:https://www.haomeiwen.com/subject/cmsrgltx.html