Elasticsearch:应该+ minimum_should_match vs必须

时间:2017-03-16 10:07:04

标签: elasticsearch

我使用这两个查询进行测试

使用必须

查询
 {
  "size": 200,
  "from": 0,
  "query": {
  "bool": {
  "must": [ {
      "match": {
        "_all": "science"
      }
    },
    {
      "match": {
        "category": "fiction"
      }
    },
    {
      "match": {
        "country": "us"
      }
    }
   ]
 }
}

}

使用should + minimum_should_match

查询
  {
   "size": 200,
   "from": 0,
   "query": {
   "bool": {
   "should": [ {
       "match": {
         "_all": "science"
       }
     },
     {
      "match": {
        "category": "fiction"
        }
      },
      {
      "match": {
        "country": "us"
        }
      }
    ],
     minimum_should_match: 3
  }
 }
}

两个查询都给我相同的结果,我不知道这两个之间的差异,当我们应该使用minimum_should_match?

2 个答案:

答案 0 :(得分:2)

这是正确和理想的行为。让我们解读一下:

  • 包含must子句的布尔查询意味着must部分下的所有子句都需要匹配。就像英语一样 - 这意味着强有力的义务。
  • 带有should子句的布尔查询意味着某些子句需要匹配,而其他子句则不匹配(即软义务)。此处必须匹配的默认子句数仅为1.并且要覆盖此行为,minimum_should_match参数将起作用。如果您指定minimum_should_match=3,则表示should下的3个条款必须匹配。从实际角度来看,它与使用must
  • 指定这些子句完全相同

希望它能详细解释。

答案 1 :(得分:2)

我猜你的意思是minimum_number_should_match,对吧?

在这两种情况下它都是相同的,因为should中的子句数量相同。当你有多个条款而不是你在那里指定的数字时,通常会使用minimum_number_should_match

例如,如果您有5个should子句,但由于某种原因,您只需要完成其中的三个,您可以执行以下操作:

{
  "query": {
    "bool": {
      "should": [
        {
          "term": {
            "tag": "wow"
          }
        },
        {
          "term": {
            "tag": "elasticsearch"
          }
        },
        {
          "term": {
            "tag": "tech"
          }
        },
        {
          "term": {
            "user": "plchia"
          }
        },
        {
          "range": {
            "age": {
              "gte": 10,
              "lte": 20
            }
          }
        }
      ],
      "minimum_should_match": 3
    }
  }
}