我有一个SQL查询,它在3-4个表上执行JOIN操作以获取数据。现在我们转向弹性搜索以获得更好的性能。如何使用elasticsearch复制相同的JOIN查询?我已阅读有关父/子文档但我的数据没有任何严格的父/子类数据。
答案 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的步骤是一种范式转变。如果您要采取这一步骤,您需要根据数据进行不同的思考。