布尔查询
Elasticsearch支持类似于在SQL中使用AND
、OR
以及NOT
的运算(在MySQL中仅支持部分语句使用NOT
运算符,例如IN
运算等,在这里我们也可以理解为使用相反的运算符),称之为布尔查询(Boolean Query)。Elasticsearch支持的布尔逻辑类型包括有以下几种:
must
:文档必须符合其中所有的查询条件,包含多个条件时类似于SQL中的AND
。should
:文档必须符合其中任意一个及以上查询条件(可由minimum_should_match
指定需要满足的条件数量),包含多个条件时类似于SQL中的OR
。must_not
:文档必须不符合其中所有的查询条件,类似于SQL中的NOT
,且返回的结果的分值都为0
。filter
:效果与使用must
相同,但不影响查询结果的分值(score)。
在使用布尔查询时,需要将查询的条件写在bool
查询语句中,且同个bool
查询语句可以有多个不同的条件。
{
"query": {
"bool": {
"must": {
"term": {
"age": 20
}
},
"must_not": {
"term": {
"gender": "male"
}
}
}
}
}
例如该查询运行后,将返回age
的值为20
且gender
的值不为"male"
的文档。
下面,我们将介绍上述各个类型查询语句在DSL(Domain Specific Language,即Elasticsearch使用的结构化查询语言)的用法。
must
查询
当使用must
查询时,文档必须符合其中包括的所有查询条件。当must
查询只包括一个查询条件时,可在DSL中使用JSON对象的形式表示,例如以下示例:
{
"query": {
"bool": {
"must": {
"term": {
"age": 20
}
}
}
}
}
该查询等同于下面对应的SQL语句:
SELECT * FROM xxx WHERE age = 20;
使用must
时可以同时指定多个查询条件,在DSL中它以数组的形式表示,效果类似于SQL中的AND
运算。例如下面的例子:
{