【开源社区】Elasticsearch(ES)中 exists 查询空值字段的坑

news2024/9/23 13:16:45

文章目录

  • 1、概述
  • 2、使用 null_value 处理空值
  • 3、使用 exists 函数查询值为空的文档
    • 3.1 使用场景
    • 3.2 ES 中常见的空值查询方式
    • 3.3 常见误区
    • 3.4 使用 bool 查询函数查询空值字段
    • 3.5 exists 函数详解
      • 3.5.1 bool 查询的不足
      • 3.5.3 exists 的基本使用
    • 3.6 完美方案

1、概述

本文主要解决在 ES 中如何处理空只或者 NULL 值,如检索值为空的文档,如何存储空值或 NULL 值等。

2、使用 null_value 处理空值

详见:ES中使用 null_value 处理空值字段

3、使用 exists 函数查询值为空的文档

3.1 使用场景

在实际工作中,不可避免的可能会遇到以下需求:

查询 xx 字段 value = "" and value = null 的文档,或者value != "" and value != null 的文档

3.2 ES 中常见的空值查询方式

在本文第二小节相关文章的描述中,在 ES 中对于空值字段,通常采取的处理方式有两种:

  • 空值替换:预先对空值字段采取替换,即使用 null_value 设置针对于空值字段的替换值,具体用法详见文章内:传送门
  • exists 函数:exists 函数可用以判断字段是否存在,特定场景下可以用于对空值字段的查询

3.3 常见误区

我们仍以下面案例作为示例数据,来演示 esists 的具体使用细节

DELETE null_value_index
PUT null_value_index
{
  "mappings": {
    "properties": {
      "null_field": {
        "type": "text", 
        "fields": {
          "keyword":{
            "type": "keyword"
          }
        }
      }
    }
  }
}

# 写入测试数据
PUT null_value_index/_bulk
{"index":{"_id":1}}
{"null_field":null}
{"index":{"_id":2}}
{"null_field":"null"}
{"index":{"_id":3}}
{"null_field":""}
{"index":{"_id":4}}
{"null_field":" "}
{"index":{"_id":5}}
{"null_field":[]}

对于上述示例索引中的数据,如果我们希望 查询 null_field 字段不为空的所有文档,读者可以思考一下如何实现:

常见的误区:
以下是最容易产生的错误答案:

# 【错误答案】思路是查询字段值为""的文档
GET null_value_index/_search
{
  "query": {
    "bool": {
      "must": [
        {
          "match": {
            "null_field": ""
          }
        }
      ]
    }
  }
}
# 或者:
# 【错误答案】思路是查询字段 null_field != "" 的文档
GET null_value_index/_search
{
  "query": {
    "bool": {
      "must_not": [
        {
          "match": {
            "null_field": ""
          }
        }
      ]
    }
  }
}

执行以上查询发现结果是空的
在这里插入图片描述

3.4 使用 bool 查询函数查询空值字段

对于使用 must 或者 must_not 查询空值字段的方式是否可行呢?

虽然 3.3 小节中的答案是错误的,但是如果在此基础上稍加改变,将 match 查询改为 term 查询,就会得到争取的结果:

GET null_value_index/_search
{
  "query": {
    "bool": {
      "must": [
        {
          "term": {
            "null_field.keyword": ""
          }
        }
      ]
    }
  }
}

执行结果如下(注意字段从 null_field 改为了 null_field.keyword):
在这里插入图片描述

对于上述结果,不难发现其扔存在一定问题:对于此类需求,往往需要查找的是所有空值字段,包括 ""、空白符、" "、null 等。解决办法也很简单:

把 term 换成 terms 即可

GET null_value_index/_search
{
  "query": {
    "bool": {
      "must": [
        {
          "terms": {
            "null_field.keyword": [
              "",
              " "
            ]
          }
        }
      ]
    }
  }
}

在这里插入图片描述

3.5 exists 函数详解

3.5.1 bool 查询的不足

对于使用 bool 查询的方式查询空值字段是否能完美解决问题呢?

答案是:不能! id: 1 的这条数据并未被查询到,
在这里插入图片描述
肯定有大聪明会说,那是因为 terms 查询中并未添加 null,那么好,我们加上,发现会出现异常:
在这里插入图片描述
请注意,这里是 null 而非字符串 "null"

3.5.3 exists 的基本使用

那么对于以上问题,就需要使用 exists 函数来帮助解决。

首先要注意的是,exists 函数的意义是查询某个字段是不是存在,而非字段值。

举个例子,当我们执行以下代码的时候,其语义为:查询所有不存在 un_exists_field 字段的文档

GET null_value_index/_search
{
  "query": {
    "bool": {
      "must_not": [
        {
          "exists": {
            "field": "un_exists_field"
          }
        }
      ]
    }
  }
}

当我们使用 exists 去查询 null 会出现什么结果呢?
在这里插入图片描述
请注意看,结果中包含了两条数据,被 exists 查询的字段都是存在的,但是却被召回了,这意味着:值为 null 或者 空数组 的字段,会被当做这个字段是不存在的

3.6 完美方案

基于 exists 这个特性,就弥补了 bool 查询不能查到 null 和 [] 这两种情况的缺陷,那么就可以将这两个查询结合起来使用

为了方便对比结果,我们加入第六条测试数据:

PUT null_value_index/_doc/6
{
  "null_field":"只是唯一有值的记录"
}

然后执行测试代码

# 查询所有空值字段, 包括 null""、空白符、空数组等
# 第一个子查询匹配 null 和 空数组,第二个子查询匹配其他空白符和 ""GET null_value_index/_search
{
  "query": {
    "bool": {
      "should": [
        {
          "bool": {
            "must_not": [
              {
                "exists": {
                  "field": "null_field"
                }
              }
            ]
          }
        },
        {
          "terms": {
            "null_field.keyword": [
              "",
              " "
            ]
          }
        }
      ]
    }
  }
}

执行结果如图:
在这里插入图片描述
字段值为“空值”的 id:1/3/4/5 四条记录都被召回了,而 id:2/6 因为字段值不为空或 null,因此没有被召回,虽然 id: 2 的值为 “null”,但其也只不过为一个值为 “null” 的字符串而已,如果不希望被召回,将其添加到 terms 的 value 数组中即可。

同理,如果我们想 查询值不为空的所有记录,将上述代码改为以下代码即可

# 查询所有非空值字段
# 第一个子查询,匹配所有值非 null 和 空数组 的记录
# 第二个子查询,在第一个基础上,过滤掉所有值为 """ " 的字段
GET null_value_index/_search
{
  "query": {
    "bool": {
      "must":[ 
        {
          "exists": {
            "field": "null_field"
          }
        },
        {
          "bool": {
            "must_not": [
              {
                "terms": {
                  "null_field.keyword": [
                    "",
                    " "
                  ]
                }
              }
            ]
          }
        }
      ]
    }
  }
}

执行结果如下:
在这里插入图片描述
同理,如果不希望 “null” 被查询到,将其添加到第二个子查询即可。

推荐阅读:【开源社区】Elasticsearch(ES)中空值字段 null_value 及通过exists查找非空文档

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2053960.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

环网交换机 环网数采仪 环网采集器确保数据传输无懈可击!

计讯物联Pro级双向防护,升级环网采集器确保数据传输无懈可击! 在物联网(IoT)的世界里,数据流动如同城市交通,需要高效且可靠的网络来支撑。但就像城市交通可能遇到意外拥堵或道路封闭,传统网络在数据传输上也会遇到障…

Redis RDB三两事

rdb:将数据库的快照以二进制格式保存在文件中,redis重启后直接加载数据。可以通过save和bgsave命令生成rdb。当然我们可以在生成rdb文件时指定规则,例如 save 60 1000 如果60秒内不少于1000个key发生了改动,则生成一个新的rdb文件…

苹果电脑能玩Steam游戏吗?Steam对苹果笔记本要求高吗 steam苹果下载安装教程

对于游戏爱好者而言,如何在Mac上安装并使用Steam玩游戏成为一个重要的问题,Steam作为全球最大的数字发行平台和游戏社区,为玩家提供了丰富的游戏资源和社交交流平台。然而,由于Mac和Windows系统之间存在差异,很多人不确…

Linux进程间通信方式对比

参考: Linux进程间通信总结-百度开发者中心 Linux操作系统提供了多种进程间通信(IPC)的方式,每种方式都有其独特的应用场景和优缺点。下面将对Linux下的进程间通信方式进行总结和比较。 管道(Pipe) 管道是最…

小白学大模型:GLM 调用教程

最近这一两周看到不少互联网公司都已经开始秋招提前批面试了。 不同以往的是,当前职场环境已不再是那个双向奔赴时代了。求职者在变多,HC 在变少,岗位要求还更高了。 最近,我们又陆续整理了很多大厂的面试题,帮助一些…

计算机网络:DNS、子网掩码、网关

参考: https://blog.csdn.net/weixin_55255438/article/details/123074896 https://zhuanlan.zhihu.com/p/65226634 在计算机网络中,DNS(Domain Name System,域名系统)、子网掩码(Subnet Mask)…

优化RoBERTa:在AMD上使用混合精度进行微调

Optimizing RoBERTa: Fine-Tuning with Mixed Precision on AMD — ROCm Blogs 简介 在这篇博客中,我们将探讨如何微调鲁棒优化的BERT预训练方法([RoBERTa](https://arxiv.org/abs/1907.11692))大型语言模型,重点在于PyTorch的混…

遥感之大豆提取

主要记录大豆提取常用的光学以及sar等特征&#xff0c;以便在实验中实现考虑以下特征得到初步结果&#xff0c;在其基础上进行不同维度的优化。 参考文献**<Mapping annual 10-m soybean cropland with spatiotemporal sample migration>** 文档总体描述&#xff1a; …

Java类的加载器分类

启动类加载器 使用-XX:TraceClassLoading参数得到 扩展类加载器 应用程序类加载器 用户自定义类加载器 测试不同类的加载器

高性能web服务器--nginx

下载nginx [rootnginx ~]# wget -c https://nginx.org/download/nginx-1.24.0.tar.gz [rootnginx ~]# tar zxf nginx-1.24.0.tar.gz创建nginx用户 [rootnginx nginx-1.24.0]# useradd -s /sbin/nologin -M nginx先安装依赖 dnf install gcc pcre-devel zlib-devel openssl-d…

来了...腾讯内推的软件测试面试PDF 文档(共107页)

不多说&#xff0c;直接上干货&#xff08;展示部分以腾讯面试纲要为例&#xff09;完整版文末领取 通过大数据总结发现&#xff0c;其实软件测试岗的面试都是差不多的。常问的有下面这几块知识点&#xff1a; 全网首发-涵盖16个技术栈 第一部分&#xff0c;测试理论&#x…

C++:平衡二叉搜索树之红黑树

一、红黑树的概念 红黑树&#xff0c; 和AVL都是二叉搜索树&#xff0c; 红黑树通过在每个节点上增加一个储存位表示节点的颜色&#xff0c; 可以是RED或者BLACK&#xff0c; 通过任何一条从根到叶子的路径上各个节点着色方式的限制&#xff0c;红黑树能够确保没有一条路径会比…

黑马头条vue2.0项目实战(九)——编辑用户资料

目录 1. 创建组件并配置路由 2. 页面布局 3. 展示用户信息 4. 修改昵称 5. 修改性别 6. 修改生日 7. 修改头像 7.1 图片上传预览 7.2 使用纯客户端的方式处理用户头像上传预览 7.3 头像裁切 7.4 纯客户端的图片裁切上传流程 7.5 Cropper.js 图片裁剪器的基本使用 …

盘点.软件测试工程师常见的面试题。面试官说我要定你了!

今天我们来聊聊软件测试工程师的面试题有哪些&#xff0c;2024年的8月份马上就过完了&#xff0c;金九银十就业季&#xff0c;跳槽季马上又要来了&#xff0c;毕竟在面试的战场上&#xff0c;知己知彼方能百战不殆。嗯嗯&#xff0c;不错说的真好&#xff01; 1、您所熟悉的测试…

24/8/15算法笔记 项目练习冰湖

import gym from matplotlib import pyplot as plt %matplotlib inline import os os.environ[SDL_VIDEODRIVER]dummy #设置环境变量 SDL_VIDEODRIVERdummy 是在使用基于 SDL (Simple DirectMedia Layer) 的应用程序时&#xff0c;告诉应用程序不使用任何视频驱动程序。这通常…

云计算实训29——mysql主从复制同步、mysql5.7版本安装配置、python操作mysql数据库、mycat读写分离实现

一、mysql主从复制及同步 1、mysql主从自动开机同步 2、配置mysql5.7版本 mysql-5.7.44-linux-glibc2.12-x86_64.tar 启动服务、登录 对数据库进行基本操作 3、使用python操纵mysql数据库 4、编辑python脚本自动化操纵mysql数据库 二、mycat读写分离实现 1.上传jdk和mycat安装…

【C语言】双链表

&#x1f984;个人主页:小米里的大麦-CSDN博客 &#x1f38f;所属专栏:C语言数据结构_小米里的大麦的博客-CSDN博客 &#x1f381;代码托管:黄灿灿/数据结构 (gitee.com) ⚙️操作环境:Visual Studio 2022 目录 一、什么是双链表&#xff1f; 二、双链表温习 1. 双链表的结构…

Windows 11 Build 27686 上手体验:2TB FAT32、更好的沙盒等功能

Windows 11 Build 27686 现已在 Insider Program 的 Canary 频道发布&#xff0c;其中包含一些有趣的内容。该版本确认了微软更改 FAT32 大小限制的计划&#xff0c;并将其大小限制从 32GB 提高到 2TB。与此同时&#xff0c;沙盒也得到了改进。让我们来详细了解一下此次更新。 …

Unity 麦扣 x 勇士传说 全解析 之 怪物基类(2)(附各模块知识的链接,零基础也包学会的牢弟)(案例难度:★★☆☆☆)

1.怪物的动画逻辑一览 2.怪物的受伤死亡逻辑一览 using System.Collections; using System.Collections.Generic; using System.Xml; using UnityEngine;public class Monster : MonoBehaviour {[Header("速度")]public float normalSpeed;public float chaseSpeed;…

Xinstall神器来袭:落地页与App无缝衔接,用户转化不再是难题

在移动互联网时代&#xff0c;App的推广与运营成为了各行各业的关键一环。然而&#xff0c;许多推广者在落地页跳转App这一环节上遇到了不小的挑战。用户点击落地页后&#xff0c;往往需要经过繁琐的步骤才能跳转到App&#xff0c;这不仅降低了用户体验&#xff0c;还严重影响了…