概要
在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类型相关推荐

  1. 转:elasticsearch nested嵌套查询

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

  2. ES实现nested类型聚合以及子聚合排序

    ES实现nested类型聚合以及子聚合排序 ES实现nested类型聚合以及子聚合排序 需求业务说明 品牌近7天销量 品牌近7日销量趋势 指定某个sku日期范围销量趋势和价格趋势 电商商品日销量索引m ...

  3. Es的针对于nested类型的多重子聚合

    1.业务背景 一家店会由多个人维护,一家店会绑定一个城市,现有需求需要找到某个人的常驻城市,具体需求如下,先找到这个人的所有店,再根据城市聚合店,算出店的数量,取店数量最多的城市,如果有多个城市的店数 ...

  4. Elasticsearch Date类型,时间存储相关说明

    从昨晚开始,到今天中午之前,一直在纠结时间存储问题,昨晚是纠结时间取出来的问题. 其实我的想法很简单,我就想java.util.Date  存储到 Elasticsearch  ,然后从 Elasti ...

  5. elasticsearch type类型创建时注意项目,最新的elasticsearch已经不建议一个索引下多个type...

    https://www.elastic.co/guide/cn/elasticsearch/guide/current/mapping.html 如果有两个不同的类型,每个类型都有同名的字段,但映射不 ...

  6. 干货 | Elasticsearch 检索类型选型指南

    之前在 DSL 中一次问卷调查中,收集到如下几个和搜索类型相关的问题. Q1:麻烦讲一下es常用的查询关键词,及使用场景,比如term.match.should.filter等等,谢谢老大...... ...

  7. Elasticsearch 时间类型总结

    Elasticsearch 可以写入.查询不同的时间类型,但当遇到 Unix 时间戳和其他时间格式的时候会有点混乱,因此本文主要是总结一下各种时间类型和其他的表示方式. 1 日期类型 JSON 没有日 ...

  8. Elasticsearch搜索类型(SearchType)详解

    SearchType详解 es在查询时,可以指定搜索类型为 QUERY_THEN_FETCH,QUERY_AND_FEATCH,DFS_QUERY_THEN_FEATCH和DFS_QUERY_AND_ ...

  9. 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种搜索 ...

  10. Elasticsearch搜索类型(query type)详解

    es在查询时,可以指定搜索类型为QUERY_THEN_FETCH,QUERY_AND_FEATCH,DFS_QUERY_THEN_FEATCH和DFS_QUERY_AND_FEATCH.那么这4种搜索 ...

最新文章

  1. Journal of Genetics and Genomics科学编辑招聘启事
  2. 【javascript】javascript函数整理之日期型(Date)篇
  3. Tensorflow2.0报错:ProfilerNotRunningError: Cannot stop profiling. No profiler is running.
  4. pip安装python模块遇到一直出现retrying的问题
  5. 基础练习 01字串 c语言
  6. 关于.NET Core是否应该支持WCF Hosting的争论
  7. 在GWT中序列化/反序列化Json
  8. 移动架构-数据库分库和全版本升级
  9. 前端学习(3252):react脚手架
  10. 使用继承思想,去开发一款组件(element-ui collapse组件为例子)
  11. 怎样下载网页中.ts视频文件
  12. Linux高级命令find,grep,sed,awk
  13. NYOJ 237 NYOJ 239 二分图 最大匹配模板题 游戏高手的烦恼 月老的难题 两个题一样
  14. 求职秘籍-如何准备面试?
  15. 2021 PyTorch官方实战教程(一)Tensor 详解
  16. CAD打印文字不显示怎么办
  17. AdaCliP: Adaptive Clipping for Private SGD
  18. 贝壳 OLAP 平台架构及演进
  19. 颈椎间盘突出的治疗方法
  20. md5加密一转眼就要毕业了

热门文章

  1. vue中请求拦截器梧桐刷新Token
  2. 抖音 iOS 工程架构演进
  3. [HLSL]HLSL 入门参考 (dx11龙书附录B译文)
  4. mysql分组函数、组函数、聚合函数、统计函数
  5. 联发科:上半年营收2980亿台币,下半年全面发力5G芯片,并布局6G
  6. MBP本,完美多分区装双系统图文教程,多分区而不影响苹果系统GUID分区表,图文教程
  7. 实验吧——安全杂项之“A记录”详解
  8. JSP 银行网上账户管理系统myeclipse编程java网页
  9. Windows 11 v22000.318 11月更新版
  10. 新品开源又融资,长亭科技“脱胎而成”!