根据友谊程度订购Solr结果

时间:2011-08-22 15:59:15

标签: ruby-on-rails solr sunspot

我目前正在使用Solr 1.4(很快升级到3.3)。友谊表非常标准:

id | follower_id | user_id 

我想执行常规关键字solr搜索,并按分离度和标准分数顺序对结果进行排序。从结果集中,如果关键字匹配我的任何直接朋友,他们将首先显示。其次是我的朋友的朋友,第三是朋友的第三度分离。所有其他结果都会在之后发生。

我很确定Solr不会提供任何“预先烘焙”的方式,因此我可能需要在MySQL上加入以正确排序结果。好奇,如果有人之前已经这样做过和/或有一些见解。

4 个答案:

答案 0 :(得分:2)

在Solr中根本不可能。但是,如果您不是太受限制并且可以使用其他平台,请考虑neo4j?

“连接”和度数正是Neo4j介入的地方。

enter image description here

http://neo4j.org/

答案 1 :(得分:2)

一种方法可能是创建degree_1degree_2等字段,并将字段 x 的朋友列表存储在字段degree_x中。然后,您可以触发多个查询 - 第一个将结果限制为degree_1中有您的人,第二个将结果限制为degree_2中有您的人,等等。

这有点复杂,但我能想到使用Solr的唯一解决方案。

答案 2 :(得分:0)

之前我没有在solr中代表过图表,但我认为从高层次来看,这就是你能做到的。首先,将人们表示为节点,将社交网络表示为数据库中的图表。在sql中实现transitive closure函数以允许您遍历图形。然后,您将结果索引到solr,并将社交网络信息存储到payloadsexample

答案 3 :(得分:-1)

我能够通过执行多个查询并使用范围“with”来限制同事,第二和第三学位同事的id,使用id并使用mysql进行选择。

@search_1 = perform_search(1, options)
@search_2 = perform_search(2, options)

if degree == 1
  with(:id).any_of(options[:colleague_ids])
elsif degree == 2
  with(:id).any_of(options[:second_degree_colleagues])
end

这是一个肮脏的解决方案,因为我必须执行多个solr查询,但直到我可以使用动态字段排序选项(solr 3.3,当前不支持太阳黑子)我真的不知道任何其他方法来实现这一点。