匹配查询 {#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 类型可以提供一个很棒的 “即时” 行为来自动的加载搜索结果。
本文深入探讨Elasticsearch中的Match Query,一种接受文本、数值和日期并进行复杂查询构造的功能。Match Query通过布尔逻辑、模糊匹配、同义词扩展等特性增强搜索能力,同时介绍如何调整参数如cutoff_frequency和fuzziness以优化查询效率。
1757

被折叠的 条评论
为什么被折叠?



