【发布时间】:2016-01-26 16:29:31
【问题描述】:
我有一个包含员工、项目和公司的系统。这些实体之间的关系当前存储在一个名为关系的 SQL 表中。该表的额外简化版本如下所示:
EntityID | EntityCategory | TypeID | AssocType
123 | Employee | ABC | Project
123 | Employee | DEF | Project
789 | Company | ABC | Project
789 | Company | DEF | Project
(我应该注意到,这个数据库的真实版本有更多的实体类型——例如,联系人也可以与项目或员工相关联,因此类别/类型列)我想找到哪些员工和公司“知道”通过与项目的相互关系——基本上是有限地搜索朋友的朋友。我们将此称为“间接关系”。在 SQL 中,我可以这样做:
SELECT R.EntityID AS EmployeeID, R2.EntityID AS CompanyID,
Count(R.TypeID) as SharedProjectCount
FROM Relationships as R
INNER JOIN Relationships as R2 ON
R.TypeID=R2.TypeID AND R2.EntityCategory='Company' AND R2.AssocType='Project'
WHERE R.EntityCategory='Employee' AND R.AssocType='Project'
GROUP BY R.EntityID, R2.EntityID
并得到如下结果集:
EmployeeID | CompanyID | SharedProjectCount
123 | 789 | 2
我希望能够在 Elasticsearch 中做到这一点。数据的存储方式略有不同:
[
{EmployeeID:123, ProjectID:ABC},
{EmployeeID:123, ProjectID:DEF},
{CompanyID:789, ProjectID:ABC},
{CompanyID:789, ProjectID:DEF}
]
我的问题的核心是:我想将这些关系数据批量提取到 Elasticsearch 中。直接关系都在 SQL 表中并且可以高效地检索。在 SQL 上计算间接关系很困难,我想尝试使用 Elasticsearch 组装它们。有没有一种方法可以让我通过项目请求(例如)all 与 any 公司相关的员工,以类似 {EmployeeID:123, CompanyID:789,SharedProjectCount:2}?
我已经知道像 Neo4j 这样的工具是处理此类图表的最佳工具;请理解这不是一个选项,我正在专门寻找一种与 Elasticsearch 相关的方法。我愿意改变 Elasticsearch 中的数据结构。
【问题讨论】:
-
当您说“新关系”时,该关系是否由
ProjectID:DEF定义? -
一个新的关系是由一对 ID 定义的,所以在 Elasticsearch 中类似于 {EmployeeID:456, ProjectID:XYZ},或者在上面的 SQL 表中 [456 |员工 | XYZ |项目]
-
你能不能不只是在
ProjectID上进行术语查询并取回共享该 ProjectID 的所有 EmployeeID 和 CompanyID 吗? -
赞成,因为您当然是对的,对于我的“何时创建关系”问题。谢谢!但是通过这个例子,我摆脱了我最大的问题,即从 Elasticsearch 中批量获取间接相关的实体。我已经编辑了问题以澄清这一点。
-
是的,我的意思是你基本上需要加入。 ES 不做连接,因为分布式连接是一个根本性的难题。您可能必须在代码中执行此操作。
标签: elasticsearch relationship