匹配查询

编辑

返回与提供的文本、数字、日期或布尔值匹配的文档。提供的文本在匹配之前会进行分析。

match 查询是执行全文搜索的标准查询,包括模糊匹配选项。

示例请求

编辑
resp = client.search(
    query={
        "match": {
            "message": {
                "query": "this is a test"
            }
        }
    },
)
print(resp)
response = client.search(
  body: {
    query: {
      match: {
        message: {
          query: 'this is a test'
        }
      }
    }
  }
)
puts response
res, err := es.Search(
	es.Search.WithBody(strings.NewReader(`{
	  "query": {
	    "match": {
	      "message": {
	        "query": "this is a test"
	      }
	    }
	  }
	}`)),
	es.Search.WithPretty(),
)
fmt.Println(res, err)
const response = await client.search({
  query: {
    match: {
      message: {
        query: "this is a test",
      },
    },
  },
});
console.log(response);
GET /_search
{
  "query": {
    "match": {
      "message": {
        "query": "this is a test"
      }
    }
  }
}

match 的顶级参数

编辑
<字段>
(必填,对象) 你想要搜索的字段。

<字段> 的参数

编辑
query

(必填) 你希望在提供的 <字段> 中找到的文本、数字、布尔值或日期。

match 查询会在执行搜索之前分析任何提供的文本。这意味着 match 查询可以搜索text字段中已分析的词元,而不是精确的术语。

analyzer
(可选,字符串) 分析器,用于将 query 值中的文本转换为词元。默认为为 <字段> 映射的索引时分析器。如果没有映射分析器,则使用索引的默认分析器。
auto_generate_synonyms_phrase_query

(可选,布尔值) 如果为 true,则会自动为多词同义词创建匹配短语查询。默认为 true

请参阅使用 match 查询的同义词以了解示例。

boost

(可选,浮点数) 用于降低或提高查询相关性评分的浮点数。默认为 1.0

Boost 值相对于默认值 1.0。介于 01.0 之间的 boost 值会降低相关性评分。大于 1.0 的值会提高相关性评分。

fuzziness
(可选,字符串) 允许的匹配最大编辑距离。请参阅模糊度以了解有效值和更多信息。请参阅match 查询中的模糊度以了解示例。
max_expansions
(可选,整数) 查询将扩展到的最大术语数。默认为 50
prefix_length
(可选,整数) 模糊匹配时保持不变的开头字符数。默认为 0
fuzzy_transpositions
(可选,布尔值) 如果为 true,则模糊匹配的编辑包括两个相邻字符的转置 (ab → ba)。默认为 true
fuzzy_rewrite

(可选,字符串) 用于重写查询的方法。请参阅rewrite 参数以了解有效值和更多信息。

如果 fuzziness 参数不是 0,则 match 查询默认使用 top_terms_blended_freqs_${max_expansions}fuzzy_rewrite 方法。

lenient
(可选,布尔值) 如果为 true,则会忽略基于格式的错误,例如为数值字段提供文本 query 值。默认为 false
operator

(可选,字符串) 用于解释 query 值中文本的布尔逻辑。有效值为

OR (默认)
例如,query 值为 capital of Hungary 将被解释为 capital OR of OR Hungary
AND
例如,query 值为 capital of Hungary 将被解释为 capital AND of AND Hungary
minimum_should_match

(可选,字符串) 为了返回文档,必须匹配的子句的最小数量。请参阅minimum_should_match 参数以了解有效值和更多信息。

zero_terms_query

(可选,字符串) 指示如果分析器删除所有词元(例如使用 stop 过滤器时)是否不返回任何文档。有效值为

none (默认)
如果分析器删除所有词元,则不返回任何文档。
all
返回所有文档,类似于match_all 查询。

请参阅零词元查询以了解示例。

说明

编辑

简短的请求示例

编辑

你可以通过组合 <字段>query 参数来简化 match 查询语法。例如

resp = client.search(
    query={
        "match": {
            "message": "this is a test"
        }
    },
)
print(resp)
response = client.search(
  body: {
    query: {
      match: {
        message: 'this is a test'
      }
    }
  }
)
puts response
res, err := es.Search(
	es.Search.WithBody(strings.NewReader(`{
	  "query": {
	    "match": {
	      "message": "this is a test"
	    }
	  }
	}`)),
	es.Search.WithPretty(),
)
fmt.Println(res, err)
const response = await client.search({
  query: {
    match: {
      message: "this is a test",
    },
  },
});
console.log(response);
GET /_search
{
  "query": {
    "match": {
      "message": "this is a test"
    }
  }
}

match 查询的工作原理

编辑

match 查询的类型为 boolean。这意味着提供的文本将被分析,并且分析过程会根据提供的文本构建布尔查询。可以使用 operator 参数设置为 orand 来控制布尔子句(默认为 or)。可以使用minimum_should_match参数设置要匹配的可选 should 子句的最小数量。

这是一个带有 operator 参数的示例

resp = client.search(
    query={
        "match": {
            "message": {
                "query": "this is a test",
                "operator": "and"
            }
        }
    },
)
print(resp)
response = client.search(
  body: {
    query: {
      match: {
        message: {
          query: 'this is a test',
          operator: 'and'
        }
      }
    }
  }
)
puts response
res, err := es.Search(
	es.Search.WithBody(strings.NewReader(`{
	  "query": {
	    "match": {
	      "message": {
	        "query": "this is a test",
	        "operator": "and"
	      }
	    }
	  }
	}`)),
	es.Search.WithPretty(),
)
fmt.Println(res, err)
const response = await client.search({
  query: {
    match: {
      message: {
        query: "this is a test",
        operator: "and",
      },
    },
  },
});
console.log(response);
GET /_search
{
  "query": {
    "match": {
      "message": {
        "query": "this is a test",
        "operator": "and"
      }
    }
  }
}

可以设置 analyzer 来控制哪个分析器将对文本执行分析过程。它默认为字段显式映射定义或默认搜索分析器。

可以将 lenient 参数设置为 true 以忽略由数据类型不匹配引起的异常,例如尝试使用文本查询字符串查询数字字段。默认为 false

match 查询中的模糊度

编辑

fuzziness 允许根据被查询的字段类型进行模糊匹配。请参阅模糊度以了解允许的设置。

在这种情况下,可以设置 prefix_lengthmax_expansions 来控制模糊过程。如果设置了模糊选项,则查询将使用 top_terms_blended_freqs_${max_expansions} 作为其重写方法fuzzy_rewrite 参数允许控制查询的重写方式。

默认允许模糊转置 (abba),但可以通过将 fuzzy_transpositions 设置为 false 来禁用。

模糊匹配不应用于包含同义词的术语,也不应用于分析过程在同一位置产生多个词元的情况。在幕后,这些术语会被扩展到一个特殊的同义词查询,该查询混合了术语频率,不支持模糊扩展。

resp = client.search(
    query={
        "match": {
            "message": {
                "query": "this is a testt",
                "fuzziness": "AUTO"
            }
        }
    },
)
print(resp)
response = client.search(
  body: {
    query: {
      match: {
        message: {
          query: 'this is a testt',
          fuzziness: 'AUTO'
        }
      }
    }
  }
)
puts response
res, err := es.Search(
	es.Search.WithBody(strings.NewReader(`{
	  "query": {
	    "match": {
	      "message": {
	        "query": "this is a testt",
	        "fuzziness": "AUTO"
	      }
	    }
	  }
	}`)),
	es.Search.WithPretty(),
)
fmt.Println(res, err)
const response = await client.search({
  query: {
    match: {
      message: {
        query: "this is a testt",
        fuzziness: "AUTO",
      },
    },
  },
});
console.log(response);
GET /_search
{
  "query": {
    "match": {
      "message": {
        "query": "this is a testt",
        "fuzziness": "AUTO"
      }
    }
  }
}

零词元查询

编辑

如果使用的分析器删除查询中的所有词元(例如 stop 过滤器),则默认行为是不匹配任何文档。为了更改这一点,可以使用 zero_terms_query 选项,它接受 none(默认)和 all,后者对应于 match_all 查询。

resp = client.search(
    query={
        "match": {
            "message": {
                "query": "to be or not to be",
                "operator": "and",
                "zero_terms_query": "all"
            }
        }
    },
)
print(resp)
response = client.search(
  body: {
    query: {
      match: {
        message: {
          query: 'to be or not to be',
          operator: 'and',
          zero_terms_query: 'all'
        }
      }
    }
  }
)
puts response
res, err := es.Search(
	es.Search.WithBody(strings.NewReader(`{
	  "query": {
	    "match": {
	      "message": {
	        "query": "to be or not to be",
	        "operator": "and",
	        "zero_terms_query": "all"
	      }
	    }
	  }
	}`)),
	es.Search.WithPretty(),
)
fmt.Println(res, err)
const response = await client.search({
  query: {
    match: {
      message: {
        query: "to be or not to be",
        operator: "and",
        zero_terms_query: "all",
      },
    },
  },
});
console.log(response);
GET /_search
{
  "query": {
    "match": {
      "message": {
        "query": "to be or not to be",
        "operator": "and",
        "zero_terms_query": "all"
      }
    }
  }
}

同义词

编辑

match 查询支持使用synonym_graph 词元过滤器进行多词同义词扩展。使用此过滤器时,解析器会为每个多词同义词创建一个短语查询。例如,以下同义词:"ny, new york" 将产生

(ny OR ("new york"))

也可以使用连接词来匹配多词同义词

$params = [
    'body' => [
        'query' => [
            'match' => [
                'message' => [
                    'query' => 'ny city',
                    'auto_generate_synonyms_phrase_query' => false,
                ],
            ],
        ],
    ],
];
$response = $client->search($params);
resp = client.search(
    query={
        "match": {
            "message": {
                "query": "ny city",
                "auto_generate_synonyms_phrase_query": False
            }
        }
    },
)
print(resp)
response = client.search(
  body: {
    query: {
      match: {
        message: {
          query: 'ny city',
          auto_generate_synonyms_phrase_query: false
        }
      }
    }
  }
)
puts response
res, err := es.Search(
	es.Search.WithBody(strings.NewReader(`{
	  "query": {
	    "match": {
	      "message": {
	        "query": "ny city",
	        "auto_generate_synonyms_phrase_query": false
	      }
	    }
	  }
	}`)),
	es.Search.WithPretty(),
)
fmt.Println(res, err)
const response = await client.search({
  query: {
    match: {
      message: {
        query: "ny city",
        auto_generate_synonyms_phrase_query: false,
      },
    },
  },
});
console.log(response);
GET /_search
{
   "query": {
       "match" : {
           "message": {
               "query" : "ny city",
               "auto_generate_synonyms_phrase_query" : false
           }
       }
   }
}

上面的示例创建一个布尔查询

(ny OR (new AND york)) city

该查询匹配包含术语 ny 或连接词 new AND york 的文档。默认情况下,参数 auto_generate_synonyms_phrase_query 设置为 true