如何使用elasticsearch来获取SQL中的JOIN功能?

时间:2015-12-27 05:17:42

标签: sql join elasticsearch

我有一个SQL查询,它在3-4个表上执行JOIN操作以获取数据。现在我们转向弹性搜索以获得更好的性能。如何使用elasticsearch复制相同的JOIN查询?我已阅读有关父/子文档但我的数据没有任何严格的父/子类数据。

1 个答案:

答案 0 :(得分:5)

Elasticsearch不支持JOIN,这首先是NoSQL technologies的全部目的。有一些方法可以使用parent/child relationships(正如您所注意到的),nested objects以及使用特殊的terms lookup optimization在您的数据之间创建一些关系,但这就是它。

但是,为了充分利用Elasticsearch,主要的想法是尽可能denormalize您的数据并存储自包含的文档。这意味着您可以获取单个文档,它包含所需的所有信息。您并不关心数据是否会重复这一事实。

例如,假设您在SQL数据库中有以下JOIN查询,用于检索所有人的地址,城市和国家(即4个表):

SELECT p.first_name, p.last_name, 
       a.street_name, a.street_num,
       c.name, c2.name
  FROM person p
  JOIN address a ON a.id = p.addr_id
  JOIN city c ON c.id = p.city_id
  JOIN country c2 ON c2.id = p.country_id

在Elasticsearch中,您将创建一个文档,其中包含上述查询返回的字段,即

 {
     "first_name": "John",
     "last_name": "Doe",
     "street_num": 34,
     "street_name": "Main Street",
     "city": "San Francisco",
     "country": "United States"
 }

因此,有一种方法可以看出,在Elasticsearch中,您将存储由于在关系数据库中运行查询而获得的相同(或非常相似)的字段集。

从RDBMS到Elasticsearch的步骤是一种范式转变。如果您要采取这一步骤,您需要根据数据进行不同的思考。