查询是一个复杂过程,特别是当查询过程中有多个条件,在 ES 中当有多个条件的时候,就得使用组合查询了。
组合查询是通过 bool 关键字来实现的,通过 must
、must_not
、should
将不同的条件组合到一起,再用 bool 包裹一下作为一个整体。用来实现各种且、非、或的条件组合。
“且”条件
给定需求:
查询 class 索引中姓 deng 并且年龄是 16 的学生。
下面的查询语句中不难看出,bool 包裹了条件整体,使用 must 组合两个条件实现了“且”。
GET class/_search
{
"query": {
"bool": {
"must": [
{
"match": {
"name": "deng"
}
},
{
"term": {
"age": 16
}
}
]
}
}
}
“非”条件
给定需求:
查找姓名中不包含 deng,且年龄要大于 16 岁的。
下面这条查询语句,使用 must_not
不难理解是对里面的条件做了一个“非”操作。首先使用 match Phrase
查询姓名中包含 deng 的,然后再用范围查询,查询年龄小于 16 的,再取个“非”,达到了我们想要的效果。
GET class/_search
{
"query": {
"bool": {
"must_not": [
{
"match": {
"name": "deng"
}
},
{
"range": {
"age": {
"lte": 16
}
}
}
]
}
}
}
“或”条件
给定需求:
查询性别为“男性”或者“女性”的学生数据。
因为性别是确定的字符串,要么是 man 要么是 female,所以这是一个精确值查询的需求,因此使用 term 查询,并且因为是 sex 的字段类型是“字符串”所以加上 keyword。(这里思考一下,上个课时中说了如果不加 keyword 将不会返回查询结果,但是这里如果把 keyword 去掉也能查询相同的数据,请问是为什么?结合上节课对 keyword 的解释,你一定会找到答案的。)