【问题标题】:Find Friends-of-Friends in Elasticsearch在 Elasticsearch 中查找朋友的朋友
【发布时间】: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 组装它们。有没有一种方法可以让我通过项目请求(例如)allany 公司相关的员工,以类似 {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


【解决方案1】:

运行match_all 查询,在“project_id”上使用terms 聚合和top_hits 子聚合。

这应该会为您提供按 ProjectID 分组的 EmployeeID 和 CompanyID 记录列表(适用于所有项目)。

【讨论】:

    猜你喜欢
    • 2015-10-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多