Elasticsearch:获取 nested 类型数组中的所有元素

news/2024/11/28 9:22:43/

在我之前的文章 “Elasticsearch: object 及 nested 数据类型” 对 nested 数据类型做了一个比较详细的介绍。在实际使用中,你在构建查询时肯定会遇到一些问题。根据官方文档介绍,nested 类型字段在隐藏数组中索引其每个项目,这允许独立于索引文档搜索这些项目。今天我带来一个问题:问如何获得一个文档,其整个 item 列表必须与一个子句匹配。 让我举个例子让你更清楚。

我有一个 item 字段设置为 nested 的索引。 我索引了两个文档,其中一个所有项目的 status 都为 active,另一个则不全是。

PUT nested_index
{"mappings": {"properties": {"description": {"type": "text"},"item": {"type": "nested","properties": {"value": {"type": "text"},"status": {"type": "keyword"}}}}}
}
POST nested_index/_doc
{"description": "nested A","item": [{"value": "a","status": "active"},{"value": "ab","status": "active"}]
}POST nested_index/_doc
{"description": "nested B","item": [{"value": "b","status": "inactive"},{"value": "bc","status": "active"}]
}

如上所示,第一个文档里的 status 都是 active 的状态,而第二个文档的其中一个 status 状态是 active,另外一个是 inactive 状态。

现在我们想要查询的问题是:搜索到 status 都是 active 的文档。

也许你会想到使用如下的查询:

GET nested_index/_search
{"query": {"nested": {"path": "item","query": {"term": {"item.status": {"value": "active"}}}}}
}

上面命令查询的结果是:

{"took": 1,"timed_out": false,"_shards": {"total": 1,"successful": 1,"skipped": 0,"failed": 0},"hits": {"total": {"value": 2,"relation": "eq"},"max_score": 0.35667494,"hits": [{"_index": "nested_index","_id": "xRoaRIYB2XodIZsbUfzi","_score": 0.35667494,"_source": {"description": "nested A","item": [{"value": "a","status": "active"},{"value": "ab","status": "active"}]}},{"_index": "nested_index","_id": "xhoaRIYB2XodIZsbWvzm","_score": 0.35667494,"_source": {"description": "nested B","item": [{"value": "b","status": "inactive"},{"value": "bc","status": "active"}]}}]}
}

显然两个文档都被查询到了。这个不是我们想要的结果。

解决它的方法是使用两个 must_not 子句。 最里面的 must_not 子句将过滤文档 A,因为所有项目都具有 active 状态。 最外层的 must_not 将反转操作,迄今为止省略的文档 A 将可用,而文档 B 将不可用且不会出现在响应中。

GET nested_index/_search
{"query": {"bool": {"must_not": [{"nested": {"path": "item","query": {"bool": {"must_not": [{"term": {"item.status": {"value": "active"}}}]}}}}]}}
}

上面的命令结果为:

{"took": 2,"timed_out": false,"_shards": {"total": 1,"successful": 1,"skipped": 0,"failed": 0},"hits": {"total": {"value": 1,"relation": "eq"},"max_score": 0,"hits": [{"_index": "nested_index","_id": "xRoaRIYB2XodIZsbUfzi","_score": 0,"_source": {"description": "nested A","item": [{"value": "a","status": "active"},{"value": "ab","status": "active"}]}}]}
}

这次显然只有 nested A 文档被搜索到。


http://www.ppmy.cn/news/24360.html

相关文章

全景拼接python旗舰版

前言在这个项目中,您将构建一个管道,将几幅图像拼接成一个全景图。您还将捕获一组您自己的图像来报告最终的结果。步骤1 特征检测与描述本项目的第一步是对序列中的每幅图像分别进行特征检测。回想一下我们在这个类中介绍过的一些特征探测器:…

Java:SpringMVC的使用(2)

目录第十二章 REST风格CRUD练习12.1 搭建环境12.2 实现功能思路第十三章 SpringMVC消息转换器13.1 消息转换器概述13.2 使用消息转换器处理请求报文(1) 使用RequestBody获取请求体(2) 使用HttpEntity\<T>获取请求体及请求头13.3 使用消息转换器处理响应报文(1) 使用Respo…

详解Python正则表达式中group与groups的用法

在Python中&#xff0c;正则表达式的group和groups方法是非常有用的函数&#xff0c;用于处理匹配结果的分组信息。 group方法是re.MatchObject类中的一个函数&#xff0c;用于返回匹配对象的整个匹配结果或特定的分组匹配结果。而groups方法同样是re.MatchObject类中的函数&am…

Python爱心代码

前言 Python漂浮爱心&#xff0c;具体源码见&#xff1a;Python动态爱心代码_爱心代码-Python文档类资源-CSDN下载 爱心类 class Heart(): #每个爱心&#xff08;爱心类&#xff09; def __init__(self): self.r ra.randint(10,15) #爱心的半径 …

飞速创新更新IPO招股书:计划募资约14亿元,向伟为实际控制人

近日&#xff0c;深圳市飞速创新技术股份有限公司&#xff08;下称“飞速创新”&#xff09;预披露更新招股书&#xff0c;准备在深圳证券交易所主板上市。本次冲刺上市&#xff0c;飞速创新计划募资13.54亿元&#xff0c;招商证券为其保荐机构。 据介绍&#xff0c;飞速创新专…

Golang 模糊测试的使用

一 背景 在 Go 1.18 中,Go 语言新增模糊测试(Fuzzing)。Fuzzing,又叫fuzz testing,中文叫做模糊测试或随机测试。其本质上是一种自动化测试技术,更具体一点,它是一种基于随机输入的自动化测试技术,常被用于发现处理用户输入的代码中存在的bug和问题。模糊测试和常规的功能…

【Vue3源码】第一章 effect和reactive

文章目录【Vue3源码】第一章 effect和reactive前言1、实现effect函数2、封装track函数&#xff08;依赖收集&#xff09;3、封装reactive函数4、封装trigger函数&#xff08;依赖触发&#xff09;5、单元测试【Vue3源码】第一章 effect和reactive 前言 今天就正式开始Vue3源码…

Dart语法基础补充

Asynchrony support Dart 库中充满了返回 Future 或 Stream 对象的函数。 这些函数是异步的&#xff1a;它们在设置一个可能耗时的操作&#xff08;例如 I/O&#xff09;后返回&#xff0c;而不等待该操作完成。 async 和 await 关键字支持异步编程&#xff0c;让编写看起来类…