Elasticsearch之bool查询
bool
查询是 Elasticsearch 中最常用的复合查询类型,允许将多个查询组合在一起。它通过逻辑操作符(如 must
、should
、must_not
和 filter
)来构建复杂的查询条件,从而满足多条件匹配、逻辑与(AND)、或(OR)、非(NOT)的查询需求。
bool
查询主要由四个部分组成:
must
:必须满足的条件(类似于 SQL 中的 AND)。should
:应该匹配的条件(类似于 SQL 中的 OR)。should
子句中的查询可以匹配也可以不匹配,但如果匹配,它会提高文档的相关性得分。must_not
:必须不匹配的条件(类似于 SQL 中的 NOT)。filter
:过滤条件,不影响文档的得分,只做精确的过滤判断。它对性能的影响较小,适合对大批量数据进行过滤。
1. 示例
GET /items/_search
{
"query": {
"bool": {
"must": [
{"match": {"name": "手机"}}
],
"should": [
{"term": {"brand": { "value": "vivo" }}},
{"term": {"brand": { "value": "小米" }}}
],
"must_not": [
{"range": {"price": {"gte": 2500}}}
],
"filter": [
{"range": {"price": {"lte": 1000}}}
]
}
}
}
2. 解释
must
(必须匹配)
-
这里使用了一个
match
查询,要求文档中的name
字段必须包含"手机"
。也就是说,只有name
包含“手机”的文档才会被返回。
should
(可选匹配)
-
这里有两个
term
查询,分别要求brand
字段为"vivo"
或"小米"
。如果文档满足其中之一,将增加其相关性得分,但即使不匹配这些条件,文档也可能被返回(前提是must
部分满足)。
must_not
(必须不匹配)
-
这里的
range
查询指定price
字段的值必须小于 2500。也就是说,价格大于或等于 2500 的文档将被排除在外。
filter
(过滤)
-
使用
range
查询来筛选price
小于或等于 1000 的文档。不同于must
和should
,filter
不会影响文档的得分,只是对结果集进行精确的过滤,性能较好。
3. 使用
在idea中可以通过SearchRequest来构造查询条件。
// 构造查询条件
SearchRequest.Builder builder = new SearchRequest.Builder();
builder.query(query -> query.bool(bool -> {
// 必须匹配name为"手机"
bool.must(must ->
must.match(match ->
match.field("name").query("手机")));
// 添加 should 条件,匹配品牌(比如vivo或小米)
bool.should(should ->
should.term(term ->
term.field("brand").value("vivo")));
bool.should(should ->
should.term(term ->
term.field("brand").value("小米")));
// 排除价格大于或等于2500的记录
bool.mustNot(mustNot ->
mustNot.range(range ->
range.field("price").gte(2500)));
// 过滤价格小于或等于1000的记录
bool.filter(filter ->
filter.range(range ->
range.field("price").lte(1000)));
return bool;
}));