我正在学习ElasticSearch,并在他们的文档中写了这行
Performing full SQL-style joins in a distributed system like Elasticsearch is prohibitively expensive. Instead, Elasticsearch offers two forms of join which are designed to scale horizontally.
请有人用外行术语向我解释第二句是什么意思。
最佳答案
作为一个序言,您可能想通过SO上的另一个线程来解释horizontal vs vertical scaling。
大多数情况下,ES群集被设计为水平增长,这意味着只要您的群集开始表现出一些弱点迹象(查询缓慢,索引编制缓慢等),您要做的就是向群集中添加一个或多个节点ES将把负载分散到更多的硬件上,从而减轻现有节点的负担。这就是横向扩展的全部内容,并且ES完美地为此设计,因为ES将索引划分为分片的方式被分配给集群中的节点。
如您所知,ES没有JOIN功能,并且出于上述原因(即“非常昂贵”)是有意这样做的。 ES中有four ways to model relationships:
通过对数据进行非规范化来实现
nested
types 来通过使用parent/child documents
通过使用应用程序侧联接
The link you referred to介绍了
nested
,has_parent
和has_child
查询,它位于上面的第二和第三点。嵌套文档和父文档/子文档的设计方式应尽可能地利用ES支持的索引/分片分区模型。当使用
nested
字段(1-N关系)时,nested
数组内的每个元素只是引擎盖下的另一个隐藏文档,并存储在群集中某个位置的分片中。使用join
字段(1-N关系)时,父文档和子文档也是存储在群集中某个位置的分片中的索引中的文档。当索引增长时(即,当父子项和/或嵌套数据越来越多时),您将添加节点,并且包含文档的分片将透明地散布在群集中。这意味着无论您的文档存储在哪里,都可以检索它们及其相关文档,而不必执行昂贵的联接。
关于elasticsearch - 水平缩放的意义,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51851754/