Lucene:查询或过滤关系搜索“拥有”文档?

时间:2012-07-22 13:21:18

标签: search filter lucene relational

我有一个数据集,可以选择将文档与用户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并且我搜索“have”,我想首先找到我拥有的书而不是13或19所拥有的那本书(所以我知道要将它排在顶部列表,因为我拥有它)。但是,如果我搜索“崩溃”,我想找到与该标题匹配的任何一本书,即使我没有。因为我不拥有它们,所以它们在排序中显得较低。因此,如果我对“a”进行模糊搜索,我会在列表顶部看到我拥有的所有匹配书籍,其余的则在之后。

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

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

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

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

1 个答案:

答案 0 :(得分:0)

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