Elasticsearch Mapping字段类型之nested

  • 一、简介
  • 二、插入测试数据
    • 1 创建nested字段的mapping
    • 2 插入2个班级的数据
  • 三、nested 查询
    • 1 Query DSL
    • 2 Java API
  • 四、nested 排序
  • 五、nested 聚合
    • 1 Query DSL
    • 2 Java API
  • 六、nested的应用

一、简介

在上一篇博客Mapping字段类型之object中,已经验证了用object类型存放对象数组是不可取的,因为object会把多个对象进行扁平化存储。

nested类型能够存放对象数组,每一个对象会单独存储,所以可以在nested类型上进行查询聚合排序等操作。

然而nested类型也是有一些限制的,ES有如下默认设置:

  • 一个文档最多有50个nested类型的字段
  • 一个文档所有nested类型的字段存储文档最大数量是10000条

二、插入测试数据

1 创建nested字段的mapping

创建一个文档,存储班级和学生信息

PUT /pigg_test_nested/_mapping/
{"properties":{"class":{"type":"keyword"},"student":{"type":"nested","properties":{"name":{"type":"keyword"},"sex":{"type":"keyword"},"age": {"type":"integer"}}}}
}

2 插入2个班级的数据

PUT pigg_test_nested/_doc/1
{"class":"高三(1)班","student":[{"name":"亚瑟王","sex":"男","age":20},{"name":"程咬金","sex":"男","age":30},{"name":"安其拉","sex":"女","age":18}]
}PUT pigg_test_nested/_doc/2
{"class":"高三(2)班","student":[{"name":"孙策","sex":"男","age":20},{"name":"小乔","sex":"女","age":16},{"name":"大乔","sex":"女","age":18}]
}

三、nested 查询

查询符合age=16 and name='女'学生的班级,返回id=2的文档

1 Query DSL

GET /pigg_test_nested/_search
{"query": {"nested": {           # nested关键字指定是在nested字段上做查询                            "path": "student",  # path指定需查询的字段名称"query": {          # query指定查询体"bool": {"must": [{"term": {"student.age":  16 } }, # 写全路径名称,不能只是age {"term": {"student.sex": "女"} }]}}}}
}

2 Java API

  • QueryBuilders.nestedQuery指定是nested查询,第一参数填nested字段名称
  • 在查询条件中termQuery方法的第一参数要写全路径名称student.agestudent.sex
BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery();
boolQueryBuilder.must(QueryBuilders.termQuery("student.age", 16));
boolQueryBuilder.must(QueryBuilders.termQuery("student.sex", "女"));NestedQueryBuilder queryBuilder = QueryBuilders.nestedQuery("student",boolQueryBuilder,ScoreMode.None);

四、nested 排序

创建一个index,其中examsnested类型

PUT pigg_test_page/_mapping
{"properties":{"exams":{"type":"nested","properties":{"course":{"type":"keyword"},"score":{"type":"long"}}},"name":{"type":"keyword"}}
}

插入2个学生的成绩

PUT pigg_test_page/_doc/1
{"name": "name1","exams": [{"course": "语文","score": 98},{"course": "数学","score": 100}]
}PUT pigg_test_page/_doc/2
{"name": "name2","exams": [{"course": "语文","score": 88},{"course": "数学","score": 76}]
}

要按照语文成绩由高到低排序:

GET pigg_test_page/_search
{"sort": [{"exams.score": {"order": "desc","nested": {"path": "exams","filter": {"term": {"exams.course": "语文"}}}}}]
}

五、nested 聚合

统计每个班中,男生和女生的人数

1 Query DSL

GET pigg_test_nested/_search
{"aggs": {"group_by_class": {           # 先按找班级class分组"terms": {"field": "class","size": 10},"aggs": {"count_by_sex": {     "nested": {           # nested指定是在nested字段上聚合"path": "student"   # path指定nested字段名称student},"aggs": {             "group_by_sex": {   # 按照性别sex分组"terms": {"field": "student.sex",  # 写全路径名称,不能只是sex"size": 10}}}}}}}
}

返回如下:

"buckets" : [{"key" : "高三(1)班","doc_count" : 1,"count_by_sex" : {"doc_count" : 3,"group_by_sex" : {"doc_count_error_upper_bound" : 0,"sum_other_doc_count" : 0,"buckets" : [{"key" : "男","doc_count" : 2},{"key" : "女","doc_count" : 1}]}}},{"key" : "高三(2)班","doc_count" : 1,"count_by_sex" : {"doc_count" : 3,"group_by_sex" : {"doc_count_error_upper_bound" : 0,"sum_other_doc_count" : 0,"buckets" : [{"key" : "女","doc_count" : 2},{"key" : "男","doc_count" : 1}]}}}
]

2 Java API

  • 在用Java API时,也要注意用AggregationBuilders.nested指定nested字段名称
  • sex上做聚合时,要写全路径student.sex
AggregationBuilder agg = AggregationBuilders.terms("group_by_class").field("class").subAggregation(AggregationBuilders.nested("count_by_sex", "student").subAggregation(AggregationBuilders.terms("group_by_sex").field("student.sex")));

六、nested的应用

我常用nested类型用作自关联的嵌套结构,就是一个表中,有个parentId指向同一个表中的另外一条数据的ID。这就形成了树形结构,当然只有parentId是不够灵活的,所以每条记录要保存从根节点到自己的所有路径节点的id信息。具体可以参考我之前的博客ES 存储树形结构 整合Spring Data Elasticsearch

PUT /pigg_tree/_mapping/_doc
{"properties":{"id":{"type":"keyword"},"level":{"type":"keyword"},"name":{"type":"keyword"},"parentId":{"type":"keyword"},"path":{"type":"nested","properties":{"id":{"type":"keyword"},"level":{"type":"keyword"}}}}
}

【Elasticsearch教程13】Mapping字段类型之nested相关推荐

  1. 【Elasticsearch教程18】Mapping字段类型之text 以及term、match和analyzer

    Elasticsearch Mapping字段类型之text 以及term.match和analyzer 一.text场景 二.`term`查询 三.`match`查询 1. `亚瑟王`如何存储? 2 ...

  2. ElasticSearch教程——创建索引、类型、文档

    ElasticSearch汇总请查看:ElasticSearch教程--汇总篇 介绍 索引是ElasticSearch存放数据的地方,可以理解为关系型数据库中的一个数据库.事实上,我们的数据被存储和索 ...

  3. ES篇:ElasticSearch教程——创建索引、类型、文档

    ES知识汇总:https://blog.csdn.net/gwd1154978352/article/details/82781731 介绍 索引是ElasticSearch存放数据的地方,可以理解为 ...

  4. elasticsearch 关联查询_Elasticsearch字段类型之Range经典应用场景

    序言 Elasticsearch产品功能越来越强大,字段类型支持很多种,部分类型还引入了专用的算法.一个客户企业选中Elastic作为搜索中台,居然是看中了Elastic的Range字段类型,下面就围 ...

  5. ElasticSearch:文档字段类型及存储

    文章目录 1.文档字段存储 2.字段类型 2.1.字段的核心类型 2.2.衍生及多值类型 1.文档字段存储 文档字段指的是一个文档中存储的单元,比如以下文档中的username.age.favor就是 ...

  6. 记一次ElasticSearch 更改 mapping 字段类型的过程

    我的个人博客:逐步前行STEP 首先,es不支持直接更改mappinng,所以,更改 mapping 实质上是重建索引. 操作步骤如下: 1.为当前这个索引old_index设置一个别名my_inde ...

  7. es 修改 mapping 字段类型

    一.原索引 PUT my_index {"mappings": {"_doc": {"properties": {"create_ ...

  8. Elasticsearch教程(28) text和keyword区别 term和match区别 ik中文分词器使用

    text和keyword区别 term和match区别 ik中文分词器使用 一.前言 二.之前相关的博客 三.造点测试数据 1. 创建一个index 2. 插入测试数据 四.做一份试卷 第1题:tit ...

  9. ElasticSearch教程——汇总篇

    环境搭建篇 ElasticSearch教程--安装 ElasticSearch教程--安装Head插件 ElasticSearch教程--安装IK分词器插件 ElasticSearch教程--安装Ki ...

  10. elasticsearch的映射(mapping)和分析(analysis)

    转发自:http://blog.csdn.net/hzrandd/article/details/47128895 分析和分析器 分析(analysis)是这样一个过程: 首先,表征化一个文本块为适用 ...

最新文章

  1. JAVA 第五周学习总结
  2. 域控制器安装过程中断电!与Windows Server 2008 林功能级别提升之“冬夜”分享...
  3. js文件的装载和执行
  4. 电脑不能打字_意外收到一台ThinkPad T400笔记本电脑,简单升级后,办公没问题...
  5. matlab创建数组对象,MATLAB一维数组(向量)的定义
  6. 格式化代码php,格式化php代码的两种方法
  7. 全自动安装MySQL_自动部署安装mysql-5.6.22
  8. 驱动外置+原版安装方式『XLOS_Windows8_Pro_X86纯净版_V1.0』
  9. rsync 07-confxml.xml配置文件
  10. E20170603-ts
  11. python身份证验证程序_python 身份证验证
  12. linux系统下Gaussian16和Gaussian view6的详细安装步骤
  13. 迅捷PDF编辑器调整PDF文件页面图文教程
  14. dolphinscheduler2.0.5 HTTP任务类型改造
  15. space-around space-evenly区别
  16. EIGamal encryption VS Pairing encryption
  17. freeswitch配置软电话
  18. 菜鸟起步2-逆向分析学习
  19. java中各种O的含义(PO,VO,TO,QO,BO,DAO,DTO,POJO)
  20. 国内下载国外数据集(库)方案整理

热门文章

  1. CSS SVG开关按钮切换网页白天和夜晚
  2. 【线性代数】A为方阵,当存在B使得 AB=E ,证明BA=E
  3. 下载安装Vue-CLI
  4. oneway的定义和使用
  5. 2018-2019 2 20165203 《网络对抗技术》 Exp4 恶意代码分析
  6. 微信扫码登陆或注册设计流程
  7. 自己的联想Y450笔记本无法连接无线网络的解决办法
  8. Java使用二维码实现签到技术
  9. JVM调优-GC基本原理和调优关键分析
  10. Shinobi视频监控平台