2

我建立了一个社交网络,我想通过一个 api 搜索条目。社交网络的数据库是mysql。我希望搜索以以下格式返回结果:与查询匹配并且是执行搜索的用户的朋友的结果应优先于仅与查询匹配的结果。

那么这可以在一个查询中完成,还是我必须做两个单独的查询并合并结果并删除重复项?

我可以使用 Lucene 构建一个数据结构并有效地搜索该索引,但我想知道每次创建新关系时更新文档的代价是否会太大?

谢谢

4

2 回答 2

1

对 Lucene 的引用使等式有点复杂。让我们先在没有它的情况下解决它(或至少获得一个基线)。

假设以下数据模型(或接近的东西。

tbl用户
  用户 ID PK
  用户名
  年龄
  ...

tbl好友
  UserId FK 到 tblUsers.UserId
  FriendId tblUsers.Userid = 其中一位朋友的 ID
  BuddyRating float 0.0 到 1.0(或任何标准化比例)表示
                  友谊的程度/相似度/随便

表项
  项目 ID PK
  项目名称
  描述
  价格
  ...

tblUsersToItems
   UserId FK 到 tblUsers.UserId
   ItemId FK 到
   ItemRating float 0.0 到 1.0(或任何标准化比例)表示
                用户分配给项目的“价值”。

一个天真的查询(但它是优化查询的良好基础)可能是:

SELECT [TOP 25] I.ItemId, ItemName, Description, SUM(ItemRating * BuddyRating)
FROM tblItems 我
在 I.ItemId = UI.ItemId 上左加入 tblUserToItems UI
左加入 tblBuddies B ON UI.UserId = B.FriendId
WHERE B.UserId = 'IdOfCurrentUser'
  AND SomeSearchCriteria -- 说 ItemName = 'MP3 Player'
GROUP BY I.ItemId、ItemName、描述
ORDER BY SUM(ItemRating * BuddyRating) DESC

这个想法是,如果一个给定的项目被朋友推荐/使用,它就会被赋予更多的权重。如果朋友是亲密朋友 [BuddyRating] 和/或如果朋友更强烈地推荐此商品 [ItemRating],则额外的权重更重要

优化这样的查询取决于项目的总数、给定用户拥有的好友的平均/最大数量、用户在他/她的列表中可能拥有的项目的平均/最大数量。

您正在寻找这种类型的想法/信息还是我错过了这个问题?

于 2009-11-22T21:41:21.380 回答
1

一种方法是将所有社交网络图与 Lucene 分开存储。在 Lucene 上运行关键字查询,并在网络图中查找所有朋友。对于返回的所有朋友,将所有这些朋友的搜索结果提升某个因素和手段。这种重新排序将在 Lucene 之外完成。我以前做过这样的事情,它表现得很好。

您还可以创建一个自定义的 HitCollector,它在 Lucene 中收集命中时进行提升。您必须构建属于当前用户的朋友的内部 Lucene ID 的列表。

您的社交网络图可以存储在 Mysql 中,作为稀疏邻接矩阵存储在内存中,或者您可以查看Neo4j

于 2009-11-23T15:21:03.073 回答