网站如何做微信推广浏览器正能量网站免费图片
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;
}));
