【问题标题】:Lucene: query or filter for relational search for "owned" documents?Lucene:查询或过滤“拥有”文档的关系搜索?
【发布时间】:2012-07-20 23:39:25
【问题描述】:

我有一个数据集,可以选择将文档与用户 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”,不属于我;然后再次看到我拥有的相同标题,并且必须知道它应该删除第一个文档并保留第二个文档。我想不出如何在不使用大量内存的情况下做到这一点,本质上在迭代时将所有标题保留在内存中,这似乎非常昂贵。这不是一个简单的“匹配”功能,因为我是否匹配取决于集合中的其他文档。

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

【问题讨论】:

  • 您是否尝试过简单地将较大的查询时间提升放在所有者字段上(您有多值字段所有者,而不是每个所有者单独的书,对吗?)。

标签: search filter lucene relational


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-01-10
    • 2020-10-06
    • 1970-01-01
    • 1970-01-01
    • 2012-12-04
    • 2011-10-12
    相关资源
    最近更新 更多