ES中如何实现空值和非空值的查询
ES中如何实现空值和非空值的查询
·
问题描述:
ES中如何实现空值和非空值的查询?
实现方案:
ES中可以通过exists查询实现空值和非空值的查询
ES中exists查询官方说明:
https://www.elastic.co/guide/en/elasticsearch/reference/7.9/query-dsl-exists-query.html
exists用来查询指定字段存在数据的记录。
以下这些情况被认为字段值为空:
- 在json中字段的值为为null 或 [ ]
- 字段的mapping属性中,“index” 被设置为 false
- 字段值的长度超过映射中的 ignore_above 设置
- 字段值格式错误并且在映射中定义了ignore_malformed
实战演示:
1、数据准备
创建订单索引order_index,并添加测试数据。
## 删除索引
DELETE order_index
## 新建索引,通过参数ignore_above设置长度大于2的姓名会被认为是空值
PUT order_index
{
"mappings": {
"properties": {
"name": {
"type": "keyword",
"ignore_above": 2
},
"amount": {
"type": "integer"
}
}
}
}
## 添加数据
POST order_index/_bulk?refresh
{ "create": { } }
{ "amount": 100}
{ "create": { } }
{ "name": null,"amount": 80}
{ "create": { } }
{ "name": "东方不败", "amount": 15}
{ "create": { } }
{ "name": [],"amount": 80}
{ "create": { } }
{ "name": "老万", "amount": 300}
{ "create": { } }
{ "name": "老王", "amount": 45}
{ "create": { } }
{ "name": "小明", "amount": 15}
2、空值查询
说明:查询name字段为空的记录。
GET order_index/_search
{
"query": {
"bool": {
"must_not": {
"exists": {
"field": "name"
}
}
}
}
}
3、非空值查询
说明:查询name字段不为空的记录。
GET order_index/_search
{
"query": {
"exists": {
"field": "name"
}
}
}
4、sql查询
## 空值查询
POST /_sql?format=txt
{
"query": "SELECT name,amount FROM order_index Where name is null"
}
## 非空查询
POST /_sql?format=txt
{
"query": "SELECT name,amount FROM order_index Where name is not null"
}
总结
本文主要介绍了ES中如何实现空值和非空值的查询。
主要是通过exists query实现。注意exists query中会被判定为空值的4种情况。
更多推荐
已为社区贡献32条内容
所有评论(0)