【发布时间】:2019-01-21 22:05:53
【问题描述】:
我正在学习 ElasticSearch,在他们的文档中写到这一行
在分布式系统中执行完整的 SQL 样式连接,例如 Elasticsearch 非常昂贵。相反,Elasticsearch 提供两种形式的连接,旨在水平扩展。
请有人用外行术语解释一下第二句话是什么意思。
【问题讨论】:
标签: elasticsearch
我正在学习 ElasticSearch,在他们的文档中写到这一行
在分布式系统中执行完整的 SQL 样式连接,例如 Elasticsearch 非常昂贵。相反,Elasticsearch 提供两种形式的连接,旨在水平扩展。
请有人用外行术语解释一下第二句话是什么意思。
【问题讨论】:
标签: elasticsearch
作为序言,您可能希望通过 SO 上的另一个线程来解释 horizontal vs vertical scaling。
在大多数情况下,ES 集群被设计为水平增长,这意味着每当您的集群开始出现一些弱点(查询速度慢、索引速度慢等)时,您需要做的就是添加一个或多个节点到您的集群,ES 会将负载分散到更多硬件上,从而减轻现有节点的负担。这就是水平扩展的全部意义所在,ES 正是为此而设计的,因为它将索引划分为分片,然后分配给集群中的节点。
如您所知,ES 没有 JOIN 功能,他们出于上述原因故意这样做(即“过于昂贵”)。 ES中有four ways to model relationships:
nested types
The link you referred to,它介绍了nested、has_parent 和has_child 查询,是关于上面的第二个和第三个要点。嵌套和父/子文档的设计方式是尽可能多地利用 ES 支持的索引/分片分区模型。
当使用nested 字段(1-N 关系)时,nested 数组内的每个元素只是另一个隐藏的文档,并存储在集群中某个位置的分片中。当使用join 字段(1-N 关系)时,父文档和子文档也是存储在您的索引中的文档,该文档位于集群中某处的分片内。当您的索引增长时(即当您有越来越多的父子和/或嵌套数据时),您添加节点,包含您的文档的分片将透明地分布在集群中。这意味着无论您的文档存储在何处,您都可以检索它们以及它们的相关文档,而无需执行昂贵的连接。
【讨论】: