1.简介
一条SQL中可能有多个等值、范围、in查询,它们之间在SQL中使用and
或者or
的关系符号连接。那么在ES中自然也是有相关查询的独特写法的。
2.Boolean聚合查询
这种查询等价于SQL中的and、or查询符号。具体官方文档的翻译我并没有读太懂。但是我们最终的目标不是会说,而是在实际的开发中可以灵活的使用。
2.1must等价于and
在boolean查询中must就是sql中的and。
- 需求:查询shopId为92的,sales在10到200之间的数据
SQL语句
select * from goods where shopId = 92 and sales>=10 and sales <=200;
ES查询
{
"query": {
"bool": {
"must": [
{
"term": {
"shopId": {
"value": 92
}
}
},
{
"range": {
"sales": {
"gte": 10
}
}
},
{
"range": {
"sales": {
"lte": 200
}
}
}
]
}
}
}
2.2should等价于or
需求:查询shopId为92或93的数据
SQL语句
select * from goods where shopId = 92 or shopId =93;
ES查询
{
"query": {
"bool": {
"should": [
{
"term": {
"shopId": {
"value": 92
}
}
},
{
"term": {
"shopId": {
"value": 93
}
}
}
]
}
}
}
2.3must和should的优先关系
同and和or的关系一样,先and后or。那可能就有疑问,(a=1 and b=2) or (c=3 and d =1)这样的咋搞?
其实bool查询也可以嵌套一层bool查询。
{
"query": {
"bool": {
"should": [
{
"bool": {
"must": [
{...}
]
}
}
]
}
}
}
2.4另外两个查询方式
①must_not:一定不相当于SQL not用法,比如not in
②filter:过滤的作用,效果和must等同,不同点在于匹配的得分是恒定的 0