匹配查询 {#query-dsl-match-query}
match
查询接受文本/数值/日期,分析他们并构造一个查询。例如:
GET /_search
{
"query": {
"match" : {
"message" : "this is a test"
}
}
}
注意, message
是一个字段的名字,你能够用任意字段的名字替代它。
匹配 {#query-dsl-match-query-boolean}
match
查询是 boolean
类型的。这意味着文本会被分析,并且分析过程会根据提供的文本构建一个布尔查询。
operator
标志可以设置 or
或者 and
来控制布尔子句(默认为 or
)。
匹配 should
子句的最小数量是可选的,可以通过
minimum_should_match
参数设置。
analyzer
可以被设置以控制那个分析器将会执行文本的分析过程。
lenient
参数可以设置为 true
来忽略由于数据类型不匹配导致的异常,
比如尝试用一个文本字符串查询一个数字字段。 lenient
参数默认是
false
。
模糊 {#query-dsl-match-query-fuzziness}
fuzziness
允许基于被查询的字段的类型模糊匹配。有关被允许的设置,请看
fuzziness 。
在这种情况下,可以设置 prefix_length
和 max_expansions
来控制模糊过程。 如果设置了模糊选项,查询将会使用
top_terms_blended_freqs_${max_expansions}
作为它的 rewrite
method , fuzzy_rewrite
参数允许控制查询将如何重写。
默认情况下允许模糊转换 (ab
→ ba
) ,但可以通过设置
fuzzy_transpositions
为 false
来禁用。
下面是一个提供附加参数的例子(注意结构稍有变化, message
是字段的名称):
GET /_search
{
"query": {
"match" : {
"message" : {
"query" : "this is a test",
"operator" : "and"
}
}
}
}
Zero terms query {#query-dsl-match-query-zero}
如果使用的分析器删除了查询中的所有令牌,就像 stop
过滤器做的那样,默认的行为是不会匹配到任何文档。 为了改变
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"
}
}
}
}
截止频率 {#query-dsl-match-query-cutoff}
match 查询支持 cutoff_frequency
,它允许指定一个绝对的或者相对的文档频率,
其中高频词会被移动到一个可选的子查询中,并且如果是 or
操作的低频词(低于指定的频率)中有一个匹配或者 and
操作的低频词的所有都匹配才会计算评分。
这个查询允许在运行时动态的处理 stopwords
,它是领域独立的,并且不需要停止词文件。它防止对高频词计算评分或者迭代,并且如果更有意义或者更低频的词匹配文档的情况下,则只考虑这些词。还有,如果所有的查询关键词的频度都比给定的 cutoff_frequency
高的话,查询将自动地转换为纯联合(and
)查询,以确保快速的执行。
如果在 [0..1)
范围内, 则 cutoff_frequency
指的是相对于文档总数的比例,如果大于或者等于 1.0
,则cutoff_frequency
指的是绝对的文档数量。
下面是一个仅由停止词组成的查询的例子:
GET /_search
{
"query": {
"match" : {
"message" : {
"query" : "to be or not to be",
"cutoff_frequency" : 0.001
}
}
}
}
Important
cutoff_frequency
选项以 per-shard-level
来运行。这意味着当尝试用低文档号测试索引时, 你应该遵守
{defguide}/relevance-is-broken.html[Relevance is broken] 的建议。
同义词 {#query-dsl-match-query-synonyms}
match
查询使用 synonym_graph 令牌过滤器来支持 multi-terms
同义词扩展。当使用这个过滤器的时候,解析器将为每一个 multi-terms 同义词创建一个短语查询。 例如,下面的同义词:"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
。
match 的查询系列不会经过 “查询分析” 过程。它不支持字段名称前缀,通配符字符,或者其他的 “高级” 特征。
基于这个原因,它失败的机会很小/不存在,并且当它只分析和运行一个查询行为的文本(通常是一个文本搜索框)时,它提供了一个出色的行为。另外, phrase_prefix
类型可以提供一个很棒的 “即时” 行为来自动的加载搜索结果。