2012-07-22 76 views
2

我有一个数据集,可以将文档可选地关联到用户标识。说文件代表书籍,每本书可以有一个或多个所有者。在搜索时,我想匹配我自己的书籍,然后再匹配我没有的书籍。然后,我希望我所拥有的所有结果都排在结果的顶部,然后再排除我不属于我的结果。因此,该数据可能看起来像:Lucene:查询或筛选“拥有”文档的关系搜索?

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 

再说说我的用户名是14岁,我搜索“有”,我想找到我的第一所拥有,而不是一个由13或19(使拥有的书我知道把它排在列表的顶部,因为我拥有它)。但是,如果我搜索“崩溃”,即使我不拥有任何一本书,我也希望找到与该书名匹配的任何一本书。因为我没有拥有它们,所以它们会显得较低。所以,如果我对“a”进行了模糊搜索,我会在列表顶部看到我拥有的所有匹配书籍,其余的则是其余。

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

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

在迭代文档时,过滤器必须记住哪些标题已被看到,然后保留我拥有的标题。例如,如果它按顺序遍历上面的值,它会看到标题“有和没有”,不属于我;然后再次看到我拥有的同样的标题,并且必须知道它应该放弃第一个文档并保留第二个文档。我无法想象如何在不使用大量内存的情况下实现这一点,基本上在迭代时将所有标题保留在内存中,这看起来非常昂贵。这不是一个简单的“匹配”功能,因为我是否匹配取决于集合中的其他文档。

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

+1

您是否试图简单地对所有者字段进行大量的查询时间提升(您拥有多值字段所有者,而不是每个所有者的单独书籍,对吗?)。 – 2012-07-22 16:24:28

回答

0

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

+0

对于Boost来说这不是一个好的例子吗? – robbymurphy 2017-10-09 18:38:37