2

我有一个数据集,可以选择将文档与用户 ID 相关联。假设文档代表书籍,每本书可以有一个或多个所有者。搜索时,我想先匹配我拥有的书籍,然后再匹配我不拥有的书籍。然后,我希望我拥有的所有结果在不属于我的结果之前排序在结果的顶部。因此数据可能如下所示:

Owner ID             Book Title
--------             ----------
13                   To Have and To Have Not
14                   To Have and To Have Not
19                   To Have and To Have Not
15                   Snow Crash
17                   Snow Crash
18                   Cryptonomicon
14                   Of Mice And Men

假设我的用户 id 是 14 并且我搜索“有”,我想首先找到我拥有的书,而不是 13 或 19 拥有的书(这样我就知道将它排在列表的顶部,因为我拥有它)。但是,如果我搜索“崩溃”,我想找到与该标题匹配的任何一本书,即使我不拥有任何一本书。因为我不拥有它们,所以它们会在排序中显示得较低。因此,如果我对“a”进行模糊搜索,我会在列表顶部看到我拥有的所有匹配书籍,其余的则在其后。

我对这是一个查询、一个过滤器还是两者都有点卡住了。例如,我可以编写一个过滤器来消除所有重复的标题,优先考虑我拥有的标题,然后只对其余部分执行简单的搜索(假设在搜索之前应用了过滤器)。然后,基于所有者的自定义排序将很简单。

但我不确定如何实现过滤器。它不是一个简单的 DuplicateFilter,因为它对两个字段进行操作。它类似于 Lucene in Action 的第 5.6.7 节中的安全过滤器示例,除了我仍然希望能够查看我不拥有的文档,如果我不拥有同名的书。6.4 节中的自定义过滤器也很接近,但我的问题更复杂,因为它取决于两个字段。

在遍历文档时,过滤器必须记住已经看到的标题,然后保留我拥有的标题。例如,如果它按顺序迭代上面的值,它会看到标题“To Have and To Have Not”,不属于我;然后再次看到我拥有的相同标题,并且必须知道它应该删除第一个文档并保留第二个文档。我想不出如何在不使用大量内存的情况下做到这一点,本质上在迭代时将所有标题保留在内存中,这似乎非常昂贵。这不是一个简单的“匹配”功能,因为我是否匹配取决于集合中的其他文档。

非常感谢任何指导或信息。

4

1 回答 1

0

这听起来像是对查询命中的自定义排序,如果 2 个文档具有相同的分数,那么具有“优先所有者”的文档将在搜索结果中首先列出。

于 2014-01-07T01:39:34.707 回答