Terms-level Query之Exists Query

article/2025/10/25 19:06:56

​Exists Query属于Term-level Query查询, 查询某字段值不为空的文档。脑图如下:

内容说明:

本文内容同微信公众号【凡登】,关注不迷路,欢迎加入一起共同学习。原文链接:Terms-level Query之Exists Query

目录

一、语法:

1、检索字段上存在值的文档

2、检索字段上不存在值的文档

二、Exists Query示例

0、数据准备

1、当字段值为空的演示示例:

2、当index:false情况下 演示示例

3、mapping设置ignore_above演示示例

4、mapping设置ignore_malformed演示示例

三、总结:


官方文档:

https://www.elastic.co/guide/en/elasticsearch/reference/7.13/query-dsl-exists-query.html

一、语法:

1、检索字段上存在值的文档

GET /_search{  "query": {    "exists": {      "field": <field_name>    }  }}

参数说明:

  • field : 被检索的字段

通过bool改变Exists查询方式进行反向查询,即查询字段不存在值的文档。

2、检索字段上不存在值的文档

语法:

GET /_search{  "query": {    "bool": {      "must_not": {        "exists": {          "field": <field_name>        }      }    }  }}

二、Exists Query示例

通过Exists Query可以查询字段值不为空的文档,那么在以下情况下

比如:

  • source中值可能为null, []

  • 字段mapping参数index:false

  • 字段值长度超过mapping中定义的ignore_above

  • 当mapping中设置ignore_malformed,文档中字段值类型与mapping中定义的不一致

那么此时Exists Query会有什么样的表现?

0、数据准备

通过示例验证,演示数据准备如下:

DELETE exists_query_demo_index_001
// 以下样例数据经过特殊设计,用于后续检索使用,// name字段用于验证空值// address 字段用于验证 index:false// content 字段用于验证ignore_above// age 字段用于验证ignore_malformed# 定义mappingPUT exists_query_demo_index_001{  "mappings": {    "properties": {      "name":{        "type":"keyword",        "fields": {          "null_value":{            "type":"keyword",            "null_value": "NULL" // 自定义空值          },          "text_value":{            "type":"text"          }        }      },      "address":{        "type":"text",        "fields": {          "keyword_value_index_false":{            "type":"keyword",            "index": false  // index设置为false,即不被索引          },           "text_value_index_false":{            "type":"text",            "index": false          }        }      },      "content":{        "type":"keyword",        "ignore_above": 8  // 忽略字符长度大于8字段      },      "age":{        "type":"integer",        "ignore_malformed": true  // 忽略值异常字段值      }    }  }}// 批量写入文档POST exists_query_demo_index_001/_bulk?refresh=true{"index":{"_id":1}}{"name":"Fan","address":"BJ_1","content":"helloFan","age":17}{"index":{"_id":2}}{"name":"Deng","address":"BJ_2","content":"helloDeng","age":"18岁"}{"index":{"_id":3}}{"name":"FanDeng","address":"BJ_3","content":"helloFanDeng","age":19}{"index":{"_id":4}}{"name":"","address":"BJ_4","content":"hello_","age":"20岁"}{"index":{"_id":5}}{"name":null,"address":"BJ_5","content":"hello_null","age":21}{"index":{"_id":6}}{"name":"NULL","address":"BJ_6","content":"hello_NULL","age":22}{"index":{"_id":7}}{"name":[],"address":"BJ_7","content":"hello_[]","age":"23岁"}{"index":{"_id":8}}{"name":[""],"address":"BJ_8","content":"hello_[empty_char]","age":24}{"index":{"_id":9}}{"name":[null],"address":"BJ_9","content":"hello_[null]","age":25}{"index":{"_id":10}}{"name":["NULL"],"address":"BJ_10","content":"hello_[NULL]","age":26}{"index":{"_id":11}}{"name":["","Fan"],"address":"BJ_11","content":"hello_[empty_char,Fan]","age":27}{"index":{"_id":12}}{"name":[null,"Fan"],"address":"BJ_12","content":"hello_[null,Fan]","age":28}{"index":{"_id":13}}{"name":["NULL","Fan"],"address":"BJ_13","content":"hello_[NULL,Fan]","age":29}//查询数据是否写入GET exists_query_demo_index_001/_search{  "track_total_hits": true, // 显示检索数据的记录数  "size": 0  // 不显示source}结果:{  "took" : 0,  "timed_out" : false,  "_shards" : {    "total" : 1,    "successful" : 1,    "skipped" : 0,    "failed" : 0  },  "hits" : {    "total" : {      "value" : 13,  // 13条数据全部写入      "relation" : "eq" //     },    "max_score" : null,    "hits" : [ ]  }}

1、当字段值为空的演示示例:

GET exists_query_demo_index_001/_search{  "track_total_hits": true,   "size": 20,   "query": {    "exists": {      "field": "name"    }  }}结果显示:id为5,7,9的文档name不存在值即当字段值为null, 空数组[]或[null] 的时候,Exists Query检索不到相关文档以下query检查与上述查询结果相通GET exists_query_demo_index_001/_search{  "track_total_hits": true,   "size": 20,   "query": {    "exists": {      "field": "name.text_value"    }  }}即类型为keyword以及text的字段,Exists Query查询结果相同我们通过反向查询看看字段name不存在值的文档有哪些GET exists_query_demo_index_001/_search{  "track_total_hits": true,   "query": {    "bool": {      "must_not": [        {          "exists": {            "field": "name"          }        }      ]    }  }}结果:{  "took" : 0,  "timed_out" : false,  "_shards" : {    "total" : 1,    "successful" : 1,    "skipped" : 0,    "failed" : 0  },  "hits" : {    "total" : {      "value" : 3,      "relation" : "eq"    },    "max_score" : 0.0,    "hits" : [      {        "_index" : "exists_query_demo_index_001",        "_type" : "_doc",        "_id" : "5",        "_score" : 0.0,        "_source" : {          "name" : null,          "address" : "BJ_5",          "content" : "hello_null",          "age" : 21        }      },      {        "_index" : "exists_query_demo_index_001",        "_type" : "_doc",        "_id" : "7",        "_score" : 0.0,        "_ignored" : [          "age"        ],        "_source" : {          "name" : [ ],          "address" : "BJ_7",          "content" : "hello_[]",          "age" : "23岁"        }      },      {        "_index" : "exists_query_demo_index_001",        "_type" : "_doc",        "_id" : "9",        "_score" : 0.0,        "_source" : {          "name" : [            null          ],          "address" : "BJ_9",          "content" : "hello_[null]",          "age" : 25        }      }    ]  }}GET exists_query_demo_index_001/_search{  "track_total_hits": true,   "size": 20,   "query": {    "exists": {      "field": "name.null_value"    }  }}结果显示:id为7的文档name不存在值即当字段值为 空数组[] 的时候,Exists Query检索不到相关文档字段name.null_value为自定义空值,当字段值出现空值的时候会填充自定义的默认值,故当检查到null 实际填充值为 NULL

小结:

即当字段值为null, 空数组[]或[null] 的时候,Exists Query检索不到相关文档,

如果自定义了空值,那么仅字段值空数组[]下,Exists Query检索不到相关文档

2、当index:false情况下 演示示例

GET exists_query_demo_index_001/_search{  "size": 20,   "query": {    "exists": {      "field": "address"    }  }}结果:所有文档的address字段均存在值,GET exists_query_demo_index_001/_search{  "size": 20,   "query": {    "exists": {      "field": "address.keyword_index_false"    }  }}结果:所有文档的address字段均不存在值,GET exists_query_demo_index_001/_search{  "size": 20,   "query": {    "exists": {      "field": "address.text_index_false"    }  }}结果:所有文档的address字段均不存在值,

小结:当index:false时,所有文档的address字段均不存在值,Exists Query检索不到相关文档

3、mapping设置ignore_above演示示例

GET exists_query_demo_index_001/_search{  "size": 20,   "query": {    "exists": {      "field": "content"    }  }}结果:{  "took" : 0,  "timed_out" : false,  "_shards" : {    "total" : 1,    "successful" : 1,    "skipped" : 0,    "failed" : 0  },  "hits" : {    "total" : {      "value" : 3,      "relation" : "eq"    },    "max_score" : 1.0,    "hits" : [      {        "_index" : "exists_query_demo_index_001",        "_type" : "_doc",        "_id" : "1",        "_score" : 1.0,        "_source" : {          "name" : "Fan",          "address" : "BJ_1",          "content" : "helloFan",          "age" : 17        }      },      {        "_index" : "exists_query_demo_index_001",        "_type" : "_doc",        "_id" : "4",        "_score" : 1.0,        "_ignored" : [          "age"        ],        "_source" : {          "name" : "",          "address" : "BJ_4",          "content" : "hello_",          "age" : "20岁"        }      },      {        "_index" : "exists_query_demo_index_001",        "_type" : "_doc",        "_id" : "7",        "_score" : 1.0,        "_ignored" : [          "age"        ],        "_source" : {          "name" : [ ],          "address" : "BJ_7",          "content" : "hello_[]",          "age" : "23岁"        }      }    ]  }}

小结:

当字段值超过ignore_above配置的长度时,Exists Query检索不到相关文档

4、mapping设置ignore_malformed演示示例

GET exists_query_demo_index_001/_search{  "size": 20,   "query": {    "exists": {      "field": "age"    }  }}通过反向查询看看有哪些age字段不存在值的文档GET exists_query_demo_index_001/_search{  "track_total_hits": true,   "query": {    "bool": {      "must_not": [        {          "exists": {            "field": "age"          }        }      ]    }  }}结果:{  "took" : 0,  "timed_out" : false,  "_shards" : {    "total" : 1,    "successful" : 1,    "skipped" : 0,    "failed" : 0  },  "hits" : {    "total" : {      "value" : 3,      "relation" : "eq"    },    "max_score" : 0.0,    "hits" : [      {        "_index" : "exists_query_demo_index_001",        "_type" : "_doc",        "_id" : "2",        "_score" : 0.0,        "_ignored" : [          "age"        ],        "_source" : {          "name" : "Deng",          "address" : "BJ_2",          "content" : "helloDeng",          "age" : "18岁"        }      },      {        "_index" : "exists_query_demo_index_001",        "_type" : "_doc",        "_id" : "4",        "_score" : 0.0,        "_ignored" : [          "age"        ],        "_source" : {          "name" : "",          "address" : "BJ_4",          "content" : "hello_",          "age" : "20岁"        }      },      {        "_index" : "exists_query_demo_index_001",        "_type" : "_doc",        "_id" : "7",        "_score" : 0.0,        "_ignored" : [          "age"        ],        "_source" : {          "name" : [ ],          "address" : "BJ_7",          "content" : "hello_[]",          "age" : "23岁"        }      }    ]  }}

小结:

当ignore_malformed配置时,字段值类型与mapping中字段类型不一致或一些不符合要求的字段值,Exists Query检索不到相关文档

三、总结:

针对Exists Query检索,以下4种情况会出现Exists Query检索不到相关文档

  • 1、当检索字段值为null, 空数组[], [null], Exists Query检索不到相关文档。存在自定义空值则除外

  • 2、当index:false时,所有文档的address字段均不存在值,Exists Query检索不到相关文档

  • 3、当字段值超过ignore_above配置的长度时,Exists Query检索不到相关文档

  • 4、当ignore_malformed配置时,字段值类型与mapping中字段类型不一致或一些不符合要求的字段值,Exists Query检索不到相关文档


http://chatgpt.dhexx.cn/article/bXltYADv.shtml

相关文章

Android Query managedQuery

今天说一下以下两种方式query数据&#xff1a; Java代码 Cursor c1 mContext.getContentResolver().query(uri, projection, selection, selectionArgs, sortOrder); Cursor c2 mActivity.managedQuery(uri, projection, selection, sortOrder); 使用方法一&#xf…

Android开发managedQuery方法过时如何解决

今天在获取手机相册照片的时候用到了managedQuery&#xff0c;然后发现managedQuery过时了&#xff0c;如下图所示&#xff1a; 于是就百度了一下解决办法&#xff0c;其实也挺简单的。用getContentResolver().query()来代替managerQuery()&#xff0c;参数什么的都一样。 如上…

括号匹配的检验

[TO在这/.按“3.2.2 括号匹配的检验”中的思路&#xff0c;写一个函数“bool check(char* line)” //检查输入的字符串line中的括号是否匹配&#xff0c;不匹配则check函数返回false&#xff0c;否则返回true #include <stdio.h> #include <stdlib.h> #include &l…

括号匹配C语言实现

若你掌握以下知识&#xff0c;你可以更好地理解此篇文章&#xff1a; 1.C语言基本语法。 2.栈的核心思想与栈的构建。 分割线/ 相信看此篇文章的朋友很多是从书本过来的&#xff0c;书本那段描述真的晦涩难懂&#xff0c;什么紧迫性123456的&#xff0c;什么被需要&#xff0…

c语言括号匹配的检验,检验括号匹配的算法

用栈实现检验括号匹配的算法没啥具体描述&#xff0c;数据结构的知识&#xff0c;急用&#xff0c;有重赏 思想是 先进栈&#xff0c;获取第一个半边括号&#xff0c;标记一下&#xff0c;继续进栈直到获取到第二个与之匹配的另一外括号&#xff0c;然后出栈&#xff0c;取出内…

栈和括号匹配

栈是一种符合先进后出原则的数据结构 主要操作氛围进栈和弹栈。规则是栈顶元素先弹出而后进栈&#xff0c;进栈就是一个新的元素取代原本的栈顶元素。 栈可以用来进行最基本的括号匹配操作&#xff0c;栈的图示为&#xff1a;&#xff08;转载&#xff09; 具体代码如下 //定…

C++ 括号匹配

给定一个只包括 (&#xff0c;)&#xff0c;{&#xff0c;}&#xff0c;[&#xff0c;] 的字符串&#xff0c;判断字符串是否有效。 有效字符串需满足&#xff1a; 左括号必须用相同类型的右括号闭合。左括号必须以正确的顺序闭合。注意空字符串可被认为是有效字符串。 示例…

栈以及括号匹配

栈以及括号匹配 一、栈&#xff1a;二、定义&#xff1a;三、入栈&#xff1a;四、出栈&#xff1a;五、测试代码&#xff1a;六、括号匹配七、测试代码八、总代码九、测试结果 一、栈&#xff1a; 栈&#xff08;stack&#xff09;又名堆栈&#xff0c;它是一种运算受限的线性…

括号匹配问题详解

直接看题&#xff01;&#xff01; typedef char STDataType;typedef struct Stack {STDataType* a;int top; //栈顶的位置int capacity; //容量 }ST;void StackInit(ST* ps) {assert(ps);ps->a NULL;ps->top 0;ps->capacity 0;}void StackDestroy(ST* ps) {asse…

括号匹配

题目 给定一个只包括 (&#xff0c; )&#xff0c; {&#xff0c; }&#xff0c; [&#xff0c; ] 的字符串&#xff0c;判断字符串是否有效。 有效字符串需满足&#xff1a; 左括号必须用相同类型的右括号闭合。 左括号必须以正确的顺序闭合。 注意空字符串可被认为是有效…

数据结构——括号匹配问题

括号匹配 给定一个字符串&#xff0c;其中的字符只包含三种括号&#xff1a;花括号{ }、中括号[ ]、圆括号( )&#xff0c;即它仅由 “( ) [ ] { }” 这六个字符组成。设计算法&#xff0c;判断该字符串是否有效&#xff0c;即字符串中括号是否匹配。括号匹配要求括号必须以正…

C语言详解括号匹配问题(栈的应用 )

文章目录 问题概述算法思路不匹配的情况实现流程图C语言代码结果测试 问题概述 检测括号是否成对出现 最后出现的左括号最先匹配&#xff08;LIFO&#xff09;&#xff0c;和栈的后进先出异曲同工 每出现一个右括号&#xff0c;就抵消&#xff08;出栈操作&#xff09;掉一个…

括号匹配(c++)

20. 有效的括号&#xff08;力扣&#xff09; 给定一个只包括 (&#xff0c;)&#xff0c;{&#xff0c;}&#xff0c;[&#xff0c;] 的字符串 s &#xff0c;判断字符串是否有效。 有效字符串需满足&#xff1a; 左括号必须用相同类型的右括号闭合。 左括号必须以正确的顺序闭…

【数据结构】【栈】括号匹配算法(可直接运行)

文章目录 1.算法问题2.算法思路3.算法实现4.完整代码5.运行结果 1.算法问题 假设表达式中允许包含三种括号&#xff1a;()、[]、{}&#xff0c;其嵌套的顺序任意&#xff0c;即([]{})或[()[]{}]等均为正确的格式&#xff0c;实现一个算法&#xff0c;完成对表达式中括号的检验…

CronTrigger(重要,非常强大)

&#xff0c;&#xff1a;表示或的关系 - &#xff1a;表示至的关系 * &#xff1a;表示每的关系 / &#xff1a;表示每的关系 # &#xff1a;表示第的关系 L &#xff1a;表示最后的关系 6 &#xff1a;表示星期五

CronTrigger定时任务

1、CronTrigger的作用&#xff1a;基于日历的作业调度器&#xff0c;而不是像SimpleTrigger那样精确指定间隔时间&#xff0c;比SimpleTrigger更常用。 2、Cron表达式 用于配置CronTrigger实例 是由7个子表达式组成的字符串&#xff0c;描述了时间表的详细信息 格式&#x…

Quartz(02) 两种Trigger(SimpleTrigger/CronTrigger)

上一章讲了Quartz 的几个核心概念(上一章节地址Quartz快速入门).接下来看看Quartz的两种Trigger. SimpleTrigger/CronTrigger. 简单的定时任务,可以采用SimpleTrigger,复杂的任务一般采用CronTrigger. 源码下载地址 1.SimpleTrigger   SimpleTrigger是Quartz中最简单Trig…

Quartz CronTrigger最完整触发时间配置说明

CronTrigger配置格式: 格式: [秒] [分] [小时] [日] [月] [周] [年] 序号说明 是否必填 允许填写的值允许的通配符 1 秒 是 0-59 , - * / 2 分 是 0-59 , - * / 3小时 是 0-23 , - * / 4 日 是 1-31 , - * ? / L W 5 月 是 1-12 or JAN-DEC , - * / 6 周 是 1-7 or SUN-…

Quartz-CronTrigger解读

文章目录 概述Cron表达式的组成cron表达式中的问号(?) 的含义1、当星期和日期都为*或数字时&#xff0c;报错2、当星期和日期都为?时&#xff0c;报错 时间格式特殊字符Cron 表达式样例CronTrigger 样例 1 – 时钟从 0 分钟开始&#xff0c;每 5 分钟执行一次CronTrigger 样例…

SimpleTrigger和CronTrigger配置说明和cornExpression表达式

CronTrigger基于日历和时间&#xff0c;SimpleTrigger基于时间。 每天8:32,12:32 执行一次&#xff0c;启动的时候执行一次&#xff1b; Java代码 <!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/sprin…