基础语法

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

#在field1和field2中查询 test1和test2的内容
GET test_index/_search
{
  "query": {
    "multi_match": {
      "query": "test1 test2",
      "fields": ["field1","field2"]
    }
  }
}

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"
     }
  }
}
# 这种方式会将所有字段组合在一起作为一个大字段来用,在精确匹配时效果提升明显,命中商品数量比之前多

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

  • 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

  • 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 卡通))风格


作者:码到成功_易企秀
链接:https://www.jianshu.com/p/2a27b4985331
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐