我如何在 ElasticSearch 中为社交关系建模?

How can I model social connections in ElasticSearch?

考虑到 ElasticSearch NoSQL 数据库,我正在尝试弄清楚如何最好地模拟社会关系数据(是的,图形数据库将是这项工作的最佳工具,但在我目前的情况下,这个选择可能是被迫的在我身上)。

我是 ElasticSearch 的新手,正在研究建立关系模型的方法,但它们似乎不适合社交关系的用例,或者至少对我来说这些模型的建立方式并不明显。

我的要求的一个大大简化的版本如下:

我们可能查询的内容:

虽然查询看起来可能是一个挑战,但我更感兴趣的是在 ElasticSearch 中简单地对人、工作场所以及它们之间的关系进行建模,使其有意义、可维护并且可以支持这样的查询。

文档告诉我 ElasticSearch 没有连接。它有嵌套对象,也有父子关系,但这些似乎都不适合人与人之间的友谊关系;嵌套对象和父子对象都有一个隐含的单一所有权概念……除非我开始在其他人的对象(朋友和被阻止的对象)和工作场所中到处复制人的数据。这当然会引入保持数据一致性的问题,因为更改个人数据需要更改他们各处的重复数据,并且删除友谊关系必须删除与另一个人的关系的另一方。这也带来了交易问题,因为我听说不支持跨不同文档的交易支持。

除了非规范化和复制,或数据库外部的应用程序端连接之外,是否有更好的方法(除了使用不同的数据库)以更易于查询的合理方式对此进行建模?

示例简化 json 并在之后进行一些解释:

{ "type":"person", "id":1, "name":"InverseFalcon", "workplace":"Whosebug", "friend_ids":[3,4,19], "blocked_ids":[45,24], "blocked_by_ids":[5] }

这应该快如闪电,因为您可以检索文档、处理集合(并集、交集等),然后执行多重获取 (mget) 来检索名称和工作流位置。不使用图形数据库意味着递归调用以获取朋友的朋友等