对象类型
-
概述
- 将一个对象作为文档字段的值,对象类型更适合处理一对一的关系,且简单容易使用
-
缺点
- 在系统内部,对象之间没有边界,因此存放对象数组(一对多)时查询多个字段可能出现意外的结果
- 更新一个单独的对象需要重新索引整篇文档
嵌套类型(nested)
-
概述
- 在Lucene层面将不同的对象分隔到不同的文档,解决了对象类型一对多的对象之间无边界问题
- ElasticSearch将根文档,文档字段的数组对象分别索引到不同的文档,并将他们放在同一个单独的分块
-
开启跨对象的匹配
- include_in_root: 可以使嵌套文档的字段也会被索引到根文档中
- include_in_parent: 多层级的嵌套文档,可以将嵌套文档的字段索引到最近的父辈文档中
-
嵌套文档的查询
- nested查询或过滤器,需要指定path参数,告诉ElasticSearch这些嵌套位于哪个Lucene分块中
- reverse_nested逆向嵌套查询,反向访问父辈文档
-
嵌套类型得分
- 通过score_mode设置,有avg,total, max, node4中模式,默认是avg
父子关系
-
概述
- 只是映射文档的父子关系,在mapping中通过_parent属性指向父辈文档, 对文档的索引,更新,删除比较友好
- 在索引或检索子文档都必须指定父文档的id,因此同一个父文档的子文档都被分配在同一个分片上,避免了网络传输
-
检索
- has_child: 通过子文档查询父文档
- has_parent: 通过父文档查询子文档
反规范化(denormalizing)
- 使用冗余数据避免join操作
- 缺点: 在索引,更新和删除文档时,必须处理冗余的数据
应用端的连接
在应用程序中使用join查询,类似SQL的子查询