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 的作用如下:
- 先由 best_fields type 获得最佳匹配语句的评分
_score
; - 将其他匹配语句的评分结果与
tie_breaker
相乘; - 对以上评分求和并规范化。
- 先由 best_fields type 获得最佳匹配语句的评分
-
当 type 为 cross_fields 时,tie_breaker 的作用如下:
- 0.0,获取最佳字段的分数为最终分数,默认值;
- 1.0,将多个字段的分数合并;
- 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 类型的解释。 |