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