【Elasticsearch教程13】Mapping字段类型之nested
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.age
和student.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,其中exams
是nested
类型
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相关推荐
- 【Elasticsearch教程18】Mapping字段类型之text 以及term、match和analyzer
Elasticsearch Mapping字段类型之text 以及term.match和analyzer 一.text场景 二.`term`查询 三.`match`查询 1. `亚瑟王`如何存储? 2 ...
- ElasticSearch教程——创建索引、类型、文档
ElasticSearch汇总请查看:ElasticSearch教程--汇总篇 介绍 索引是ElasticSearch存放数据的地方,可以理解为关系型数据库中的一个数据库.事实上,我们的数据被存储和索 ...
- ES篇:ElasticSearch教程——创建索引、类型、文档
ES知识汇总:https://blog.csdn.net/gwd1154978352/article/details/82781731 介绍 索引是ElasticSearch存放数据的地方,可以理解为 ...
- elasticsearch 关联查询_Elasticsearch字段类型之Range经典应用场景
序言 Elasticsearch产品功能越来越强大,字段类型支持很多种,部分类型还引入了专用的算法.一个客户企业选中Elastic作为搜索中台,居然是看中了Elastic的Range字段类型,下面就围 ...
- ElasticSearch:文档字段类型及存储
文章目录 1.文档字段存储 2.字段类型 2.1.字段的核心类型 2.2.衍生及多值类型 1.文档字段存储 文档字段指的是一个文档中存储的单元,比如以下文档中的username.age.favor就是 ...
- 记一次ElasticSearch 更改 mapping 字段类型的过程
我的个人博客:逐步前行STEP 首先,es不支持直接更改mappinng,所以,更改 mapping 实质上是重建索引. 操作步骤如下: 1.为当前这个索引old_index设置一个别名my_inde ...
- es 修改 mapping 字段类型
一.原索引 PUT my_index {"mappings": {"_doc": {"properties": {"create_ ...
- Elasticsearch教程(28) text和keyword区别 term和match区别 ik中文分词器使用
text和keyword区别 term和match区别 ik中文分词器使用 一.前言 二.之前相关的博客 三.造点测试数据 1. 创建一个index 2. 插入测试数据 四.做一份试卷 第1题:tit ...
- ElasticSearch教程——汇总篇
环境搭建篇 ElasticSearch教程--安装 ElasticSearch教程--安装Head插件 ElasticSearch教程--安装IK分词器插件 ElasticSearch教程--安装Ki ...
- elasticsearch的映射(mapping)和分析(analysis)
转发自:http://blog.csdn.net/hzrandd/article/details/47128895 分析和分析器 分析(analysis)是这样一个过程: 首先,表征化一个文本块为适用 ...
最新文章
- JAVA 第五周学习总结
- 域控制器安装过程中断电!与Windows Server 2008 林功能级别提升之“冬夜”分享...
- js文件的装载和执行
- 电脑不能打字_意外收到一台ThinkPad T400笔记本电脑,简单升级后,办公没问题...
- matlab创建数组对象,MATLAB一维数组(向量)的定义
- 格式化代码php,格式化php代码的两种方法
- 全自动安装MySQL_自动部署安装mysql-5.6.22
- 驱动外置+原版安装方式『XLOS_Windows8_Pro_X86纯净版_V1.0』
- rsync 07-confxml.xml配置文件
- E20170603-ts
- python身份证验证程序_python 身份证验证
- linux系统下Gaussian16和Gaussian view6的详细安装步骤
- 迅捷PDF编辑器调整PDF文件页面图文教程
- dolphinscheduler2.0.5 HTTP任务类型改造
- space-around space-evenly区别
- EIGamal encryption VS Pairing encryption
- freeswitch配置软电话
- 菜鸟起步2-逆向分析学习
- java中各种O的含义(PO,VO,TO,QO,BO,DAO,DTO,POJO)
- 国内下载国外数据集(库)方案整理