multi_match 查询
文章目录
- fields 和每个字段的增强
- multi_match 查询的类型
- best_fields
- most_fields
- phrase 和 phrase_prefix
- cross_fields
- cross_fields 和分析器
- tie_breaker
- bool_prefix
官方文档地址: Multi-match query
multi_match
查询建立在match
查询的基础上,允许多字段查询:
GET /_search
{"query": {"multi_match" : {"query": "this is a test", //查询字符串"fields": [ "subject", "message" ] //需要查询的字段}}
}
fields 和每个字段的增强
可以使用通配符指定字段,例如:
GET /_search
{"query": {"multi_match" : {"query": "Will Smith","fields": [ "title", "*_name" ] //查询title、first_name和last_name字段}}
}
单个字段可以通过插入符号(^
)来增强:
GET /_search
{"query": {"multi_match" : {"query" : "this is a test","fields" : [ "subject^3", "message" ] //该查询将subject字段的分数乘以3,但保持message字段的分数不变。}}
}
如果没有提供字段,multi_match
查询默认为index.query.default_field
索引设置,而后者默认为*
。*
提取 mapping 中符合术语查询条件的所有字段,并过滤元数据字段。然后将所有提取的字段组合起来构建一个查询。
警告:字段数量限制
默认情况下,查询可以包含的子句数量是有限制的。此限制由indices.query.bool.max_clause_count设置,默认为
1024
。对于combined_fields
查询,子句的数量计算为字段的数量乘以术语的数量。
multi_match 查询的类型
multi_match
查询在内部执行的方式取决于type
参数,可以将其设置为:
参数 | 描述 |
---|---|
best_fields
|
(默认的)查找匹配任何字段的文档,但使用来自最佳字段的_score 。
|
most_fields
|
查找匹配任何字段的文档,并结合每个字段的_score 。
|
cross_fields
|
使用同一个analyzer 处理字段,就像它们是一个大字段一样。查找任何字段中的每个单词。
|
phrase
|
在每个字段上运行match_phrase 查询,并使用来自最佳字段的_score 。
|
phrase_prefix
|
在每个字段上运行match_phrase_prefix 查询,并使用来自最佳字段的_score 。
|
bool_prefix
|
在每个字段上创建一个match_bool_prefix 查询,并组合每个字段的_score 。
|
best_fields
best_fields
类型在搜索多个在同一字段中最容易找到的单词时最有用。例如,单个字段中的“brown fox”要比一个字段中的“brown”和另一个字段中的“fox”更有意义。
best_fields
类型为每个字段生成一个match
查询,并将它们包装在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}}
}
通常情况下,best_fields
类型使用单个最佳匹配字段的得分,但如果指定了tie_breaker
,则它计算得分如下:
- 最佳匹配字段的得分。
- 对所有其他匹配字段加上
tie_breaker * _score
。
此外,接受analyzer
、boost
、operator
、minimum_should_match
、fuzziness
、lenient
、prefix_length
、max_expansions
、fuzzy_rewrite
、zero_terms_query
、cutoff_frequency
、auto_generate_synonyms_phrase_query
和fuzzy_transposition
,如 match 查询 中所解释的。
重要:
operator
和minimum_should_match
best_fields
和most_fields
类型是以字段为中心的—它们为每个字段生成match
查询。这意味着operator
和minimum_should_match
参数分别应用于每个字段,这可能不是您想要的。以这个查询为例:
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)
换句话说,为了让文档匹配,所有术语必须出现在单个字段中。
combined_fields 查询提供了一种以术语为中心的方法,它根据每个术语处理
operator
和minimum_should_match
。另一个多匹配模式cross_fields
也解决了这个问题。
most_fields
当查询以不同方式分析的包含相同文本的多个字段时,most_fields
类型最有用。例如,主字段可能包含同义词、词干和不带变音符号的术语。第二个字段可能包含原始术语,第三个字段可能包含 shingles。通过合并来自所有三个字段的分数,我们可以将尽可能多的文档与主字段匹配,但使用第二个和第三个字段将最相似的结果推到列表的顶部。
此查询:
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" }}]}}
}
每个match
子句的得分加在一起,然后除以match
子句的数量。
此外,接受analyzer
、boost
、operator
、minimum_should_match
、fuzziness
、lenient
、prefix_length
、max_expansions
、fuzzy_rewrite
、zero_terms_query
和cutoff_frequency
,如 match 查询 中所解释的。
phrase 和 phrase_prefix
phrase
和phrase_prefix
类型的行为类似于best_fields
,但它们使用match_phrase
或match_phrase_prefix
查询而不是match
查询。
此查询:
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" }}]}}
}
此外,接受analyzer
、boost
、lenient
和zero_terms_query
,如 match 查询 中所解释的。以及在 match_phrase 查询 中所解释的slop
参数。类型phrase_prefix
另外接受max_expansions
。
重要:phrase,phrase_prefix 和 fuzziness
fuzziness
参数不能与phrase
或phrase_prefix
类型一起使用。
cross_fields
cross_fields
类型对于多个字段应该匹配的结构化文档特别有用。例如,当在first_name
和last_name
字段查询“Will Smith”时,最佳匹配可能是一个字段中有“Will”,另一个字段中有“Smith”。
这听起来像是
most_fields
的工作,但这种方法有两个问题。第一个问题是,operator
和minimum_should_match
是针对每个字段应用的,而不是针对每个 term (参见上面的解释)。第二个问题与相关性有关:
first_name
和last_name
字段中的不同术语频率可能会产生意想不到的结果。例如,假设我们有两个人:“Will Smith”和“Smith Jones”。“Smith”作为姓很常见(所以不太重要),但“Smith”作为名很不常见(所以很重要)。
如果我们搜索“Will Smith”,“Smith Jones”文档可能会出现在更匹配的“Will Smith”上面,因为
first_name: smith
的得分超过了first_name: will
加last_name: smith
的得分之和。
处理这类查询的一种方法是简单地将first_name
和last_name
字段索引为一个full_name
字段。当然,这只能在索引时间完成。
cross_field
类型试图在查询时采用以术语为中心的方法来解决这些问题。它首先将查询字符串分析为单个的项,然后在任意字段中查找每个项,就像它们是一个大字段一样。
查询:
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)
换句话说,所有术语必须出现在至少一个字段中,文档才能匹配。(将其与best_fields
和most_fields
的逻辑进行比较。)
这解决了两个问题中的一个。该方法通过对各场的项频进行混合,以消除项频差,从而解决了项频差的问题。
在实践中,first_name:smith
将被视为与last_name:smith
(加1
)具有相同的频率。这将使first_name
和last_name
的匹配具有可比较的分数,而last_name
的优势很小,因为它是最有可能包含smith
的字段。
注意,cross_fields
通常只对boost
为1
的短字符串字段有用。除此之外,术语频率和长度标准化也会对分数产生影响,从而导致术语统计数据的混合不再有意义。
如果你通过 Validate 运行上面的查询,它会返回如下解释:
+blended("will", fields: [first_name, last_name])
+blended("smith", fields: [first_name, last_name])
此外,接受analyzer
、boost
、operator
、minimum_should_match
、lenient
、zero_terms_query
和cutoff_frequency
,如 match 查询 中解释的那样。
警告
cross_fields
类型混合了字段统计信息,但并不总是生成格式良好的分数(例如分数可以变成负数)。作为一种替代方法,您可以考虑使用combined_fields
查询,它也是以术语为中心的,但以一种更健壮的方式组合字段统计信息。
cross_fields 和分析器
cross_fields
类型只能在具有相同分析器的字段上以术语为中心模式工作。与上面的示例一样,使用同一个分析器的字段被分组在一起。如果有多个组,查询将使用任何组中的最佳分数。
例如,如果我们有一个first
和last
字段,它们有相同的分析器,加上一个first.edge
和last.edge
都使用了edge_ngram
分析器,查询如下:
GET /_search
{"query": {"multi_match" : {"query": "Jon","type": "cross_fields","fields": ["first", "first.edge","last", "last.edge"]}}
}
将以下列方式执行:
blended("jon", fields: [first, last])
| (blended("j", fields: [first.edge, last.edge])blended("jo", fields: [first.edge, last.edge])blended("jon", fields: [first.edge, last.edge])
)
换句话说,first
和last
将被组合在一起,并作为单个字段处理。first.edge
和last.edge
将被组合在一起,并作为单个字段处理。
拥有多个组很好,但是当与operator
或minimum_should_match
组合时,它可能会遇到与most_fields
或best_fields
相同的问题。
您可以很容易地自己将这个查询重写为两个独立的cross_fields
查询结合dis_max
查询,并仅对其中一个应用minimum_should_match
参数:
GET /_search
{"query": {"dis_max": {"queries": [{"multi_match" : {"query": "Will Smith","type": "cross_fields","fields": [ "first", "last" ],"minimum_should_match": "50%" //will或smith必须出现在first或last字段中}},{"multi_match" : {"query": "Will Smith","type": "cross_fields","fields": [ "*.edge" ]}}]}}
}
通过在查询中指定analyzer
参数,可以将所有字段强制放入同一组。
GET /_search
{"query": {"multi_match" : {"query": "Jon","type": "cross_fields","analyzer": "standard", //所有字段使用standard分析器。"fields": [ "first", "last", "*.edge" ]}}
}
tie_breaker
默认情况下,每个词blended
查询将使用组中任何字段返回的最佳分数。然后,在组合不同组的分数时,查询使用任何组的最佳分数。tie_breaker
参数可以改变这两个步骤的行为:
值 | |
---|---|
0.0
|
例如从first_name:will 和last_name:will 中取一个最好的分数(默认的)
|
1.0
|
例如将first_name:will 和last_name:will 的得分相加
|
0.0 < n < 1.0
|
取一个最好的分数加上tie_breaker 乘以来自其他匹配字段 / 组的每个分数
|
重要:cross_fields 和 fuzziness
fuzziness
参数不能与cross_fields
类型一起使用。
bool_prefix
bool_prefix
类型的评分行为类似于most_fields
,但使用的是match_bool_prefix
查询而不是match
查询。
GET /_search
{"query": {"multi_match" : {"query": "quick brown f","type": "bool_prefix","fields": [ "subject", "message" ]}}
}
支持match
查询中解释的analyzer
、boost
、operator
、minimum_should_match
、lenient
、zero_terms_query
和auto_generate_synonyms_phrase_query
参数。用于构造词汇查询的词汇支持fuzziness
、prefix_length
、max_expansions
、fuzzy_rewrite
和fuzzy_transpositions
参数,但对从最后一个词汇构造的前缀查询没有影响。
这种查询类型不支持slop
和cutoff_frequency
参数。
multi_match 查询相关推荐
- [Elasticsearch2.x] 多字段搜索 (三) - multi_match查询和多数字段 译
multi_match查询 multi_match查询提供了一个简便的方法用来对多个字段执行相同的查询. NOTE 存在几种类型的multi_match查询,其中的3种正好和在"了解你的数据 ...
- 06.full_text multi_match查询
文章目录 1. multi_match 简介 2. multi_match 查询类型 1. best_fields 2. most_fields 3. phrase和phrase_prefix 4. ...
- multi_match 查询【muti_match和match区别】
2019独角兽企业重金招聘Python工程师标准>>> ======================================[建议]:类型most_fields与多个matc ...
- Elasticsearch多字段搜索 - multi_match查询和多数字段-----multi_match查询
multi_match查询提供了一个简便的方法用来对多个字段执行相同的查询. best_fields,most_fields以及cross_fields. 默认情况下,该查询以best_fields类 ...
- elasticsearch优化之多字段搜索multi_match查询
1 首先说下multi_match多字段匹配的三种类型,分别是best_fields(最佳字段) . most_fields(多数字段) 和 cross_fields(跨字段) 2 best_fiel ...
- es java match_ES multi_match 和match查询
multi_match查询默认为best_fields类型,更适合变形的查询句子. multi_match的most_fields类型查询 { "query": { "m ...
- Elasticsearch:Multi-match (multi_match) 及 Disjunction max 查询
多重匹配(multi_match)查询,顾名思义就是跨多个字段搜索查询. 例如,如果我们想在 title.synopsis 和 tags 三个字段中搜索 Java 一词,那么 multi_match ...
- elasticsearh中查询类型,term、match、match_all、multi_match、range、bool、boosting等
查询方式有如下几种: GET /<index>/_search GET /_search POST /<index>/_search POST /_search 一般分为如下几 ...
- elasticsearch查询
1.查询方式 有两种查询方式,一种是通过在url中指定查询条件 ,另外一种是通过DSL查询.都是使用GET方法 1.1 分页查询 from 指定从文档的什么位置开始,默认值0 size 指定一次查询返 ...
最新文章
- Spring 自定义注解使用案例 首先创建一个注解@interface
- 《数据库原理与应用》(第三版)第12章 函数和游标 基础 习题参考答案
- 【牛客 - 272B】Xor Path(树上操作,路径异或值)
- 那些中国式家庭的小烦恼,我看用AI来解决就“都挺好” | 技术头条
- 比亚迪后续车都会搭在鸿蒙系统吗_华为鸿蒙系统上车,比亚迪汉发布!我告诉你华为鸿蒙到底是什么...
- Android 系统(178)---Android N to O升级准则
- JavaScript学习(二十)—DOM中常用的属性
- P5154 数列游戏(区间dp)
- (深度剖析结构)模块化解释矢量控制
- 解决通过雪花算法生成的id前端接受数据精度丢失问题
- 仿班级聊天室(DOM原型法)并且用localStorage存储消息记录
- 火狐浏览器怎么设置打开书签的时候在新标签页打开
- Placement Rules 使用文档
- kubernets eviction策略
- codeforces 869c(组合数)
- 【方法】STM32F103C8单片机通过定时器DMA测量脉冲宽度,无需CPU干预(以DHT11传感器为例)
- JS实现常见文件类型的下载/保存
- (ICCV-2017)使用伪 3D 残差网络学习时空表示
- 图像到图像的映射(实验三)
- java毕业设计——基于java+SSM+Oracle的微博系统设计与实现(毕业论文+程序源码)——微博系统
热门文章
- 1183 反正切函数的应用
- Precise Detection in Densely Packed Scenes论文详解
- AD域禁止运行指定软件
- C++编程,输入密码时显示*号
- 音乐网站设计(从设计到结束)
- 干了一年半, 我还是离开了区块链, 这5点是我学到的
- linux下传输ts流,FFmpeg安装(Linux)以及MP4转码为ts和m3u8
- 7-6 日K蜡烛图 (15 分)
- java画股票k线图(蜡烛图)最全方法总结
- w3school css6,w3School jquery学习 选择器