BoolQueryBuilder 是 Elasticsearch 中用来构建 布尔查询(Boolean Query)的一个工具,它允许将多个查询条件组合在一起,形成一个复杂的查询结构。BoolQueryBuilder 是 Elasticsearch 中用于查询构建的关键类之一,尤其是在需要多个查询条件组合时,它提供了灵活且强大的支持。 BoolQueryBuilder 的作用 BoolQueryBuilder 通过将多个子查询组合在一起,支持多种布尔逻辑运算,常见的运算包括: must:表示必须匹配的条件(AND)。 should:表示应当匹配的条件(OR)。即使不匹配也不会排除文档,适用于加权查询。 must_not:表示不应该匹配的条件(NOT)。 filter:表示过滤条件。过滤条件通常不影响评分,它用于精确匹配。 boost:可以对查询的结果进行加权,提高某些条件的匹配优先级。 这些不同的子查询可以灵活地组合在一起,从而构建复杂的查询逻辑。 主要的子查询功能 must: 查询结果必须匹配的条件(类似于 SQL 中的 AND)。 should: 查询结果匹配的条件,可以为多个,至少匹配其中之一即可(类似于 SQL 中的 OR)。如果至少有一个 should 子句匹配,文档就会被包含在结果中。 must_not: 查询结果必须不匹配的条件(类似于 SQL 中的 NOT)。 filter: 用于过滤条件,过滤不会影响评分,通常用于精确匹配查询(类似于 SQL 中的 WHERE)。 BoolQueryBuilder 的常见用途 1. AND 查询 (must) must 用来确保文档同时匹配多个查询条件,类似于 SQL 中的 AND。 java BoolQueryBuilder boolQuery = QueryBuilders.boolQuery() .must(QueryBuilders.matchQuery("title", "Elasticsearch")) .must(QueryBuilders.matchQuery("content", "search engine")); 上面代码表示查询标题包含 "Elasticsearch" 且内容包含 "search engine" 的文档。 2. OR 查询 (should) should 用来表示一个文档可以匹配多个查询条件中的任意一个,类似于 SQL 中的 OR。当有多个 should 条件时,只要匹配一个就会返回文档。 java BoolQueryBuilder boolQuery = QueryBuilders.boolQuery() .should(QueryBuilders.matchQuery("title", "Elasticsearch")) .should(QueryBuilders.matchQuery("content", "search engine")); 此查询会返回标题或内容中包含 "Elasticsearch" 或 "search engine" 的文档。 3. NOT 查询 (must_not) must_not 用来表示排除匹配的条件,类似于 SQL 中的 NOT。 java BoolQueryBuilder boolQuery = QueryBuilders.boolQuery() .must(QueryBuilders.matchQuery("title", "Elasticsearch")) .mustNot(QueryBuilders.matchQuery("author", "John Doe")); 此查询返回标题包含 "Elasticsearch" 且作者不是 "John Doe" 的文档。 4. 过滤查询 (filter) filter 适用于不影响评分的精确查询,通常用于范围查询、日期查询等。使用 filter 可以提升性能,因为它不计算评分。 java BoolQueryBuilder boolQuery = QueryBuilders.boolQuery() .must(QueryBuilders.matchQuery("title", "Elasticsearch")) .filter(QueryBuilders.rangeQuery("publish_date").gte("2024-01-01")); 此查询会返回标题包含 "Elasticsearch" 且发布日期在 2024 年 1 月 1 日之后的文档。 5. 组合多个条件 你可以将多个 must、should、must_not 和 filter 条件进行组合,构建更复杂的查询逻辑。 java BoolQueryBuilder boolQuery = QueryBuilders.boolQuery() .must(QueryBuilders.matchQuery("title", "Elasticsearch")) // title 必须包含 Elasticsearch .should(QueryBuilders.matchQuery("content", "search engine")) // content 包含 search engine,但不是强制的 .mustNot(QueryBuilders.matchQuery("author", "John Doe")) // author 不包含 John Doe .filter(QueryBuilders.rangeQuery("publish_date").gte("2024-01-01")); // publish_date 大于等于 2024-01-01 这个查询返回所有标题包含 "Elasticsearch",但内容包含 "search engine"(但不强制),且作者不是 "John Doe" 且发布日期在 2024 年 1 月 1 日或之后的文档。 BoolQueryBuilder 示例 假设你有一个包含以下字段的文档:title、author、content 和 publish_date,你想查询标题包含 "Elasticsearch" 且内容包含 "search engine",但是排除作者为 "John Doe" 的文档,并且限制查询日期为 2024 年之后发布的文档。代码如下: java import org.elasticsearch.index.query.BoolQueryBuilder; import org.elasticsearch.index.query.QueryBuilders; public class ElasticsearchQueryExample { public static void main(String[] args) { // 创建 BoolQueryBuilder BoolQueryBuilder boolQuery = QueryBuilders.boolQuery() .must(QueryBuilders.matchQuery("title", "Elasticsearch")) // title 必须包含 Elasticsearch .must(QueryBuilders.matchQuery("content", "search engine")) // content 必须包含 search engine .mustNot(QueryBuilders.matchQuery("author", "John Doe")) // author 不能是 John Doe .filter(QueryBuilders.rangeQuery("publish_date").gte("2024-01-01")); // publish_date >= 2024-01-01 // 此时,可以将 boolQuery 作为查询的一部分执行查询 System.out.println(boolQuery.toString()); } } 总结 BoolQueryBuilder 允许将多个查询条件通过 must、should、must_not、filter 等布尔操作符进行组合,从而构建复杂的查询逻辑。 must 用于强制匹配条件,should 用于增加匹配的灵活性,must_not 用于排除条件,filter 用于精确匹配(不影响评分)。 通过使用 BoolQueryBuilder,你可以更灵活和精细地控制查询的行为,满足各种业务需求。
BoolQueryBuilder
于 2024-12-27 14:20:19 首次发布