一、must查询
使用must查询可以筛选出同时符合多个条件的文档,相当于逻辑上的“与”操作。下面是一个例子:
POST /_search
{
"query": {
"bool": {
"must": [
{ "match": { "title": "elasticsearch" }},
{ "match": { "content": "search" }}
]
}
}
}
上述查询的意思是,要同时匹配"title"字段中包含"elasticsearch"和"content"字段中包含"search"的文档,才会被返回。 此外,must查询还可以用于排除一些文档。例如,我们可以使用must_not来筛选出不包含指定关键词的文档:
POST /_search
{
"query": {
"bool": {
"must": {
"match": { "content": "elasticsearch" }
},
"must_not": {
"match": { "title": "logstash" }
}
}
}
}
上述查询的意思是,要匹配"content"字段中包含"elasticsearch"并且"title"字段中不包含"logstash"的文档才会被返回。
二、should查询
使用should查询可以查找同时符合多个条件之一的文档,即逻辑上的“或”操作。下面是一个例子:
POST /_search
{
"query": {
"bool": {
"should": [
{ "match": { "title": "elasticsearch" }},
{ "match": { "content": "search" }}
]
}
}
}
上述查询的意思是,要匹配"title"字段中包含"elasticsearch"或"content"字段中包含"search"的文档,都会被返回。 在should查询中,我们也可以指定一个minimum_should_match参数,表示至少要匹配多少个查询条件才会被返回。例如:
POST /_search
{
"query": {
"bool": {
"should": [
{ "match": { "title": "elasticsearch" }},
{ "match": { "content": "search" }}
],
"minimum_should_match": 1
}
}
}
上述查询的意思是,要匹配"title"字段中包含"elasticsearch"或"content"字段中包含"search"的文档,但至少要满足一个条件才会被返回。
三、must和should联合查询
在实际应用场景中,我们经常需要同时筛选出满足多个条件之一的文档,同时排除一些不符合要求的文档。这时候,就可以使用must和should联合查询,如下所示:
POST /_search
{
"query": {
"bool": {
"must": {
"match": { "content": "elasticsearch" }
},
"should": [
{ "match": { "title": "logstash" }},
{ "match": { "title": "kibana" }}
],
"must_not": [
{ "match": { "title": "redis" }}
]
}
}
}
上述查询的意思是,要匹配"content"字段中包含"elasticsearch"并且"title"字段中至少满足一个条件,同时不匹配"title"字段中包含"redis"的文档才会被返回。
四、总结
在ES中,使用must查询可以筛选出同时符合多个条件的文档,而使用should查询可以查找同时符合多个条件之一的文档。两者结合使用,可以更加精细地组合查询条件,满足不同的实际需求。