Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/search/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Search 通过优先考虑用户关系来搜索社交网络的最佳方式是什么?_Search_Lucene_Social Networking_Entity Relationship_Elgg - Fatal编程技术网

Search 通过优先考虑用户关系来搜索社交网络的最佳方式是什么?

Search 通过优先考虑用户关系来搜索社交网络的最佳方式是什么?,search,lucene,social-networking,entity-relationship,elgg,Search,Lucene,Social Networking,Entity Relationship,Elgg,我已经建立了一个社交网络,我想通过api搜索条目。社交网络的数据库是mysql。我希望搜索以以下格式返回结果:与查询匹配并且是执行搜索的用户的朋友的结果应优先于仅与查询匹配的结果 那么,这可以在一个查询中完成,还是必须进行两个单独的查询,合并结果并删除重复项 我可能会使用Lucene建立一个数据结构并高效地搜索索引,但我想知道每次创建新关系时更新文档的代价是否太大了 谢谢对Lucene的引用使等式有点复杂。让我们先解决它,或者至少在没有它的情况下得到一个基线 假设下面的数据模型或接近的东西 tb

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

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

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


谢谢

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

假设下面的数据模型或接近的东西

tblUsers UserId PK UserName Age ... tblBuddies UserId FK to tblUsers.UserId FriendId tblUsers.Userid = Id of one of the friends BuddyRating float 0.0 to 1.0 (or whatever normalized scale) indicating the level of friendship/similarity/whatever tblItems ItemId PK ItemName Description Price ... tblUsersToItems UserId FK to tblUsers.UserId ItemId FK to ItemRating float 0.0 to 1.0 (or whatever normalized scale) indicating the "value" assigned to item by user. 一个简单的查询,但一个优化查询的良好基础可以是:

SELECT [TOP 25] I.ItemId, ItemName, Description, SUM(ItemRating * BuddyRating) FROM tblItems I LEFT JOIN tblUserToItems UI ON I.ItemId = UI.ItemId LEFT JOIN tblBuddies B ON UI.UserId = B.FriendId WHERE B.UserId = 'IdOfCurrentUser' AND SomeSearchCriteria -- Say ItemName = 'MP3 Player' GROUP BY I.ItemId, ItemName, Description ORDER BY SUM(ItemRating * BuddyRating) DESC 这个想法是,如果某个物品被朋友推荐/使用,那么它会被赋予更大的权重。如果朋友是亲密的朋友[BuddyRating]和/或如果朋友更强烈地推荐此物品[ItemRating],则额外的体重更为重要

优化此类查询取决于项目的总体数量、给定用户的平均/最大好友数量、用户在其列表中的平均/最大项目数量


这是您正在寻找的想法/信息还是我遗漏了问题?

一种方法是将您的所有社交网络图与Lucene分开存储。在Lucene上运行关键字查询,并查找网络图中的所有朋友。对于所有返回的朋友,通过一些因素和手段提高所有这些朋友的搜索结果。这种重新排序将在Lucene之外进行。我以前做过类似的事情,它的表现相当不错

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


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

MJV,我没有问这个问题,但我在寻找你发布的问题的答案-介意提供你的lucene解决方案吗?@EugeneMi我恐怕没有lucene解决方案。我提供了这种简单的SQL方法来断言这通常是OP所追求的。当时我会添加一些代码片段或指针。Lucene但是我已经很长时间没有与Solr或Lucene合作了,我当然不了解这些系统的最新功能,尤其是自动排名。。。所以我甚至都不会开始。