Elasticsearch: 布尔(bool)过滤器--AND、OR、NOT查询、设置多个查询字段

本文介绍了Elasticsearch中布尔过滤器的概念及其使用方式。布尔过滤器能够通过must、must_not及should这三个子句来实现复杂的查询逻辑。must子句用于指定所有条件都必须满足的情况;must_not则用于排除特定条件;should子句允许至少一个条件被满足。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

概念
bool (布尔)过滤器。 这是个 复合过滤器(compound filter) ,它可以接受多个其他过滤器作为参数,并将这些过滤器结合成各式各样的布尔(逻辑)组合。
格式
一个 bool 过滤器由三部分组成:

{
   "bool" : {
      "must" :     [],
      "should" :   [],
      "must_not" : [],
   }
}

must
所有的语句都 必须(must) 匹配,与 AND 等价。
must_not
所有的语句都 不能(must not) 匹配,与 NOT 等价。
should
至少有一个语句要匹配,与 OR 等价。

**

嵌套布尔过滤器

**
对于以下这个 SQL 语句

SELECT document
FROM   products
WHERE  productID      = "KDKE-B-9947-#kL5"
  OR (     productID = "JODL-X-1937-#pV7"
       AND price     = 30 )

我们将其转换成一组嵌套的 bool 过滤器:

GET /my_store/products/_search
{
   "query" : {
      "filtered" : {
         "filter" : {
            "bool" : {
              "should" : [
                { "term" : {"productID" : "KDKE-B-9947-#kL5"}}, 
                { "bool" : { 
                  "must" : [
                    { "term" : {"productID" : "JODL-X-1937-#pV7"}}, 
                    { "term" : {"price" : 30}} 
                  ]
                }}
              ]
           }
         }
      }
   }
}

参考
Elasticsearch: 权威指南

### 使用 `spring-boot-starter-data-elasticsearch` 实现多参数查询 为了实现在 Spring Boot 应用程序中通过多个参数来查询 Elasticsearch 数据库,可以利用 `ElasticsearchRepository` 接口提供的方法定义功能。Spring Data Elasticsearch 支持多种方式构建复杂的查询逻辑。 #### 方法一:使用自定义查询语句 可以通过在接口的方法名上指定条件来进行简单的组合查询: ```java public interface ProductRepository extends ElasticsearchRepository<Product, String> { List<Product> findByTitleAndDescription(String title, String description); } ``` 这种方法适用于字段较少的情况,当涉及更多复杂条件时,则推荐采用更灵活的方式[^1]。 #### 方法二:使用 QueryDSL 或者 Criteria API 构建动态查询 对于更加复杂的场景,比如需要支持任意数量的不同类型的过滤器,应该考虑使用 QueryDSL 或者 Criteria API 来创建动态查询对象。这允许开发者根据实际传入的参数情况构造相应的布尔表达式树结构。 下面是一个例子展示如何使用 `CriteriaQuery` 进行多参数查询: ```java import org.springframework.data.elasticsearch.core.ElasticsearchOperations; import org.springframework.data.elasticsearch.core.SearchHit; import org.springframework.data.elasticsearch.core.query.Criteria; import org.springframework.data.elasticsearch.core.query.CriteriaQuery; // ... @Autowired private ElasticsearchOperations operations; public Iterable<SearchHit<Product>> searchProductsByMultipleParams( Optional<String> title, Optional<Integer> minPrice, Optional<Integer> maxPrice) { var criteria = new Criteria(); if (title.isPresent()) { criteria.and("title").is(title.get()); } if (minPrice.isPresent() && maxPrice.isPresent()) { criteria.and("price").between(minPrice.get(), maxPrice.get()); } else if (minPrice.isPresent()) { criteria.and("price").greaterThanOrEqualTo(minPrice.get()); } else if (maxPrice.isPresent()) { criteria.and("price").lessThanOrEqualTo(maxPrice.get()); } return operations.search(new CriteriaQuery(criteria), Product.class); } ``` 这段代码展示了如何接收来自客户端请求中的可选参数,并据此建立一个或多个筛选条件[^2]。 #### 方法三:使用 Native Search 查询 如果上述两种方案都不能满足需求,还可以直接编写原生 JSON 形式的查询字符串并通过 `NativeSearchQueryBuilder` 提交给 ES 集群执行。这种方式提供了最大的灵活性,几乎能够覆盖所有的查询需求。 ```java import org.springframework.data.elasticsearch.core.query.NativeSearchQuery; import org.springframework.data.elasticsearch.core.query.NativeSearchQueryBuilder; import org.springframework.data.elasticsearch.core.query.Query; // ... import static org.elasticsearch.index.query.QueryBuilders.*; // 创建查询 Query query = new NativeSearchQueryBuilder() .withQuery(boolQuery() .must(termQuery("field", "value")) .filter(rangeQuery("age").gte(0).lte(90)) ) .build(); Iterable<YourEntityClass> results = elasticsearchTemplate.queryForList(query, YourEntityClass.class); ``` 此片段说明了怎样组装包含布尔运算符以及范围限定在内的高级查询[^3]。
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值