Elasticsearch Nested类型
概要
在Elasticsearch实战场景中,我们或多或少会遇到嵌套文档的组合形式,反映在ES中称为父子文档。
父子文档的实现,至少包含以下两种方式:
1)父子文档
父子文档在5.X版本中通过parent-child父子type实现,即:1个索引对应多个type;
6.X+版本已经不再支持一个索引多个type,6.X+的父子索引的实现改成Join。
2)Nested嵌套类型
问题引出
示例:
{"age": 10,"name": "libai","objs": [{"field1": "aaa1","field2": "bbb"},{"field1": "aaa","field2": "bbb1"}]
}
新建索引
PUT /blog_new
{"mappings": {"properties" : {"age" : {"type" : "long"},"name" : {"type" : "text","fields" : {"keyword" : {"type" : "keyword","ignore_above" : 256}}},"nickname" : {"type" : "text","fields" : {"keyword" : {"type" : "keyword","ignore_above" : 256}}},"sex" : {"type" : "text","fields" : {"keyword" : {"type" : "keyword","ignore_above" : 256}}},"objs":{"properties" : {"field1": {"type" :"text"},"field2": {"type" :"text"}}}}}
}
添加数据
POST /blog_new/_doc/1
{"age": 10,"name":"libai","objs":[{"field1": "aaa1","field2": "bbb"},{"field1": "aaa","field2": "bbb1"}]
}
查看数据:
GET /blog_new/_search
{"query": {"match_all":{}}
}
条件查询数据: field1: aaa1 field2: bbb2
GET /blog_new/_search
{"query": {"bool": {"must": [{"match":{"objs.field1": "aaa1"}},{"match":{"objs.field2": "bbb1"}}]}}
}}
原因分析
这就是为什么我说:
elasticsearch中的内部对象无法按预期工作
这里的问题是elasticsearch(lucene)使用的库没有内部对象的概念,因此内部对象被扁平化为一个简单的字段名称和值列表。
我们的文档内部存储为:
{"name": [ "李白" ],"age": [ 10 ],"objs.field1": [ "aaa1", "bbb" ],"objs.field2": [ "aaa", "bbb1" ]
}
如何解决呢
我们需要更新它的类型为nested。
查询
GET /blog_new/_search
{"query": {"bool": {"must": [{"nested": {"path": "objs","query": {"bool": {"must": [{"match": {"objs.field1": "aaa1"}}]}}}}]}}
}
GET /blog_new/_search?pretty
{"query": {"bool": {"must": [{"nested": {"path": "objs","query": {"bool": {"must": [{"match": {"objs.field1": "aaa1"}},{"match": {"objs.field2": "bbb1"}}]}}}}]}}
}
GET /blog_new/_search?pretty
{"query": {"bool": {"must": [{"nested": {"path": "objs","query": {"bool": {"must": [{"match": {"objs.field1": "aaa1"}},{"match": {"objs.field2": "bbb"}}]}}}}]}}
}
原理
{"name": [ "李白" ],"age": [ 10 ],{"objs.field1":: [ "aaa1"],"objs.field2": [ "bbb" ]},{"objs.field1":: [ "aaa" ],"objs.field2": [ "bbb1"]}
}
Nested类型的作用?
从上一小节,可以清晰的看出nested类型的特别之处。
nested类型是对象数据类型的专用版本,它允许对象数组以可以彼此独立查询的方式进行索引。
4、Nested类型的适用场景
图片来自:rockybean教程
Nested类型的增、删、改、查、聚合操作详解
Nested类型——增
POST /blog_new/_doc/1
{"age": 10,"name":"libai","objs":[{"field1": "aaa1","field2": "bbb"},{"field1": "aaa","field2": "bbb1"}]
}
仅增加objs一个元素
POST blog_new/_update_by_query
{"query": {"bool": {"must": [{"match": {"name": "libai"}}]}},"script": {"lang": "painless","params": {"obj": {"field1": "000","field2": "111"}},"source": "ctx._source.objs.add(params.obj)"}
}
Nested类型——删
序号为1的评论原来有两条,现在删除field1 =aaa 的数据,删除后objs数为一条。
POST blog_new/_doc/_update
{"script": {"lang": "painless","source": "ctx._source.objs.removeIf(it -> it.field1 == 'aaa');"}
}
5.3 Nested类型——改
POST blog_new/_update_by_query
{"query": {"bool": {"must": [{"nested": {"path": "objs","query": {"bool": {"must": [{"match": {"objs.field1": "aaa1"}}]}}}}]}},"script": {"source": "for(e in ctx._source.objs){if (e.field1 == 'aaa1') {e.field1 = 25; e.field2= 'very very good article...';}}" }
}
5.4 Nested类型——查
如前所述,查询评论字段中评论姓名=William并且评论age=34的blog信息。
GET /blog_new/_search
{"query": {"bool": {"must": [{"nested": {"path": "objs","query": {"bool": {"must": [{"match": {"objs.field1": "aaa1"}}]}}}}]}}
}
5.5 Nested类型——聚合
GET blog_new/_search
{"size": 0,"aggs": {"comm_aggs": {"nested": {"path": "objs"},"aggs": {"min_age": {"cardinality":{"field":"objs.field1.keyword"}}}}}
}
Elasticsearch Nested类型相关推荐
- 转:elasticsearch nested嵌套查询
转自: [弄nèng - Elasticsearch]DSL入门篇(七)-- Nested类型查询,聚合_司马缸砸缸了-CSDN博客文章目录1. nested query2. nested 对象聚合项 ...
- ES实现nested类型聚合以及子聚合排序
ES实现nested类型聚合以及子聚合排序 ES实现nested类型聚合以及子聚合排序 需求业务说明 品牌近7天销量 品牌近7日销量趋势 指定某个sku日期范围销量趋势和价格趋势 电商商品日销量索引m ...
- Es的针对于nested类型的多重子聚合
1.业务背景 一家店会由多个人维护,一家店会绑定一个城市,现有需求需要找到某个人的常驻城市,具体需求如下,先找到这个人的所有店,再根据城市聚合店,算出店的数量,取店数量最多的城市,如果有多个城市的店数 ...
- Elasticsearch Date类型,时间存储相关说明
从昨晚开始,到今天中午之前,一直在纠结时间存储问题,昨晚是纠结时间取出来的问题. 其实我的想法很简单,我就想java.util.Date 存储到 Elasticsearch ,然后从 Elasti ...
- elasticsearch type类型创建时注意项目,最新的elasticsearch已经不建议一个索引下多个type...
https://www.elastic.co/guide/cn/elasticsearch/guide/current/mapping.html 如果有两个不同的类型,每个类型都有同名的字段,但映射不 ...
- 干货 | Elasticsearch 检索类型选型指南
之前在 DSL 中一次问卷调查中,收集到如下几个和搜索类型相关的问题. Q1:麻烦讲一下es常用的查询关键词,及使用场景,比如term.match.should.filter等等,谢谢老大...... ...
- Elasticsearch 时间类型总结
Elasticsearch 可以写入.查询不同的时间类型,但当遇到 Unix 时间戳和其他时间格式的时候会有点混乱,因此本文主要是总结一下各种时间类型和其他的表示方式. 1 日期类型 JSON 没有日 ...
- Elasticsearch搜索类型(SearchType)详解
SearchType详解 es在查询时,可以指定搜索类型为 QUERY_THEN_FETCH,QUERY_AND_FEATCH,DFS_QUERY_THEN_FEATCH和DFS_QUERY_AND_ ...
- Elasticsearch搜索类型讲解(QUERY_THEN_FETCH,QUERY_AND_FEATCH,DFS_QUERY_THEN_FEATCH和DFS_QUERY_AND_FEATCH)...
es在查询时,可以指定搜索类型为QUERY_THEN_FETCH,QUERY_AND_FEATCH,DFS_QUERY_THEN_FEATCH和DFS_QUERY_AND_FEATCH.那么这4种搜索 ...
- Elasticsearch搜索类型(query type)详解
es在查询时,可以指定搜索类型为QUERY_THEN_FETCH,QUERY_AND_FEATCH,DFS_QUERY_THEN_FEATCH和DFS_QUERY_AND_FEATCH.那么这4种搜索 ...
最新文章
- Journal of Genetics and Genomics科学编辑招聘启事
- 【javascript】javascript函数整理之日期型(Date)篇
- Tensorflow2.0报错:ProfilerNotRunningError: Cannot stop profiling. No profiler is running.
- pip安装python模块遇到一直出现retrying的问题
- 基础练习 01字串 c语言
- 关于.NET Core是否应该支持WCF Hosting的争论
- 在GWT中序列化/反序列化Json
- 移动架构-数据库分库和全版本升级
- 前端学习(3252):react脚手架
- 使用继承思想,去开发一款组件(element-ui collapse组件为例子)
- 怎样下载网页中.ts视频文件
- Linux高级命令find,grep,sed,awk
- NYOJ 237 NYOJ 239 二分图 最大匹配模板题 游戏高手的烦恼 月老的难题 两个题一样
- 求职秘籍-如何准备面试?
- 2021 PyTorch官方实战教程(一)Tensor 详解
- CAD打印文字不显示怎么办
- AdaCliP: Adaptive Clipping for Private SGD
- 贝壳 OLAP 平台架构及演进
- 颈椎间盘突出的治疗方法
- md5加密一转眼就要毕业了
热门文章
- vue中请求拦截器梧桐刷新Token
- 抖音 iOS 工程架构演进
- [HLSL]HLSL 入门参考 (dx11龙书附录B译文)
- mysql分组函数、组函数、聚合函数、统计函数
- 联发科:上半年营收2980亿台币,下半年全面发力5G芯片,并布局6G
- MBP本,完美多分区装双系统图文教程,多分区而不影响苹果系统GUID分区表,图文教程
- 实验吧——安全杂项之“A记录”详解
- JSP 银行网上账户管理系统myeclipse编程java网页
- Windows 11 v22000.318 11月更新版
- 新品开源又融资,长亭科技“脱胎而成”!