Java ES 多条件过滤查询条件

本文探讨了在Elasticsearch中如何处理复杂且可能冲突的查询条件,特别是在过滤空值、空字符串和数值0的情况。通过使用Java编程语言,介绍了如何利用should和mustNot组合实现灵活的条件筛选,确保查询的准确性和效率。

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

以下是通过Java程序对 ES 进行多条件的过滤查询条件,有时候查询的条件是互相冲突,比如一个需要过滤field的值有以下三种情况:

1.Null

2.空字符串(“”)

3.0

但是我们在满足了Null的情况下无法再继续满足后面2个条件,因为判断一个Field是否为空,我们经常使用

QueryBuilders.boolQuery().mustNot(QueryBuilders.existsQuery("remarks"));

但是用了mustNot之后就无法过滤其他条件了,所以我们可以通过 should(QueryBuilders.boolQuery() 这样的聚合查询方式来封装上面的方法,如下:

BoolQueryBuilder queryTotal = QueryBuilders.boolQuery();
if(StringUtils.isNotBlank(params.getRemarkFlag())){
                if("1".equals(params.getRemarkFlag())){
                    queryTotal.filter(QueryBuilders.existsQuery("remarks"));
                    queryTotal.mustNot(QueryBuilders.termQuery("remarks",""));
                    queryTotal.mustNot(QueryBuilders.termQuery("remarks",0));
                }else if("2".equals(params.getRemarkFlag())){
                    queryTotal.must(QueryBuilders.boolQuery()
                            .should(QueryBuilders.termQuery("remarks",0))
                            .should(QueryBuilders.termQuery("remarks",""))
                            .should(QueryBuilders.boolQuery()
                                    .mustNot(QueryBuilders.existsQuery("remarks"))));
                }
            }

上面的代码中当RemarkFlag等于2时,其中就用了should(QueryBuilders.boolQuery()来封装mustNot(QueryBuilders.existsQuery("remarks"))这个方法,这样查询条件相当于

" remarks == 0 || remarks == "" || remarks == Null "

### Java Elasticsearch 多条件查询实现 在 Java 中通过使用 `BoolQueryBuilder` 可以构建复杂的多条件查询逻辑。布尔查询允许组合多个子句来执行更精确的搜索操作,支持多种类型的子查询(如 `must`, `should`, 和 `filter`)。下面是一个完整的例子展示如何在 Java 中实现一个多条件查询。 #### BoolQueryBuilder 的基本结构 布尔查询的核心在于它能够将不同的查询类型组合在一起形成复杂查询。常见的布尔查询组件包括: - **Must**: 所有条件都必须满足。 - **Should**: 至少有一个条件需要满足。 - **Filter**: 条件用于过滤数据而不影响评分计算[^1]。 #### 实现示例 以下代码展示了如何利用 Spring Data Elasticsearch 或官方低级客户端 (RestHighLevelClient) 构建一个带有两个条件的布尔查询一个是针对特定用户的 term 查询;另一个是对年龄范围进行筛选的 range 查询。 ```java import org.elasticsearch.index.query.BoolQueryBuilder; import org.elasticsearch.index.query.QueryBuilders; public class ElasticSearchMultiConditionExample { public static void main(String[] args) { // 创建 BoolQueryBuilder 对象 BoolQueryBuilder boolQuery = QueryBuilders.boolQuery(); // 添加一个条件 - 用户名为 Kimchy 的 term 查询 boolQuery.must(QueryBuilders.termQuery("user", "Kimchy")); // 添加第二个条件 - 年龄大于等于 30 的 range 查询 boolQuery.filter(QueryBuilders.rangeQuery("age").gte(30)); System.out.println(boolQuery.toString()); } } ``` 上述代码片段创建了一个布尔查询实例并添加了两条规则: 1. 使用 `termQuery` 方法指定用户名为 `"Kimchy"` 的文档作为必要条件之一; 2. 利用 `rangeQuery` 定义了一条关于字段 `"age"` 的过滤器,仅保留那些数值不低于 30 的记录。 此方法可以扩展到更多维度上的约束设置上,只需继续调用相应的方法即可加入新的标准项。 #### 输出结果解释 运行以上程序会打印出 JSON 形式的最终请求体字符串形式如下所示: ```json { "bool": { "must": [ { "term": { "user": "Kimchy" }} ], "filter": [ { "range": { "age": { "gte": 30 }}} ] } } ``` 这正是发送给 Elasticsearch API 进行远程索引搜索所需的格式化参数内容。 ### 注意事项 当处理大量数据或者高并发环境下的时候,请注意优化查询语句以及合理配置集群资源分配策略,从而提升整体性能表现水平。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值