当前位置: 首页 > 面试题库 >

如何使用Elasticsearch获得SQL中的JOIN功能?

萧晔
2023-03-14
问题内容

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


问题答案:

Elasticsearch不支持JOIN,这首先是NoSQL技术的全部目的。有多种方法可以使用父/子关系(如您所注意到的),嵌套对象以及特殊术语查找优化来在数据之间创建一些关系,仅此而已。

但是,为了充分利用Elasticsearch,主要思想是尽可能使数据规范化并存储独立的文档。这意味着您可以获取一个文档,其中包含所需的所有信息。您不必担心将要复制数据的事实。

例如,假设您在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 Java API从查询生成器中获取不同的值 有没有办法通过?你能帮我解决这个问题吗?我试了很多方法,但都没能解决。但我可以在SQL Workbench中实现同样的功能,下面使用Kibana translator给出了等效的json查询。 等效Elasticsearch查询如下: 所以现在我想形成这个JSON查询使用R

  • 问题内容: 如何在编写SQL查询的Linq中使用左联接? 问题答案: 使用Join关键字而不是Left join,并且必须使用“ INTO”关键字和“ DefaultIfEmpty()”方法,因为右表将返回空值。

  • 问题内容: 我想在 SQL Server 2008中 删除使用。 但是我得到这个错误: 消息156,级别15,状态1,第15行 关键字“ INNER”附近的语法错误。 我的代码: 问题答案: 您需要指定要从中删除的表。这是带有别名的版本:

  • 问题内容: 本文指出:“ defer语句将函数调用推送到列表上。” 我想知道是否可以从程序的另一个位置访问该列表中的元素,然后调用它们?我可以多次调用它们吗?我假设我对具有延迟行为(如果有帮助)的函数进行了引用。 因此,这是我想做的简短示例: 问题答案: 调用存储的“列表” 完全是特定于实现的,因此您 没有可靠的方式访问此列表 。1,2个为* G编译器家族中的实现细节(虽然有点老),可以发现在拉斯

  • 问题内容: 我只是开始使用in ,有一点让我感到困惑的是,在此示例中,我的内部函数如何获得作为参数的访问权限? 问题答案: 为了增加@AliAnarkali所说的内容,HOC将为您返回一个组件,因此当您编写类似 EnhancedApp基本上是 哪个功能组件以及何时渲染EnhancedApp 这类似于功能组件如何接收onChange和value作为道具,因此在HOC中,内部函数会像这样获取道具。

  • 核心2:BookID、文本、公决、大小、最新更新 http://localhost:8983/solr/core1/select?fl=title,%20 venue,%20 authors,%20pubdate&q={!join%20from=paperid%20to=filename%20fromindex=core2%20}大小:15870 上述查询返回零结果为: 我不知道solr join