文章目录

  • 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

此外,接受analyzerboostoperatorminimum_should_matchfuzzinesslenientprefix_lengthmax_expansionsfuzzy_rewritezero_terms_querycutoff_frequencyauto_generate_synonyms_phrase_queryfuzzy_transposition,如 match 查询 中所解释的。

重要:operatorminimum_should_match

best_fieldsmost_fields类型是以字段为中心的—它们为每个字段生成match查询。这意味着operatorminimum_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 查询提供了一种以术语为中心的方法,它根据每个术语处理operatorminimum_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子句的数量。

此外,接受analyzerboostoperatorminimum_should_matchfuzzinesslenientprefix_lengthmax_expansionsfuzzy_rewritezero_terms_querycutoff_frequency,如 match 查询 中所解释的。

phrase 和 phrase_prefix

phrasephrase_prefix类型的行为类似于best_fields,但它们使用match_phrasematch_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" }}]}}
}

此外,接受analyzerboostlenientzero_terms_query,如 match 查询 中所解释的。以及在 match_phrase 查询 中所解释的slop参数。类型phrase_prefix另外接受max_expansions

重要:phrase,phrase_prefix 和 fuzziness

fuzziness参数不能与phrasephrase_prefix类型一起使用。

cross_fields

cross_fields类型对于多个字段应该匹配的结构化文档特别有用。例如,当在first_namelast_name字段查询“Will Smith”时,最佳匹配可能是一个字段中有“Will”,另一个字段中有“Smith”。

这听起来像是most_fields的工作,但这种方法有两个问题。第一个问题是,operatorminimum_should_match是针对每个字段应用的,而不是针对每个 term (参见上面的解释)。

第二个问题与相关性有关:first_namelast_name字段中的不同术语频率可能会产生意想不到的结果。

例如,假设我们有两个人:“Will Smith”和“Smith Jones”。“Smith”作为姓很常见(所以不太重要),但“Smith”作为名很不常见(所以很重要)。

如果我们搜索“Will Smith”,“Smith Jones”文档可能会出现在更匹配的“Will Smith”上面,因为first_name: smith的得分超过了first_name: willlast_name: smith的得分之和。

处理这类查询的一种方法是简单地将first_namelast_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_fieldsmost_fields的逻辑进行比较。)

这解决了两个问题中的一个。该方法通过对各场的项频进行混合,以消除项频差,从而解决了项频差的问题。

在实践中,first_name:smith将被视为与last_name:smith(加1)具有相同的频率。这将使first_namelast_name的匹配具有可比较的分数,而last_name的优势很小,因为它是最有可能包含smith的字段。

注意,cross_fields通常只对boost1的短字符串字段有用。除此之外,术语频率和长度标准化也会对分数产生影响,从而导致术语统计数据的混合不再有意义。

如果你通过 Validate 运行上面的查询,它会返回如下解释:

+blended("will",  fields: [first_name, last_name])
+blended("smith", fields: [first_name, last_name])

此外,接受analyzerboostoperatorminimum_should_matchlenientzero_terms_querycutoff_frequency,如 match 查询 中解释的那样。

警告

cross_fields类型混合了字段统计信息,但并不总是生成格式良好的分数(例如分数可以变成负数)。作为一种替代方法,您可以考虑使用combined_fields查询,它也是以术语为中心的,但以一种更健壮的方式组合字段统计信息。

cross_fields 和分析器

cross_fields类型只能在具有相同分析器的字段上以术语为中心模式工作。与上面的示例一样,使用同一个分析器的字段被分组在一起。如果有多个组,查询将使用任何组中的最佳分数。

例如,如果我们有一个firstlast字段,它们有相同的分析器,加上一个first.edgelast.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])
)

换句话说,firstlast将被组合在一起,并作为单个字段处理。first.edgelast.edge将被组合在一起,并作为单个字段处理。

拥有多个组很好,但是当与operatorminimum_should_match组合时,它可能会遇到与most_fieldsbest_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:willlast_name:will中取一个最好的分数(默认的)
1.0 例如将first_name:willlast_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查询中解释的analyzerboostoperatorminimum_should_matchlenientzero_terms_queryauto_generate_synonyms_phrase_query参数。用于构造词汇查询的词汇支持fuzzinessprefix_lengthmax_expansionsfuzzy_rewritefuzzy_transpositions参数,但对从最后一个词汇构造的前缀查询没有影响。

这种查询类型不支持slopcutoff_frequency参数。

multi_match 查询相关推荐

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

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

  2. 06.full_text multi_match查询

    文章目录 1. multi_match 简介 2. multi_match 查询类型 1. best_fields 2. most_fields 3. phrase和phrase_prefix 4. ...

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

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

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

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

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

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

  6. es java match_ES multi_match 和match查询

    multi_match查询默认为best_fields类型,更适合变形的查询句子. multi_match的most_fields类型查询 { "query": { "m ...

  7. Elasticsearch:Multi-match (multi_match) 及 Disjunction max 查询

    多重匹配(multi_match)查询,顾名思义就是跨多个字段搜索查询. 例如,如果我们想在 title.synopsis 和 tags 三个字段中搜索 Java 一词,那么 multi_match ...

  8. elasticsearh中查询类型,term、match、match_all、multi_match、range、bool、boosting等

    查询方式有如下几种: GET /<index>/_search GET /_search POST /<index>/_search POST /_search 一般分为如下几 ...

  9. elasticsearch查询

    1.查询方式 有两种查询方式,一种是通过在url中指定查询条件 ,另外一种是通过DSL查询.都是使用GET方法 1.1 分页查询 from 指定从文档的什么位置开始,默认值0 size 指定一次查询返 ...

最新文章

  1. Spring 自定义注解使用案例 首先创建一个注解@interface
  2. 《数据库原理与应用》(第三版)第12章 函数和游标 基础 习题参考答案
  3. 【牛客 - 272B】Xor Path(树上操作,路径异或值)
  4. 那些中国式家庭的小烦恼,我看用AI来解决就“都挺好” | 技术头条
  5. 比亚迪后续车都会搭在鸿蒙系统吗_华为鸿蒙系统上车,比亚迪汉发布!我告诉你华为鸿蒙到底是什么...
  6. Android 系统(178)---Android N to O升级准则
  7. JavaScript学习(二十)—DOM中常用的属性
  8. P5154 数列游戏(区间dp)
  9. (深度剖析结构)模块化解释矢量控制
  10. 解决通过雪花算法生成的id前端接受数据精度丢失问题
  11. 仿班级聊天室(DOM原型法)并且用localStorage存储消息记录
  12. 火狐浏览器怎么设置打开书签的时候在新标签页打开
  13. Placement Rules 使用文档
  14. kubernets eviction策略
  15. codeforces 869c(组合数)
  16. 【方法】STM32F103C8单片机通过定时器DMA测量脉冲宽度,无需CPU干预(以DHT11传感器为例)
  17. JS实现常见文件类型的下载/保存
  18. (ICCV-2017)使用伪 3D 残差网络学习时空表示
  19. 图像到图像的映射(实验三)
  20. java毕业设计——基于java+SSM+Oracle的微博系统设计与实现(毕业论文+程序源码)——微博系统

热门文章

  1. 1183 反正切函数的应用
  2. Precise Detection in Densely Packed Scenes论文详解
  3. AD域禁止运行指定软件
  4. C++编程,输入密码时显示*号
  5. 音乐网站设计(从设计到结束)
  6. 干了一年半, 我还是离开了区块链, 这5点是我学到的
  7. linux下传输ts流,FFmpeg安装(Linux)以及MP4转码为ts和m3u8
  8. 7-6 日K蜡烛图 (15 分)
  9. java画股票k线图(蜡烛图)最全方法总结
  10. w3school css6,w3School jquery学习 选择器