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

文章目录

  • 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.rhkb.cn/news/407325.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

单例模式 详解

单例模式 简介: 让类只初始化一次, 然后不同的地方都能获取到同一个实例 这是非常常用的一种模式, 系统稍微大一点基本上都会用到. 在系统中, 不同模块的总管理类都已单例模式居多 这里我们不仅使用c实现单例模式, 也会用python2实现一遍 python代码 想要看更详细的python单…

手动下载Sentinel-1卫星精密轨道数据

轨道信息对于InSAR(干涉合成孔径雷达)数据处理至关重要,因为它影响从初始图像配准到最终形变图像生成的整个过程。不准确的轨道信息会导致基线误差,这些误差会以残差条纹的形式出现在干涉图中。为了消除由轨道误差引起的系统性误差…

Swift 6.0 如何更优雅的抛出和处理特定类型的错误

概述 从 Swift 语言诞生那天儿起,它就不厌其烦一遍又一遍地向秃头码农们诉说着自己的类型安全和高雅品味。 不过遗憾的是,作为 Swift 语言中错误处理这最为重要的一环却时常让小伙伴们不得要领、满腹狐疑。 在本篇博文中,您将学到如下内容&…

基于网格尺度的上海市人口分布空间聚集特征分析与冷热点识别

在上篇文章提到了同一研究空间在不同尺度下的观察可能会带来不同的见解和发现,这次我们把尺度缩放到网格,来看网格尺度下的空间自相关性、高/低聚类,这些,因为尺度缩放到网格尺度了,全国这个行政区范围就显的太大了&am…

基于Shader实现的UGUI描边解决方案遇到的bug

原文链接:https://www.cnblogs.com/GuyaWeiren/p/9665106.html 使用这边文章介绍的描边解决方案时遇到了一些问题,就是文字的描边经常会变粗,虽然有的时候也可以正常显示描边,但是运行一会儿描边就不正常了,而且不正常…

UDP+TCP

一、UDP协议 1.recvfrom:recvform(int sockfd,void *buf,size_t len,int flags,struct sockaddr *src_addr,socklen_t *addrlen); 参数:socket的fd; 保存数据的空间地址 ; 空间大小; 默认接收方式(默认阻塞&#xf…

【案例56】安全设备导致请求被拦截

问题现象 访问相关报表 第二次访问发现有相关的连接问题 问题分析 服务器访问相关节点,发现相关节点无此问题。从客户的客户端访问缺有问题。在nclog中发现如下日志,链接被重置。 直接访问服务器无丢包现象。客户端未开防火墙。装了杀毒软件已经卸载。…

简单记录:两台服务器如何超快速互传文件/文件夹

在服务器间传输文件和文件夹是一个常见的任务,尤其是在需要同步数据或进行备份时。以下是使用 scp 命令在两台服务器之间进行文件传输的基本步骤。 服务器A 至 服务器B:文件传输指南 前提条件 确保服务器A和服务器B之间网络互通。确认您有权限访问目标…

C语言 之 整数在内存中的存储、大小端字节序和字节序的判断

文章目录 整数在内存中的存储大小端字节序和字节序判断大小端有大小端的原因高位和地位怎么区分?图例判断机器大端还是小端的例题 整数在内存中的存储 整数的2进制表示方法有三种,即 原码、反码和补码 三种表示方法均有符号位和数值位两部分&#xff0c…

微信小程序获取当前位置并自定义浮窗

1、在腾讯地图api申请key(添加微信小程序的appid)。 每个Key每日可以免费使用100次,超过次数后会导致地图不显示。可以多申请几个Key解决。WebService API | 腾讯位置服务腾讯地图开放平台为各类应用厂商和开发者提供基于腾讯地图的地理位置…

当AI成为你的私人医生,与AI“医”路同行的奇妙体验

“ 从挂号到诊疗,再到后续的健康管理,人工智能(AI)正以一种全新的方式融入我们的生活。上海市第一人民医院的创新实践,便是这一变革的生动注脚。 ” AI就医助理:从“助手”到“伙伴” 当你踏入医院大门…

猜数3次-python

题目要求: 定一个数字(1-10,随机产生,通过3次判断来猜出数字) 数字随机产生,范围1-10有三次机会猜测数字,通过3层嵌套判断实现每次猜不中会提示大了或者小了 ps:补充随机函数 imp…

Spring源码解析(34)之Spring事务回滚流程

一、前言 在上一个篇章我们主要介绍了Spring事务的运行流程,也带着一步步debug看了整个事务的运行流程,但是还是欠缺了Spring事务的回滚的流程。 在上篇也主要介绍了Spring事务的传播特性,这里还是要看一下Spring事务的传播特性,因…

定制开发AI智能名片商城小程序:重塑品牌曝光的创新推手

摘要:随着移动互联网技术的飞速发展,小程序作为一种轻量级应用形态,正逐步成为企业品牌传播与商业变现的重要渠道。本文将探讨在品牌定位中,如何将“定制开发AI智能名片商城小程序”作为品牌曝光的核心推手,通过强化品…

力扣 | 最长公共子序列 | 动态规划 | 最长公共子序列长度、最长公共子序列

文章目录 一、1143. 最长公共子序列二、求最长公共子序列三、变式一、1035. 不相交的线二、1312. 让字符串成为回文串的最少插入次数 一、1143. 最长公共子序列 LeetCode:1143. 最长公共子序列 这是一道典型的二维动态规划问题,甚至面试都能被面到。 这…

c++ | 模板进阶

前言 本篇博客讲解c中的模板的一些其他知识 💓 个人主页:普通young man-CSDN博客 ⏩ 文章专栏:C_普通young man的博客-CSDN博客 ⏩ 本人giee: 普通小青年 (pu-tong-young-man) - Gitee.com 若有问题 评论区见📝 🎉欢…

推荐一个国内Midjourney镜像站,限时充值享5折优惠 结尾附实测图片

作为一名绘画爱好者,你是否曾梦想过将脑海中的画面转化为现实?现在,有了群嘉智创平台(ai.qunzjia.cn),这一切都将成为可能。群嘉智创是国内领先的AI对话与Midjourney绘画服务平台,通过接入国内多…

[Meachines] [Easy] Legacy nmap 漏洞扫描脚本深度发现+MS08-067

信息收集 IP AddressOpening Ports10.10.10.4TCP:135,139,445 $ nmap -p- 10.10.10.4 --min-rate 1000 -sC -sV -Pn PORT STATE SERVICE VERSION 135/tcp open msrpc Microsoft Windows RPC 139/tcp open netbios-ssn Microsoft Windows n…

论文阅读1 Scaling Synthetic Data Creation with 1,000,000,000 Personas

Scaling Synthetic Data Creation with 1,000,000,000 Personas 链接:https://github.com/tencent-ailab/persona-hub/ 文章目录 Scaling Synthetic Data Creation with 1,000,000,000 Personas1. 摘要2. 背景2.1 什么是数据合成2.2 为什么需要数据合成2.3 10亿种人…

基于Kotlin Multiplatform的鸿蒙跨平台开发实践

一、 背景 在 2023 年的华为开发者大会(HDC)上,华为预告了一个全新的鸿蒙系统 Harmony Next 版本。与之前的鸿蒙系统不同,Harmony Next完全摒弃了对 AOSP 的兼容,彻底基于 OpenHarmony 开源鸿蒙实现。这意味着该系统将…