【发布时间】:2013-03-26 08:52:06
【问题描述】:
朋友们,
我是 Lucene 的新手...
我成功地创建了一个索引,添加了字段,我可以搜索等等。
现在,我的数据库中有一个视图,可以告诉哪些用户可以查看哪个文档。这个视图是使用几个复杂的规则创建的,所以我想重用这个视图。因此,我需要在 Lucene 搜索中添加一个过滤器,以删除与查询匹配但用户无权访问的文档。
我现在尝试做的是:
- 将数据库文档 ID 存储在字段中。这是一个 Guid,我将它存储为一个字符串。
- 创建一个自定义过滤器,获取当前用户可以访问的所有文档 id,然后使用 lucene 中的字段进行过滤
我觉得它效率不高...用户可以访问数十万个文档,因此我可能会检索需要过滤的 200 000 个文档 ID。
我想我必须缓存一些东西...
这是我写的代码,但它不起作用:使用过滤器时没有返回任何文档(它应该返回3个文档)
public class LuceneAuthorisationFilter : Filter
{
public override DocIdSet GetDocIdSet(Lucene.Net.Index.IndexReader reader)
{
List<Guid> ids = this.load(); // Load list of ID from database
OpenBitSet result = new OpenBitSet(reader.MaxDoc);
int[] docs = new int[1];
int[] freq = new int[1];
for (int i = 0; i < ids.Count; i++)
{
Lucene.Net.Index.TermDocs termDocs = reader.TermDocs(new Lucene.Net.Index.Term("EmId", ids.ElementAt(i).ToString()));
int count = termDocs.Read(docs, freq);
if (count == 1)
{
result.FastSet(docs[0]);
}
}
return result;
}
}
你有什么想法吗?以及如何提高性能?
谢谢
编辑:
上面的代码有效,问题只是 EmId 字段没有被索引。现在我进行了更改,它可以正常工作了。
现在我想知道任何提示以提高性能
第二次编辑以添加反馈
注意:测试环境包含25000个文档,文档访问列表包含50000个id(因为所有文档还没有
索引)
- 使用上面的自定义过滤器:第一次约 2600 毫秒,下次缓存过滤器时为 2100 毫秒
- 使用布尔查询过滤器:~4700ms 然后~4000ms
这些性能很差......所以我再次搜索了一个找到的“FieldCacheTermsFilter”过滤器。
- 使用 FieldCacheTermsFilter:~600ms 然后~60ms
这是可以接受的性能
PS:我还发现了另一个类似的question
【问题讨论】:
标签: c# search filter lucene lucene.net