0

在接下来的几个月中,我们将从 SQL 全文搜索切换到 Lucene(SOLR 堆栈)搜索。在这里弄清楚我们的策略的最后一个问题是复制我们搜索平台的一个当前部分。

首先,一些描述问题的术语:我们的站点有一堆文档。人们可能会“添加”这些文档,他们可能会“收藏”这些文档,他们可能会“阅读”这些文档等等。我们将给定用户的此类文档的联合称为“个人文档”。有些文档是公开的,有些是私有的,只有登录用户才能看到它们。

目前,我们有一个加权函数,对于任何搜索,它总是首先在搜索列表中显示给定用户的“个人”文档。这超出了正常顺序(但文档必须在结果集中有效——它只排在任何其他不太重要的文档之上)。在 SQL 中,我们可以通过使用返回分数的用户定义函数来实现这一点,并且分数因用户而异。

一个类比是 Facebook——当您键入“Joe”时,它会首先找到您知道的所有 Joe,然后是符合条件的任何其他 Joe。我对“Joe”的搜索将返回与您对 Joe 的搜索不同的有序集。

据我了解,在 Lucene/SOLR 的世界中,如果没有两个单独的查询然后有效地联合在一起,我无法弄清楚如何对文档进行这种以用户为中心的加权(我知道,这不是关系,但你明白了)。我们拥有数百万用户和数十万份文档。如果用户登录,我们希望“他们的文档”首先出现在任何搜索中,然后是所有文档的其余部分。在每种情况下,我们都希望搜索结果只显示那些与原始搜索匹配的文档——我们只是在谈论排序。

你能想到这里有什么策略来重现这个用户定义的功能特性吗?

4

1 回答 1

1

您是否可以在每个文档中设置一个字段来说明该特定文档属于 Jim(例如user123Doc:1)?如果是,您可以通过对结果集进行排序来解决它{user123Doc, score, ...}

或者,如果您不想将这些信息存储在 Lucene 中,您可以将其存储在其他地方(例如,在数据库中)并实现FieldComparator它以使其与这些值一起使用。更多信息可在此处获得。

于 2013-01-29T10:22:41.573 回答