es内嵌文档查询_ES中的数据关联

本文探讨了Elasticsearch(ES)中如何实现数据关联,重点介绍了内嵌文档、冗余数据、嵌套对象和父子对象四种方法。ES默认无法完成类似SQL的表JOIN,但可以通过内嵌对象和父子对象来模拟关联查询。嵌套对象虽然解决了数据顺序问题,但在更新和查询时成本较高。而父子对象则提供了独立的更新和查询能力,但受限于同一分片。
摘要由CSDN通过智能技术生成

1、前言

对于solr来说是无法做两个collection之间的关联的,es是否可以做到类似于表的join关联那,这就是本篇需要研究的内容,

主要参考内容是官方文档。

先说下结论,如果不做特殊处理,es是无法完成类似与表Join的关联查询的。

2、ES如何做关联

官网里面有几种支持关联查询的办法:

2.1 应用程序做关联

这个没有什么好说的,其实不算真正的关联,需要先查询一个索引,得到值构造出条件再去查询另外一个索引。

缺点也很明显,就是需要查询多次。

2.2 冗余数据

简单的来说就是将需要查询的数据保存在一起,举个例子如下:

假设有用户索引和用户发布博客的索引,需要将用户和博客信息关联起来,对于用户来说,我们只需要取得用户的姓名信息即可,则可以这样做:

image.png

可以看下map信息如下:

实际在es内,已经将user下面的id和name进行了扁平化处理,可以通过如下的方式查询:

image.png

image.png

优点:查询速度非常快,缺点是存在数据的冗余。

2.3 嵌套对象

在ES中,对单个文档的增删改都是原子操作,有时候为了方便我们将实体和它相关的明细是放在一个文档中存储的。比如论坛发的帖子和它的回复信息。

其实和冗余对象有点类似,但是如果只是做查询会发现有问题,因为es扁平处理之后:

{

"title": [ eggs, nest ],

"body": [ making, money, work, your ],

"tags": [ cash, shares ],

"comments.name": [ alice, john, smith, white ],

"comments.comment": [ article, great, like, more, please, this ],

"comments.age": [ 28, 31 ],

"comments.stars": [ 4, 5 ],

"comments.date": [ 2014-09-01, 2014-10-22 ]

}

tilte、body、tags被称为父文档或根文档。

这样数组内之间是没有顺序关系的,这就导致了后面的查询仍然可以查到数据,嵌套对象是为了解决这个问题的,先看下普通的对象:

image.png

{

"query": {

"bool

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值