Elasticsearch 基础教程

Elasticsearch 高级教程

Elasticsearch 插件

Elasticsearch 笔记

elasticsearch multi_match 查询

Elasticsearch(es) 查询语句语法详解 Elasticsearch(es) 查询语句语法详解


elasticsearch 的 multi_match 查询为能在多个字段上反复执行相同查询提供了一种便捷方式,是基于 match 查询用于搜索多个字段。

查询语法结构

GET /_search
{
  "query": {
    "multi_match": {
      "query" : "query string", 
      "fields" : [ "title", "summary" ],
      "type" : "best_fields",
      "tie_breaker" : 0.0
    }
  }
}

参数

multi_match 查询除了 query 等公共参数外,还有 type、tie_breaker 等独有的参数。

query

需要查询的查询文本字符串形式。

fields

查询文本需要匹配的字段,除了指定查询的字段外,也支持通配符形式指定字段权重

通配符形式的字段指定示例如下:

GET /_search
{
  "query": {
    "multi_match": {
      "query": "Will Smith",
      "fields": [ "title", "*_name" ] 
    }
  }
}

假若查询的问题中,存在 title、first_name 和 last_name 字段,上述 query 语句会匹配作用与上述三个字段。

在查询字段后使用 ^ 符号可以提高字段的权重,在字段名称的末尾添加 ^boost,其中 boost 是一个浮点数,示例如下:

GET /_search
{
  "query": {
    "multi_match": {
      "query": "this is a test",
      "fields": [ "subject^3", "message" ] 
    }
  }
}

上述例子表明 subject 字段的重要性是 message 字段的 3 倍。

如果未指定 fields 字段,则 multi_match 查询默认为 index.query.default_field 索引设置,而索引设置依次为 ** 提取映射中符合词条查询条件的所有字段,并过滤元数据字段。然后将所有提取的字段组合起来以构建查询。

一次查询字段数存在上限,它由 indices.query.bool.max_clause_count 搜索设置定义,默认为 1024。

type

multi_match 通过参数 type 来指定查询类型,type 参数可以设置如下类型:

类型值 描述
best_fields 默认,查询与任何字段匹配的文档,但是使用匹配的最佳字段对应的 _score
most_fields 查询与任何字段匹配的文档,并将所有匹配字段的 _score 进行合并。
cross_fields 把要匹配的所有字段当成一个大字段。首先分析查询字符串并生成一个词列表,然后从所有字段中依次搜索每个词,只要查询到,就算匹配上。
phrase 在每个要匹配的字段上运行 match_phrase 查询,并使用匹配的最佳字段对应的 _score
phrase_prefix 在每个要匹配的字段上运行 match_phrase_prefix 查询,并使用匹配的最佳字段对应的 _score
bool_prefix 在每个要匹配的字段上运行 match_bool_prefix 查询,并将所有匹配字段的 _score 进行合并。

tie_breaker

tie_breaker 参数可以理解为每个字段对应的可控制的权重系数,它是为了维护其他字段的权利而生的,先了解下它的评分方式:

  • 当 type 为 best_fields 时,tie_breaker 的作用如下:

    1. 先由 best_fields type 获得最佳匹配语句的评分 _score
    2. 将其他匹配语句的评分结果与 tie_breaker 相乘;
    3. 对以上评分求和并规范化。
  • 当 type 为 cross_fields 时,tie_breaker 的作用如下:

    1. 0.0,获取最佳字段的分数为最终分数,默认值;
    2. 1.0,将多个字段的分数合并;
    3. 0.0 < n < 1.0,最佳字段评分与其它字段结合评分。
  • 当 type 为 most_fields 时,tie_breaker 为 1.0。

minimum_should_match

multi_match 查询的实质上是通过 query 词进行分词后,分解成了多个 term 查询子句;minimum_should_match 参数顾名思义就是这些多个 term 查询子句匹配的最少个数,具体数据形式如下:

类型 示例 描述
Integer 3 指定一个最少匹配的固定值。
Negative integer -2 可缺少的匹配子句个数,即最少匹配的个数为子句的个数减去配置的值(绝对值)。
Percentage 75% 设置一个百分比,即最少匹配的个数为子句的个数的百分比,然后向下取整
Negative percentage -25% 可缺少的子句个数的百分比,即最少匹配的个数为当前总个数减去个数的百分比得出的值(这个百分比也要向下取整)。
Combination 3<90% 前面一个参数表示条件,后跟小于号,后面表示非前面的条件时的最小匹配条件;以示例解释如下,当子句个数小于等于 3 时,需要全部匹配,若子句大于 3 时,需要最少匹配 90%,如上 Percentage 类型的解释。 
Multiple combinations 2<-25% 9<-3 多种组合的设置,用空格分隔;单个组合设置,参照如上 Combination 类型的解释。