文章目录
- 1,must
- 2,must not
- 3,should
1,must
{
"query": {
"bool": {
"must": [
{
"match": {
"gender": "M"
}
},
{
"match": {
"address": "mill"
}
}
]
}
}
}
bool
: 这是一个布尔查询,用于组合多个查询条件。must
: 表示查询中必须满足的条件。如果文档不满足must
中的任何条件,它将不会被包含在搜索结果中。
具体到这段代码,它定义了一个查询,其条件如下:
- 必须匹配性别为男性(
gender:"M"
) - 必须匹配邮件中包含
mill
- 以上两个条件都匹配的文档才能命中
- 结果如下,满足3个文档
2,must not
{
"query": {
"bool": {
"must": [
{
"match": {
"gender": "M"
}
},
{
"match": {
"address": "mill"
}
}
],
"must_not": [
{
"match": {
"age": "28"
}
}
]
}
}
}
bool
: 布尔查询组合多个查询条件。must
: 表示查询中必须满足的条件。如果文档不满足must
中的任何条件,它将不会被包含在搜索结果中。must_not
: 表示查询中必须不满足的条件。如果文档满足must_not
中的任何条件,它将不会被包含在搜索结果中。
具体到这段代码,定义了一个bool查询,其条件如下:
- 必须匹配性别为男性(
gender:"M"
) - 必须匹配邮件包含
mill
- 必须不匹配年龄为28岁的文档(
age:"28"
) - 相对于前一个查询,多了must not条件规定的年龄不能是28岁,条件更多更严苛,命中的文档更少
3,should
在布尔查询中,should
子句用于指定一组可选条件。这些条件不是必须满足的,但如果文档满足这些条件,它们可以提高文档的相关性得分(即_score
)。should
子句通常与minimum_should_match
参数一起使用,这个参数指定了至少需要多少个should
条件被满足,文档才会被认为是匹配的。
这里是should
子句的一些关键点:
- 可选性:
should
中的条件是可选的,不强制要求文档必须满足。 - 提升得分:如果文档满足
should
中的条件,它的得分可能会提高,这取决于查询的构建方式和Elasticsearch的算法。 minimum_should_match
:这个参数定义了至少需要多少个should
条件被满足。例如,如果你有3个should
条件,你可以设置minimum_should_match
为2,这意味着文档至少需要满足2个条件才能被认为是匹配的。- 与
must
和must_not
结合使用:should
可以与must
(必须满足的条件)和must_not
(必须不满足的条件)一起使用,以构建复杂的查询。
GET bank/_search
{
"query": {
"bool": {
"must": [
{
"match": {
"gender": "M"
}
},
{
"match": {
"address": "mill"
}
}
],
"must_not": [
{
"match": {
"age": "18"
}
}
],
"should": [
{
"match": {
"lastname": "Wallace"
}
}
],
"minimum_should_match": 0
}
}
}
-
bool
:布尔查询,它允许组合多个查询条件。-
must
:包含必须满足的查询条件。文档必须满足must
中的所有条件才会被包含在搜索结果中。在这个例子中,must
有两个条件:- 性别(gender)必须是"M"。
- 地址(address)必须包含"mill"。
-
must_not
:包含必须不满足的查询条件。文档如果满足must_not
中的任何条件,将不会被包含在搜索结果中。在这个例子中,must_not
有一个条件:- 年龄(age)不能是"18"。
-
should
:包含可选的查询条件。如果文档满足should
中的条件,它可以提高文档的相关性得分,但不是必需的。在这个例子中,should
有一个条件:- 姓氏(lastname)必须是"Wallace"。
-
minimum_should_match
:指定至少需要多少个should
条件被满足。在这个例子中,minimum_should_match
设置为0,这意味着即使没有should
条件被满足,文档也可以出现在搜索结果中。这个设置通常用于不强制要求should
条件,但希望它们能够影响文档得分的情况。
-
总结来说,这个查询将返回bank
索引中满足以下条件的文档:
- 性别为男性(“M”)。
- 地址包含"mill"。
- 年龄不是18岁。
- (可选)姓氏为Wallace的文档可能会获得更高的相关性得分,但这不是必需的。
需要注意的,should
和minimum_should_match
配合使用,如果minimum_should_match
等于1,必须满足should
中至少1个条件,相当于must
,当比must
更灵活,因为should
中如果有多个条件的话,只需要满足任意一个即可。
如果,把上面的查询中的minimum_should_match值改为1,则查询出来的结果更少。