一、什么是 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 默认分词,不可以排序。

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 性能

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

压测环境: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

转载于:https://www.cnblogs.com/Alandre/p/11232103.html

Elasticsearch 7.x Nested 嵌套类型查询 | ES 干货相关推荐

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

    一.什么是 ES Nested 嵌套 Elasticsearch 有很多数据类型,大致如下: 基本数据类型: string 类型.ES 7.x 中,string 类型会升级为:text 和 keywo ...

  2. es内嵌文档查询_Elasticsearch 7.x Nested 嵌套类型查询 | ES 干货

    一.什么是 ES Nested 嵌套 Elasticsearch 有很多数据类型,大致如下: 基本数据类型: string 类型.ES 7.x 中,string 类型会升级为:text 和 keywo ...

  3. 【Elasticsearch】 es nested 嵌套类型 详解

    1.概述 数据类型,大合集参考 [Elasticsearch]Elasticsearch的数据类型 (text.keyword.date.object.geo等) 2 嵌套类型 - nested 嵌套 ...

  4. 转:elasticsearch nested嵌套查询

    转自: [弄nèng - Elasticsearch]DSL入门篇(七)-- Nested类型查询,聚合_司马缸砸缸了-CSDN博客文章目录1. nested query2. nested 对象聚合项 ...

  5. Elasticsearch 实战 - 第四讲:ES 高级查询

    Elasticsearch 实战 - 第四讲:ES 高级查询 Elasticsearch 实战系列文章: 一.高级查询 1.简介 2.结果排序 3.分页查询 4.检索查询 5.关键字查询 6.高亮显示 ...

  6. Java查询ES (elasticsearch) 对短句进行关键词摘要 并分词查询

    项目场景: 提示:根据用户最近浏览的文章标题进行关键词摘要,并根据结果,查询ES 这里关键的是根据内容获取关键词摘要的方法 关键词摘要 使用IK中文分词 pom文件 <!--中文分析器--> ...

  7. es java api 子查询,criteria 子查询 es

    elasticsearch.core.query中Criteria类各个方法详解--CSDN... 2016年2月25日 asticsearch.core.query中Criteria类各个方法详解 ...

  8. 【Elasticsearch】Elasticsearch的IndexSorting:一种查询性能优化利器

    1.概述 转载:Elasticsearch的IndexSorting:一种查询性能优化利器 前言 前两周写过一篇<基于Lucene查询原理分析Elasticsearch的性能>,在最后留了 ...

  9. 使用ElasticSearch完成百万级数据查询附近的人功能

    上一篇文章介绍了ElasticSearch使用Repository和ElasticSearchTemplate完成构建复杂查询条件,简单介绍了ElasticSearch使用地理位置的功能. 这一篇我们 ...

  10. Elasticsearch的suggest联想提示查询实现

    Elasticsearch的suggest联想提示查询实现 思路 先将关键字在completions 自动补全索引库中查询,获取建议的补全信息 如没有获取到补全信息,可能表示用户输入的关键词有拼写错误 ...

最新文章

  1. 大话ion系列(三)
  2. 有没有可以在JavaScript里可以用的锁?
  3. 只读变量(常量)和位置变量
  4. Error:Could not resolve all files for configuration ':app:preDebugCompileClasspath'. Could not fin
  5. python set_Python Set联合
  6. 自定义控件设置宽度_自定义View开篇,必须跨过的一道坎儿
  7. python避障小车_[TPYBoard - Micropython之会python就能做硬件 8] 学习使用超声波模块制作避障小车...
  8. editText属性
  9. 路由变化时使用axios取消所有请求
  10. LHG 弹层问题汇总
  11. 单片机跑操作系统,到底有几种选择?
  12. 软件实用小技巧,大大提高学习、办公效率
  13. 数据仓库基本概念介绍
  14. JAVA系列 IO流 知识结构整理 建立合理的知识框架逻辑 输入输出流 理顺你的思维架构Fileoutput inputStream FileWriter FIleReader结构整理
  15. 人工智能和AI到底是什么??浅谈人工智能和AI
  16. 网管的自我修养-人际关系
  17. 1421. 净现值查询
  18. EGE相关:控制台窗口的设置
  19. 各类学习平台收集记录(强化学习、深度学习、机器学习)
  20. spring下载、spring-framework-3.0.2.RELEASE-dependencies.zip 下载

热门文章

  1. 业务需求访谈中需要注意的重要法则(转)
  2. html没有prefix属性,HTML前缀属性(Open Graph Protocol)的含义?
  3. 企业组织形态及财务报表
  4. CSS(九)元素隐藏和利弊
  5. Centos 6.6 Docker安装(内网坏境)
  6. Invalid regular expression: unmatched parentheses
  7. 返回0-9直接的随机数
  8. 事务复制中的msrepl_ccs
  9. 重磅干货!揭秘波士顿动力背后的专利技术
  10. 1.4. network