原英文版地址: https://www.elastic.co/guide/en/elasticsearch/reference/7.7/query-dsl-match-query.html, 原文档版权归 www.elastic.co 所有
本地英文版地址: ../en/query-dsl-match-query.html

匹配(match)查询

返回与提供的文本、数字、日期或布尔值相 匹配(match) 的文档。 匹配前会分析提供的文本。

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

请求示例

GET /_search
{
    "query": {
        "match" : {
            "message" : {
                "query" : "this is a test"
            }
        }
    }
}

match的顶级参数

<field>
(必需的, object) 你想搜索的字段。

<field>的参数

query

(必需的) 你希望在提供的 <field> 中查找的文本(text)、数字(number)、布尔值(bool)或日期(date)。

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

analyzer
(可选, string) analyzer(分析器) 用于将 query 中的文本转换为 词元(token)。 默认为映射到<field>索引时使用的分析器(index-time analyzer)。 如果没有映射分析器,则使用索引的默认分析器。
auto_generate_synonyms_phrase_query

(可选, boolean) 如果为 true,将自动为 多词项同义词(multi-term synonyms) 创建 match phrase(短语匹配) 查询。 默认值为 true

有关示例请参考 在match查询中使用同义词

fuzziness
(可选, string) 匹配时允许的最大编辑距离。 可用的值及更多信息请参考 模糊性(fuzziness)。 有关示例请参考 match查询中的模糊性
max_expansions
(可选, integer) 查询可以扩展到的最大 词项(term) 数。默认值为 50
prefix_length
(可选, integer) 模糊匹配的起始字符保持不变的分数。默认值为 0
fuzzy_transpositions
(可选, boolean) 如果为 true,模糊匹配的编辑包括两个相邻字符的交换(ab → ba)。默认值为 true
fuzzy_rewrite

(可选, string) 用于重写查询的方法。 可用的值及更多信息请参考 rewrite 参数

如果参数 fuzziness 的值不是 0,默认情况下,match 查询使用的 rewrite 方法是 top_terms_blended_freqs_${max_expansions}

lenient 宽容的
(可选, boolean) 如果为 true,则忽略基于格式的错误,例如为 numeric 字段提供 text 格式的 query 值。 默认值为 false
operator

(可选, string) 用于解释 query 值中文本的布尔逻辑。有效值有:

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

(可选, string) 要返回的文档必须匹配的最小子句数。 可用的值及更多信息请参考 minimum_should_match 参数

zero_terms_query

(可选, string) 指示如果 analyzer 删除所有 词元(token) (例如使用 stop 过滤器时),是否不返回任何文档。有效值有:

none (默认值)
如果 analyzer 删除所有 词元(token),则不返回任何文档。
all
返回所有文档, 与 match_all 查询类似。

有关示例请参考 零词项查询(zero terms query)

注意

简短请求示例

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

GET /_search
{
    "query": {
        "match" : {
            "message" : "this is a test"
        }
    }
}

match 查询是如何工作的?

match 查询属于 boolean 类型。 这意味着对所提供的文本进行分析,并且分析过程从所提供的文本中构造一个 boolean 查询。 参数 operator 可以设置为 orand,以控制 boolean 子句(默认为 or)。 可以使用 minimum_should_match 参数设置要匹配的可选 should 子句的最小数量。

下面是一个带有 operator 参数的示例:

GET /_search
{
    "query": {
        "match" : {
            "message" : {
                "query" : "this is a test",
                "operator" : "and"
            }
        }
    }
}

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

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

match 查询中的模糊性(fuzziness)

fuzziness(模糊性) 允许基于被查询的字段类型进行模糊匹配。 有关允许的设置,请参考 模糊性

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

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

模糊匹配不适用于具有同义词的词项(term),也不适用于分析过程在同一位置产生多个词元(token)的情况。 在底层,这些词项(temr)被扩展为一个混合了词项频率的特殊同义词查询,它不支持模糊扩展。

GET /_search
{
    "query": {
        "match" : {
            "message" : {
                "query" : "this is a testt",
                "fuzziness": "AUTO"
            }
        }
    }
}

零词项查询 (zero terms query)

如果所使用的分析器像 stop 过滤器一样删除查询中的所有词元(token),那么默认行为是根本不匹配任何文档。 为了改变这种情况,可以使用 zero_terms_query 选项,它接受 none (默认值) 和 all (对应于 match_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) 可以有效地跳过文档块,而无需任何配置,前提是不跟踪命中的总数。

匹配查询支持 cutoff_frequency ,它允许指定一个绝对或相对的文档频率,其中高频词项被移到可选的子查询中,并且只有在 or 运算符时有一个低频(低于截止值)词项匹配 或 and 运算符时所有低频词项都匹配 时才被计分。

该查询允许在运行时动态处理 stopwords(停止词) ,它是独立于域(domain)的,并且不需要停止词文件。 它防止对高频词项进行评分/迭代,并且仅在更重要/更低频率的词项匹配文档时才考虑这些词项。 然而,如果所有查询项都高于给定的 cutoff_frequency,则该查询会自动转换为纯的结合(and)查询,以确保快速执行。

cutoff_frequency的值,在 [0, 1) 范围内时是一个相对于文档总数的值,而在 >= 1.0 时是一个绝对值。

下面这个示例显示了一个全部由 停止词(stopword) 组成的查询:

GET /_search
{
    "query": {
        "match" : {
            "message" : {
                "query" : "to be or not to be",
                "cutoff_frequency" : 0.001
            }
        }
    }
}

cutoff_frequency 选项在每个分片级别上执行。 这意味着当在文档数很少的测试索引上试用它时,你应该遵循“相关性被破坏”中的建议。

同义词 (synonyms)

match 查询通过 synonym_graph 词元过滤器支持多词项的同义词扩展。 当使用这个过滤器时,解析器为每个多词项的同义词创建一个短语(phrase)查询。 例如,同义词 "ny, new york" 将产生:

(ny OR ("new york"))

也可以用连接词来匹配多个词项同义词:

GET /_search
{
   "query": {
       "match" : {
           "message": {
               "query" : "ny city",
               "auto_generate_synonyms_phrase_query" : false
           }
       }
   }
}

上面的例子创建了一个 boolean 查询:

(ny OR (new AND york)) city

它匹配带有词项 ny 或连接词 new AND york 的文档。 默认情况下,参数 auto_generate_synonyms_phrase_query 设置为 true