查询es中没有的字段,或者字段为0的

本文介绍如何使用Elasticsearch查询缺少特定字段的文档。通过废弃的missingQuery方法和推荐的boolQuery结合existsQuery来实现这一目标。
//5、missing query:返回没有字段或值为null或没有值的文档。
QueryBuilders.missingQuery("accountGuid")
//java client标记该方法已经过时,推荐用exist代替 如下
QueryBuilders.boolQuery().mustNot(QueryBuilders.existsQuery("accountGuid"));

```markdown 要查询 Elasticsearch 中 `failureExtensionDesc` 字段**不为空**的文档,可以使用以下几种方式,具体取决于你的查询环境(如 Kibana、REST API 或 Java 代码)。 --- ### 查询概述 目标:筛选出 `failureExtensionDesc` 字段存在且非空的文档。 在 Elasticsearch 中,“不为空”意味着: - 字段存在; - 字段值不是 `null`、空数组 `[]` 或空字符串 `""`。 --- ### 推荐 DSL 查询语句 ```json { "query": { "bool": { "must": [ { "exists": { "field": "failureExtensionDesc" } } ], "must_not": [ { "term": { "failureExtensionDesc.keyword": "" } } ] } } } ``` #### 解释: - `"exists"`:确保字段存在(非 `null` 和未定义)。 - `"must_not" + "term"`:排除字段值为空字符串的情况。 - 使用 `.keyword` 子字段精确匹配空字符串。 > ⚠️ 如果该字段是文本类型(text),建议使用 `.keyword` 进行过滤以避免分词影响。 --- ### 其他常见情况 #### 1. 如果字段可能是空数组或包含多个值: ```json { "query": { "bool": { "must": [ { "exists": { "field": "failureExtensionDesc" } } ], "filter": { "script": { "script": """ if (doc['failureExtensionDesc'].size() == 0) { return false; } for (v in doc['failureExtensionDesc']) { if (v != null && v.trim() != '') return true; } return false; """ } } } } } ``` 适用于复杂场景,但性能较低,慎用于大数据量。 --- ### 在 Java 中使用 QueryBuilder 实现(Elasticsearch REST High Level Client) ```java BoolQueryBuilder boolQuery = QueryBuilders.boolQuery(); // 字段必须存在 boolQuery.must(QueryBuilders.existsQuery("failureExtensionDesc")); // 且不能等于空字符串 boolQuery.mustNot(QueryBuilders.termQuery("failureExtensionDesc.keyword", "")); SearchSourceBuilder sourceBuilder = new SearchSourceBuilder(); sourceBuilder.query(boolQuery); SearchRequest searchRequest = new SearchRequest("your_index_name"); searchRequest.source(sourceBuilder); ``` --- ### 知识点 - **exists 查询**:判断字段是否存在,排除 `null` 或缺失字段。 - **term 查询**:用于精确匹配,结合 `.keyword` 可处理空字符串。 - **布尔组合查询**:`must` 与 `must_not` 联合使用实现“非空”逻辑。 ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值