官方文档地址:
Match query
返回与提供的文本、数字、日期或布尔值匹配的文档。在匹配之前对提供的文本进行分析。
match 查询是执行全文搜索的标准查询,包括模糊匹配选项。
示例请求
GET /_search
{
"query": {
"match": {
"message": {
"query": "this is a test"
}
}
}
}
match 的顶级参数
<field>
(必选,对象)希望搜索的字段。
field 的参数
query
(必选)希望在提供的<field> 中找到的文本、数字、布尔值或日期。
match 查询在执行搜索之前分析任何提供的文本。这意味着match 查询可以在text 字段中搜索已分析的标记,而不是精确的术语。
analyzer
(可选,字符串)用于将query 值中的文本转换为标记的分析程序。默认为<field> 映射的索引时间分析器。如果没有映射分析程序,则使用索引的默认分析程序。
auto_generate_synonyms_phrase_query
(可选,布尔值)如果为true ,将自动为多术语同义词创建match_phrase 查询。默认值为true 。
参见使用同义词匹配查询的示例。
fuzziness
(可选,字符串)允许匹配的最大编辑距离。有关有效值和更多信息,请参见fuzziness 。参见匹配查询中的fuzziness 示例。
max_expansions
(可选,integer)查询将扩展到的最大词汇数。默认值为50 。
prefix_length
(可选,integer)为模糊匹配保留不变的起始字符数。默认值为0 。
fuzzy_transpositions
(可选,布尔值)如果为true ,模糊匹配的编辑包括两个相邻字符(ab→ba)的调换。默认值为true 。
fuzzy_rewrite
(可选,字符串)用于重写查询的方法。有关有效值和更多信息,请参阅rewrite 参数。
如果fuzziness 参数不为0,则match 查询默认使用top_terms_blended_freqs_${max_expansions} 的fuzzy_rewrite 方法。
lenient
(可选,布尔值)如果为true ,则忽略基于格式的错误,例如为数字字段提供文本查询值。默认值为false 。
operator
(可选,字符串)用于解释query 值中的文本的布尔逻辑。有效值:
- OR(默认的):例如,
capital of Hungary 被解释为capital OR of OR Hungary 。 - AND:例如,
capital of Hungary 被解释为capital AND of AND Hungary 。
minimum_should_match
(可选,字符串)要返回的文档必须匹配的最小子句数。有关有效值和更多信息,请参阅minimum_should_match 参数。
zero_terms_query
(可选,字符串)指示如果analyzer 删除所有标记(例如使用stop 过滤器时),是否不返回文档。有效值:
- none(默认的):如果
analyzer 删除所有标记,则不返回文档。 - all:返回所有文档,类似于
match_all 查询。
参见zero_terms_query 查询的示例。
备注
短请求示例
您可以通过组合<field> 和query 参数来简化匹配查询语法。例如:
GET /_search
{
"query": {
"match": {
"message": "this is a test"
}
}
}
匹配查询如何工作
match 查询的类型为boolean 。这意味着对提供的文本进行分析,分析过程根据提供的文本构造一个布尔查询。操作符参数可以设置为or 或and 来控制布尔子句(默认为or )。要匹配的可选should 子句的最小数量可以使用minimum_should_match 参数设置。
下面是一个带有operator 参数的例子:
GET /_search
{
"query": {
"match": {
"message": {
"query": "this is a test",
"operator": "and"
}
}
}
}
analyzer 可以被设置为控制哪个分析器将对文本执行分析过程。它默认为字段显式映射定义,或默认搜索分析器。
可以将lenient 参数设置为true ,以忽略由数据类型不匹配引起的异常,例如尝试用文本查询字符串查询数字字段。默认值为false 。
fuzziness
fuzziness 允许基于被查询字段的类型进行模糊匹配。有关允许的设置,请参见fuzziness 。
在这种情况下,可以设置prefix_length 和max_expansions 来控制模糊过程。如果设置了模糊选项,查询将使用top_terms_blended_freqs_${max_expansions} 作为重写方法,fuzzy_rewrite 参数允许控制如何重写查询。
默认情况下允许模糊转置(ab→ba),但可以通过设置fuzzy_transpositions 为false 来禁用。
注意
模糊匹配不适用于具有同义词的术语,也不适用于分析过程在相同位置产生多个标记的情况。在引擎盖下,这些术语被展开为一个特殊的同义词查询,该查询混合了术语频率,不支持模糊展开。
GET /_search
{
"query": {
"match": {
"message": {
"query": "this is a testt",
"fuzziness": "AUTO"
}
}
}
}
zero_terms_query
如果分析器像stop 过滤器那样删除查询中的所有标记,则默认行为是根本不匹配任何文档。为了改变这种情况,可以使用zero_terms_query 选项,它接受none (默认值)和对应于match_all 查询的all 。
GET /_search
{
"query": {
"match": {
"message": {
"query": "to be or not to be",
"operator": "and",
"zero_terms_query": "all"
}
}
}
}
cutoff_frequency
警告:在7.3.0被弃用
这个选项可以省略,因为 match 可以在没有任何配置的情况下有效地跳过文档块,前提是不跟踪总命中数。
The match query supports a cutoff_frequency that allows specifying an absolute or relative document frequency where high frequency terms are moved into an optional subquery and are only scored if one of the low frequency (below the cutoff) terms in the case of an or operator or all of the low frequency terms in the case of an and operator match.
This query allows handling stopwords dynamically at runtime, is domain independent and doesn’t require a stopword file. It prevents scoring / iterating high frequency terms and only takes the terms into account if a more significant / lower frequency term matches a document. Yet, if all of the query terms are above the given cutoff_frequency the query is automatically transformed into a pure conjunction (and ) query to ensure fast execution.
The cutoff_frequency can either be relative to the total number of documents if in the range from 0 (inclusive) to 1 (exclusive) or absolute if greater or equal to 1.0 .
Here is an example showing a query composed of stopwords exclusively:
GET /_search
{
"query": {
"match": {
"message": {
"query": "to be or not to be",
"cutoff_frequency": 0.001
}
}
}
}
重要
cutoff_frequency 选项在每个分片级别上操作。这意味着,当在测试索引中使用低文档编号时,您应该遵循相关性中的建议。
同义词
match 查询支持使用synonym_graph 标记过滤器进行多术语同义词扩展。当使用这个过滤器时,解析器为每个多术语同义词创建一个短语查询。例如,下面的同义词“ny, new york”会产生:
(ny OR ("new york"))
也可以用连词来匹配多术语的同义词:
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。
|