嵌套查询和连接查询的效率_Elasticsearch 7.x Nested 嵌套类型查询 | ES 干货

一、什么是 ES Nested 嵌套

Elasticsearch 有很多数据类型,大致如下:

  • 基本数据类型:
    • string 类型。ES 7.x 中,string 类型会升级为:text 和 keyword。keyword 可以排序;text 默认分词,不可以排序。
    • 数据类型:integer、long 等
    • 时间类型、布尔类型、二进制类型、区间类型等
  • 复杂数据类型:
    • 数组类型:Array
    • 对象类型:Object
    • Nested 类型
  • 特定数据类型:地理位置、IP 等

注意:tring/nested/array 类型字段不能用作排序字段。因此 string 类型会升级为:text 和 keyword。keyword 可以排序,text 默认分词,不可以排序。

623e8c9bcbcd2d0b5ac67c261f52848c.png

更多Java微服务资料,加我微w信x:bysocket01 (加的人,一般很帅)

2.1 那什么是 Nested 类型?

Elasticsearch 7.x 文档中,这样写到:

The nested type is a specialised version of the object datatype that allows arrays of objects to be indexed in a way that they can be queried independently of each other.


Nested (嵌套)类型,是特殊的对象类型,特殊的地方是索引对象数组方式不同,允许数组中的对象各自地进行索引。目的是对象之间彼此独立被查询出来。

2.2 如何使用 Nested 类型?

在 ES 的 my_index 索引中存储 users 字段。比如说

{"group" : "fans","users" : [{"name" : "John","age" :  "23"},{"name" : "Alice","age" :  "18"}]
}

其实存储看上去跟 Object 类型一样,只不过底层原理对数组 users 字段索引方式不同。设置 users 字段的索引方式 Nested 嵌套类型:

curl -X PUT "localhost:9200/my_index" -H 'Content-Type: application/json' -d'
{"mappings": {"properties": {"users": {"type": "nested" }}}
}
'

二、Nested Query 应用场景或案例

比如小老弟我有一波小粉丝,users 字段类型是 object。存储如下:

{"group" : "bysocket_fans","users" : [{"name" : "John","age" :  "23"},{"name" : "Alice","age" :  "18"}]
}{"group" : "路人甲_fans","users" : [{"name" : "Alice","age" :  "22"},{"name" : "Jeff","age" :  "18"}]
}

比如 18 岁大姑娘 Alice 是小老弟我的粉丝,她也可能是周杰伦的粉丝。那这边就有一个需求,即应用场景:

如何找到 18 岁大姑娘 Alice {"name" : "Alice","age" : "18"} 关注的所有明星呢?如果用老的查询语句是这样搜索的:

GET /my_index/_search?pretty
{"query": {"bool": {"must": [{"match": {"users.name": "Alice"}},{"match": {"users.age": 18}}]}}
}

结果发现结果是不对的,路人甲 这条记录也出现了。因为匹配到了第一个 Alice + 第二个 Jeff 的 18。所以这种查询不满足这个场景

那么需要使用 Nested 类型并用 Nested 查询,即让数组中的对象各自地进行索引。目的是对象之间彼此独立被查询出来。

三、Nested Query 实战


3.1 设置 Nested 类型

根据 2.2 如何使用 Nested 类型,将 users 字段类型从 object 修改为 nested:

curl -X PUT "localhost:9200/my_index" -H 'Content-Type: application/json' -d'
{"mappings": {"properties": {"users": {"type": "nested" }}}
}
'

3.2 Nested Query

修改后,对应的 Nested Query ,如下:

GET /my_index/_search?pretty
{"query": {"bool": {"must": [{"nested": {"path": "users","query": {"bool": {"must": [{"match": {"users.name": "Alice"}},{"match": {"users.age": 18}}]}}}}]}}
}


语法很简单就是:

  • key 以 "nested" 开头
  • path 就是嵌套对象数组的字段名
  • 其他
    • score_mode (可选的)匹配子对象的分数相关性分数。avg (默认,使用所有匹配子对象的平均相关性分数)
    • ignore_unmapped (可选的)是否忽略 path 未映射,不返回任何文档而不是错误。默认为 false,如果 path 不对就报错

这样查询得结果就是对的。

四、Nested Query 性能

这边测试过,给大家一个测试报告和建议。

1431ffe9c967f14e913fa43463d1beb0.png

压测环境:3 个 server ,6 个 ES 节点
压测结论: 使用上小节查询语句,50 并发情况下,导致千兆网卡被打满了。TPS 4000 左右,如果提高并发,就会增加 RT。所以如果高性能大流量情况下,必须用 Nested 应该从网络流量方向进行优化。二者,尽量减少大数据对象的返回

建议:泥瓦匠建议,你听听看

  • 性能:Common Query 远远大于 Nested Query 远远大于 Parent/Child Query
  • 性能优化:首先考虑减少后面两种 Query
  • 性能优化:Nested Query 业务可以优化下。比如上一小节完全可以多存一个 fanIds 数组。搜索两次,第一次查确定 18 岁大姑娘 Alice 的 fanId,第二次根据 fanId 搜索即可
  • 性能优化:实在没办法,高性能大流量情况下,必须用 Nested 应该从网络流量方向进行优化。二者,尽量减少大数据对象的返回

(完)

参考资料:

  • https://blog.csdn.net/laoyang360/article/details/82950393
  • https://www.elastic.co/guide/en/elasticsearch/reference/7.2/search-aggregations-bucket-reverse-nested-aggregation.html
  • 更多Java微服务资料,加我微w信x:bysocket01 (加的人,一般很帅)

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

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

相关文章

c++程序设计_基于proteus的51单片机开发实例30-模块化程序设计

1. 基于proteus的51单片机开发实例30-模块化程序设计1.1. 实验目的模块化程序设计不知不觉我们的51单片机开发实例已经进行到第三十篇了,是时候进行一个总结和反思了,总结什么?反思什么呢?我们先从程序结构开始吧。总结在前面的29…

反序列化的时候出现eof exception_FastJson序列化时候出现了$ref?还不赶紧学习下...

最近在使用fastjson时候遇到一个问题,后台的数据转化为json字符串后发送到前端时候出现了$ref字样的东西,后来明白了这是引用,下面详细介绍下。一、一个简单的例子先来上一段代码,运行后打印的结果可能出乎意料,代码如…

阿里云 linux mysql数据库_Linux Mysql数据库安全配置

Linux Mysql数据库安全配置目录:1.修改mysql管理员账号root的密码(2种方法)2.修改mysql管理员账号root3.mysql管理员root账号密码遗忘解决办法(2种方法)4.创建数据库用户(3种方法)5.mysql数据库权限管理本地权限网络权限撤销权限删除用户一、修改mysql管理员账号roo…

快速锁屏电脑快捷键_一学就会的8个电脑快捷键一定要掌握!堪称“高效”神器...

日常工作中,电脑是我们常用的设备,为了提高工作效率常常需要牢记一些电脑快捷键,那么有哪些电脑快捷键值得我们牢记呢?下面分享8个实用的电脑快捷键,关键时刻省时又省力哟!#1 WindowsL 快速锁屏一般用在暂时…

left join 重复数据_Python数据分析整理小节

一、数据读取1、读写数据库数据读取函数:pandas.read_sql_table(table_name, con, schemaNone, index_colNone, coerce_floatTrue, columnsNone)pandas.read_sql_query(sql, con, index_colNone, coerce_floatTrue)pandas.read_sql(sql, con, index_colNone, coerce_floatTrue,…

win10文件显示后缀名_Win10一开机,内存占用竟高达60%?你可以尝试这样做

说到win10一开机,内存占用竟高达60%,你是怎么处理的呢?深受其害的朋友就此大展身手了,瞅瞅!A:我16G内存,也是开机占用了70%多。百度找了很多方法都是不相关的答案,后来发现了关闭快速…

LSTM(长短期记忆网络)的设计灵感和数学表达式

1、设计灵感 LSTM(长短期记忆网络)的设计灵感来源于传统的人工神经网络在处理序列数据时存在的问题,特别是梯度消失和梯度爆炸的问题。 在传统的RNN(循环神经网络)中,信息在网络中的传递是通过隐状态向量进…

个人博客代码_Jekyll + Github Pages 搭建个人免费博客

今天亲手通过 Jekyll 搭建了一套免费博客,搭建步骤其实超级简单。你不需要购买域名,也不需要购买服务器,就可以轻松拥有你自己的博客。Jekyll 的核心是一个文本转换引擎。它的方便之处在于支持多种文本标记语言:Markdown&#xff…

js计算排名_今天,我们讲一下,快速排名与黑帽SEO

做个有心人(第7篇)在Web3.0时代,想要获得流量,就必须使用广告手段,用什么广告手段,需要切合自身情况来做,比如说:SEO是免费的,而SEM就是付费的。而SEO快速排名是什么鬼?真的快吗?快速排名究竟…

黑马h5学习代码_如何零基础制作酷炫实用的H5页面

H5页面已经成为了当下移动端主要的宣传方式,一个好的H5页面有极高的营销价值,无论是企业还是个人都非常需要。制作一个炫酷的H5页面一定要会写代码吗,下面千锋网络营销小编就给大家分享如何零基础制作炫酷实用的H5页面。支持H5的Web APP迅猛发展很重要的一点就是APP中的内容产生…

bin文件如何编辑_如何为高通固件创建rawprogram0和patch0文件

这是一个分步教程,显示如何为Qualcomm固件创建rawprogram0.xml和patch0.xml文件。要求下载并安装Python https://www.python.org/downloads/release/python-2710/下载高通GPTtool [ 登录/注册免费下载]下载Notepad https://notepad-plus-plus.org/downloads/来自…

iframe 页面富文本框数据怎么保存_文字太多PPT怎么做都丑?估计是没注意这些细节!...

秋叶 PPT 双 11 大促返场最后 1 天全场精品课享年度超值价千万别错过啦!作者:洁洁编辑:躺糖大家好,我是洁洁!作为每天倾听你们的困惑的小编之一,我 get 到了一个你们平常做 PPT 会碰到的最头疼的问题&#…

835 由于安全层无法对远程计算机进行身份验证_vscode 插件Remote-ssh远程wsl调试python

解决远程ssh端口非22的问题,见文末参考文献:Developing on Remote Machines using SSH and Visual Studio Code​code.visualstudio.com使用SSH进行远程开发Developing on Remote Machines using SSH and Visual Studio Code使用SSH进行远程开发在Visual…

vue实现查询多条记录_vue.js 实现天气查询

效果预览:http://songothao.gitee.io/weather_query_based_on_vuejs/ 项目已上传码云:叁贰壹/vuejs实现天气查询知乎视频​www.zhihu.com一、使用 axios vue.js:axios-get请求:axios.get(地址?keyvalue&key2value2).then(function(resp…

idea序列化自动生成_serialVersionUID在数据序列化中重要性

作用用于判断序列化文件是否已经失效(过期)。序列化的时候会把这个ID写到文件里。读的时候会把这个ID和代码里的ID比较,如果不一致,表示文件里的已经失效。(will result in an InvalidClassException.)值写为多少你可以写为1L,也可以让IDEA帮…

python找与7相关的数_用python统计并输出1000以内所有能同时被3和7整除的数的个数?...

展开全部 len([i for i in range(1,1001) if i%3i%70]) #!/usr/bin/python3 for i in range(1, 100): if i % 3 0 and i % 7 0: print(i) 100以内能同时被21133&#xff0c;5&#xff0c;7整除的数&#xff0c;除非是52610。 #include int main() {int i,n0; for(i0;i<100…

贝塞尔曲线 java_贝塞尔曲线理论及实现——Java篇

贝塞尔曲线贝塞尔曲线(The Bzier Curves)&#xff0c;是一种在计算机图形学中相当重要的参数曲线(2D&#xff0c;3D的称为曲面)。贝塞尔曲线于1962年&#xff0c;由法国工程师皮埃尔贝塞尔(Pierre Bzier)所发表&#xff0c;他运用贝塞尔曲线来为汽车的主体进行设计。线性曲线给…

java连接access_关于k8s下使用Ingress保持长连接的异常情况排查

写在前面的话应某位友人需求&#xff0c;帮整理下工作中的发生的一些值得记录的文章。于是在友人描述后&#xff0c;为其整理为了文章&#xff0c;供大家一起参考探讨。问题描述在我们中应用有一个使用到Http Long Poll的场景&#xff0c;它需要一个http请求保持最长30秒&#…

罗斯蒙特电磁流量计8723说明书_罗斯蒙特8732E电磁流量计对环境和温度的限制

今天我们来说说美国罗斯蒙特8732E电磁流量计对环境和温度的限制&#xff01;工作温度-40 到 60C(-40 到 140F)&#xff0c;无本地操作界面-20 到 60C(-4 到 140F)&#xff0c;有本地操作界面当温度低于 -20C 时&#xff0c;本地操作界面 (LOI) 将无显示储存-40 到 85C(-40 到 1…