跳到主要内容

字段匹配 match

最简单的查询,它匹配所有文档。

GET /_search
{
"query": {
"match_all": {}
}
}

Match Query 最基础的一个例子,"this is a test" 经过分析过程,去除停用词 ["is"、 "a"], 提取关键词 ["this"、 "test"]以默认的 or 关系针对 message 字段进行匹配查询。

GET /_search
{
"query": {
"match" : {
"message" : "this is a test"
}
}
}
信息
  1. MatchQuery 接受 text/numerics/date 类型的字段
  2. 可以将 lenient 参数设置为 true 以忽略由数据类型不匹配引起的异常,例如尝试使用文本查询字符串查询数字字段。默认为false。

operator

以 and 来控制逻辑关系(默认为 or)做更精准的匹配。

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

minimum_should_match

minimum_should_match 最小匹配数。 配置参考

下例中关键词需匹配2次以上

GET /_search
{
"query": {
"match" : {
"message" : {
"query" : "hello world",
"operator" : "or",
"minimum_should_match": 2
}
}
}
}

Fuzziness

fuzziness 允许不精确的模糊匹配。 配置参考

默认情况下允许模糊转置 (ab → ba),但可以通过将 fuzzy_transpositions 设置为 false 来禁用。

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

注意,模糊匹配不适用于具有同义词的关键词

Zero terms query

如果使用的分析器(例如停用词过滤器)删除查询中的所有输入词,则默认行为是匹配不到任何文档。为了改变可以使用 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

cutoff_frequency 将查询字符串里的词项分为低频和高频两组。低频组(更重要的词项)组成大量查询条件,而高频组(次重要的词项)只会用来评分,而不参与匹配过程。通过对这两组词的区分处理,我们可以获取更高的检索性能提升。

以下面查询为例:

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

任何词项出现在文档中超过1%,被认为是高频词。上例中出现频率较多的停用词 to be or not to be 被划分为高频词,出现频率低的Shakespeare says为低频词 此查询会被重写为以下的 bool 查询:

{
"bool": {
"must": {
"bool": {
"should": [
{ "term": { "text": "Shakespeare" }},
{ "term": { "text": "says" }}
]
}
},
"should": {
"bool": {
"should": [
{ "term": { "text": "to" }},
{ "term": { "text": "be" }},
{ "term": { "text": "or" }},
{ "term": { "text": "not" }}
]
}
}
}
}

搜索更重要的低频词,而高频词只用于提高算分,以获取更好的结果相关度。