文章目录

  • 1. multi_match 简介
  • 2. multi_match 查询类型
    • 1. best_fields
    • 2. most_fields
    • 3. phrase和phrase_prefix
    • 4. cross_fields
    • 5. bool_prefix

1. multi_match 简介

这个multi_match实际上算是类似一个组合查询,他把dis_max query, phrase query, phrase_prefix,bool_prefix等给打包到一起了,使用的时候按照需要选用就可以了,这样的话就更加简单易用了。
但是在使用的时候又不想纯粹的只做组合的query(bool query,dis_max query等),哪些只做组合的query没有自己的查询语法,只是组合别的查询query,multi_match有自己的查询语法,是对多个查询类型的封装,暴露给外面的是一个新的api,不是bool那种还是使用子query的查询方式。而且他允许多字段查询。

一个简单的样例

GET /_search
{"query": {"multi_match" : {"query":    "this is a test", "fields": [ "subject", "message" ] }}
}GET /_search
{"query": {"multi_match" : {"query":    "Will Smith","fields": [ "title", "*_name" ]  #filed 的name可以使用通配符}}
}GET /_search
{"query": {"multi_match" : {"query" : "this is a test","fields" : [ "subject^3", "message" ]  # subject会被提升权重}}
}

field的数量不能超过1024

2. multi_match 查询类型

multi_match 是如何支持dis_max,phrase,phrase_prefix等等查询的呢,在这里引入了一个参数叫 type,type的取值如下

best_fields:(默认)查找与任何字段匹配的文档,但使用最佳字段中的_score。请参阅best_fields。

most_fields: 查找与任何字段匹配的文档,并组合每个字段的_score。请参阅most_fields。

cross_fields: 使用相同的分析器将多个字段内容视为一个大字段。在大字段中查找每个单词。参见cross_fields。

phrase: 在每个字段上运行match_phrase查询,并使用最佳字段中的_score。参见词组和词组前缀。

phrase_prefix: 在每个字段上运行match_phrase_prefix查询,并使用最佳字段中的_score。参见词组和词组前缀。

bool_prefix: 在每个字段上创建一个match_bool_prefix查询,并组合每个字段中的_score。请参阅bool_prefix。

1. best_fields

当您在同一字段中search多个单词时,best_fields类型最有用。例如,搜索“brown fox”的时候,单个字段中的“brown fox”比一个字段中的“brown”和另一字段中的“ fox”更有意义。

best_fields类型为每个字段生成一个匹配查询,并将它们包装在dis_max查询中,以查找单个最佳匹配字段。例如,此查询:

GET /_search
{"query": {"multi_match" : {"query":      "brown fox","type":       "best_fields","fields":     [ "subject", "message" ],"tie_breaker": 0.3}}
}
GET /_search
{"query": {"dis_max": {"queries": [{ "match": { "subject": "brown fox" }},{ "match": { "message": "brown fox" }}],"tie_breaker": 0.3}}
}

其中的tie_breaker和dis_max的查询是一样的含义

因为best_fields and most_fields 的multi_match是以field为中心进行查询的,所以operator和minimum_should_match参数会单独的对每个field起作用

GET /_search
{"query": {"multi_match" : {"query":      "Will Smith","type":       "best_fields","fields":     [ "first_name", "last_name" ],"operator":   "and" }}
}

这个对应的语义是

(+first_name:will +first_name:smith) | (+last_name:will  +last_name:smith)

2. most_fields

当多个field对相同内容采用不用的analyze进行存储,如果想对这多个字段进行搜索从而获得更加准确的结果的话,使用most_fields更加合适。比如,main field可能包含synonums,stemming , terms without diacritic(变音符),
second field 包含了原有的terms, third field 包含了shingles。这样的话就可以使用三个field的score来计算final score进而得到更好的排序效果。

GET /_search
{"query": {"multi_match" : {"query":      "quick brown fox","type":       "most_fields","fields":     [ "title", "title.original", "title.shingles" ]}}
}
GET /_search
{"query": {"bool": {"should": [{ "match": { "title":          "quick brown fox" }},{ "match": { "title.original": "quick brown fox" }},{ "match": { "title.shingles": "quick brown fox" }}]}}
}

3. phrase和phrase_prefix

phrase_prefix 和phrase和 best_fields类似
也可以使用tie_breaker参数,同时还可以使用boost,lenient,slop等在match_phase中使用的参数

GET /_search
{"query": {"multi_match" : {"query":      "quick brown f","type":       "phrase_prefix","fields":     [ "subject", "message" ]}}
}

等同于

GET /_search
{"query": {"dis_max": {"queries": [{ "match_phrase_prefix": { "subject": "quick brown f" }},{ "match_phrase_prefix": { "message": "quick brown f" }}]}}
}

4. cross_fields

cross_fields类型对于结构化文档(其中多个字段应匹配)特别有用。例如,当在first_name和last_name字段中查询“ Will Smith”时,最匹配的一个字段中可能有“ Will”,而另一个字段中有“ Smith”。

GET /_search
{"query": {"multi_match" : {"query":      "Will Smith","type":       "cross_fields","fields":     [ "first_name", "last_name" ],"operator":   "and"}}
}

执行的逻辑是

+(first_name:will  last_name:will)
+(first_name:smith last_name:smith)

5. bool_prefix

GET /_search
{"query": {"multi_match" : {"query":      "quick brown f","type":       "bool_prefix","fields":     [ "subject", "message" ]}}
}

06.full_text multi_match查询相关推荐

  1. [Elasticsearch2.x] 多字段搜索 (三) - multi_match查询和多数字段 译

    multi_match查询 multi_match查询提供了一个简便的方法用来对多个字段执行相同的查询. NOTE 存在几种类型的multi_match查询,其中的3种正好和在"了解你的数据 ...

  2. multi_match 查询【muti_match和match区别】

    2019独角兽企业重金招聘Python工程师标准>>> ======================================[建议]:类型most_fields与多个matc ...

  3. multi_match 查询

    文章目录 fields 和每个字段的增强 multi_match 查询的类型 best_fields most_fields phrase 和 phrase_prefix cross_fields c ...

  4. Elasticsearch多字段搜索 - multi_match查询和多数字段-----multi_match查询

    multi_match查询提供了一个简便的方法用来对多个字段执行相同的查询. best_fields,most_fields以及cross_fields. 默认情况下,该查询以best_fields类 ...

  5. 03.full_text interval查询

    文章目录 1. intervals query 简介 2. 样例 3. match 4. all_of 5. any_of 6. filter full text查询就是基于分词的查询,有很多分类 i ...

  6. elasticsearch优化之多字段搜索multi_match查询

    1 首先说下multi_match多字段匹配的三种类型,分别是best_fields(最佳字段) . most_fields(多数字段) 和 cross_fields(跨字段) 2 best_fiel ...

  7. 04.full_text match查询

    文章目录 1. match query 简介 2. 简写方式 3. 查询工作原理 4. match查询中的fuzzniess 1. Levenshtein Edit Distance 2. fuzzi ...

  8. 06 MySQL数据库--查询语句学习笔记

    整理各种查询语句,需要查询数据请参考: https://blog.csdn.net/chennuan1991/article/details/105240457 基础查询语句,请参考: https:/ ...

  9. ElasticSearch查询 基础篇

    1. 查询表达式 查询表达式(Query DSL)是一种非常灵活又富有表现力的 查询语言. Elasticsearch 使用它可以以简单的 JSON 接口来展现 Lucene 功能的绝大部分.在你的应 ...

最新文章

  1. 用按键精灵自动消除行号失败记
  2. QML做类似Android圆形头像
  3. 心脏与阴影,求阴影部分
  4. 【BZOJ1434】【codevs2348】染色游戏,博弈
  5. 记一次Spring Batch完整入门实践
  6. Microsoft Data Access Components(MDAC) 结构以及一些连接SQL数据库的架构基础
  7. EasyUI的databox取值
  8. 168.Excel Sheet Column Title
  9. c++的vector初始化
  10. 各种计算机控制系统特点小结
  11. centos 7 iso u盘安装_树莓派Raspberry Pi 4B安装VMware ESXi
  12. Python网抓 2021年 获取全部沪深港股ETF股票信息 东方财富
  13. 天天背单词--的设计与实现(四)
  14. 计算机是好是坏英语作文,电脑游戏是好还是坏英语作文
  15. 用I2C级联扩展器做一个时钟盒子
  16. ANSYS APDL
  17. 在Windows上挂载磁盘为非445端口的SAMBA服务(原创)
  18. 2021蓝桥杯省赛b题解
  19. python爬虫爬取《斗破苍穹》小说全文
  20. mybatis-plus字典回写工具包

热门文章

  1. 科普:CPU缓存一致性协议
  2. TOP级CG行业云渲染服务的演进之路
  3. 复杂网络下多码率视频流切换关键技术
  4. LeetCode——DFS
  5. GitHub超实用操作
  6. linux之autoconf/automake
  7. storage.googleapis.com 访问与下载慢
  8. hiredis使用,封装代码示例
  9. leetcode 794. Valid Tic-Tac-Toe State | 794. 有效的井字游戏(Java)
  10. leetcode 384. Shuffle an Array | 384. 打乱数组(Fisher-Yates洗牌算法)