我有一个 SQL 查询,它对 3-4 个表执行 JOIN 操作以获取数据。现在我们正在转向 Elasticsearch 以获得更好的性能。如何使用 elasticsearch 复制相同的 JOIN 查询?我已阅读有关父/子文档的信息,但我的数据没有任何严格的父/子数据。
最佳答案
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 是一种范式转变。如果您打算迈出这一步,您需要对数据进行不同的思考。
关于sql - 如何使用 elasticsearch 获得 SQL 中的 JOIN 功能?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34477816/