【问题标题】:How to use elasticsearch to get JOIN functionality as in SQL?如何使用 elasticsearch 来获得 SQL 中的 JOIN 功能?
【发布时间】:2015-12-27 05:17:42
【问题描述】:

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

【问题讨论】:

标签: sql join elasticsearch


【解决方案1】:

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 是一种范式转变。如果您要迈出这一步,就需要从数据的角度进行不同的思考。

【讨论】:

  • 谢谢!我同意 elasticsearch 的工作方式与 RDBMS 查询非常不同。但现在我们正处于从 RDBMS 转向 ES 的阶段,并且希望我们的解决方案能够处理现有数据。作为查询结果存储我们想要的字段是目前一个不错的解决方案。
猜你喜欢
  • 2014-04-03
  • 1970-01-01
  • 2015-08-14
  • 1970-01-01
  • 2014-09-09
  • 1970-01-01
  • 1970-01-01
  • 2016-01-06
  • 1970-01-01
相关资源
最近更新 更多