【发布时间】:2015-12-27 05:17:42
【问题描述】:
我有一个 SQL 查询,它对 3-4 个表执行 JOIN 操作以获取数据。现在我们正在转向弹性搜索以获得更好的性能。如何使用 elasticsearch 复制相同的 JOIN 查询?我已阅读有关父/子文档的信息,但我的数据没有任何严格的父/子类型的数据。
【问题讨论】:
标签: sql join elasticsearch
我有一个 SQL 查询,它对 3-4 个表执行 JOIN 操作以获取数据。现在我们正在转向弹性搜索以获得更好的性能。如何使用 elasticsearch 复制相同的 JOIN 查询?我已阅读有关父/子文档的信息,但我的数据没有任何严格的父/子类型的数据。
【问题讨论】:
标签: sql join elasticsearch
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 是一种范式转变。如果您要迈出这一步,就需要从数据的角度进行不同的思考。
【讨论】: