我使用这两个查询进行测试
使用必须
查询 {
"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?
答案 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
}
}
}