sql - 如何使用 elasticsearch 获得 SQL 中的 JOIN 功能?

标签 sql join elasticsearch

我有一个 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/

相关文章:

mysql - SQL - 带回其中包含 2 个特定项目的销售交易和/或

sql - sql server 中每个单词在一个字符串中重复多少次?

c# - 如何检查 SQL Server 表中是否存在一行?

mysql - SQL连接多个表而不返回相同的连接id两次

php - 帮助加入

elasticsearch - Elasticsearch特定领域的完全匹配

c# - Nest 版本 6.x 中的 InMemoryConnection Elasticsearch jsonSerializationException

sql - SQL 过程可以返回表吗?

r data.table ( <= 1.9.4) 连接行为

spring-mvc - 创建 bean 时出错 - 嵌套异常是 java.lang.stackoverflow 错误 spring 数据 elasticsearch 存储库