我们将在未来几个月内从SQL全文搜索切换到Lucene(SOLR堆栈)搜索。我们在这里弄清楚我们的策略的最后一个问题就是复制我们搜索平台的当前部分。
首先,描述问题的一些术语:我们的网站有一堆文件。人们可能“添加”这些文件,他们可能“喜欢”那些文件,他们可能“阅读”那些文件等。让我们称这种文件的联合为给定用户提供他们的“个人文件”。有些文档是公开的,有些文档是私有的,因此只有登录用户才能看到它们。
目前,我们有一个加权函数,它始终会在搜索列表中首先显示给定用户的“个人”文档,以用于任何搜索。这超出了正常的顺序(但是文档必须在结果集中有效 - 它只是排在任何其他不太重要的文档之上)。在SQL中,我们可以通过使用返回分数的用户定义函数来实现这一点,并且它因用户而异。
类比是Facebook--当你输入“Joe”时,它会首先找到你知道的所有Joes,然后是符合条件的任何其他Joe。我搜索“Joe”将返回与您搜索Joe不同的有序集。
在Lucene / SOLR的世界中,正如我所理解的那样,我无法弄清楚如何在没有两个单独的查询的情况下进行这种以用户为中心的文档加权,然后将它们有效地联合起来(我知道,这不是关系,而是你得到这个想法)。我们拥有数百万用户和数十万个文档。如果用户已登录,我们希望“他们的文档”首先显示在任何搜索中,然后显示其余所有文档。在每种情况下,我们希望搜索结果仅显示与原始搜索匹配的文档 - 我们只是在讨论排名顺序。
你能想到这里重现这个用户定义功能的任何策略吗?
答案 0 :(得分:1)
你能否在每个文件中都有一个字段告诉这个特定的文件属于吉姆(例如user123Doc:1
)?如果是,您可以通过对{user123Doc, score, ...}
的结果集进行排序来解决它。
或者,如果您不想将此信息存储在Lucene中,您可以将其存储在其他位置(例如在数据库中)并实现FieldComparator
,以便它可以使用这些值。有关详细信息,请访问here。