1

作为 Lucene 查询的一部分,是否有可能从结果中排除具有少于 N 个术语或小于给定大小的文档?

完整的故事:我有一个包含许多文档的 Lucene 索引。有的很大,有的很小,可能只有几个字。我想进行一些测试,但仅限于大小合理的文档。如何过滤掉小文件?目前,我正在获取术语频率向量并删除少于 N 个术语的文档:

BooleanQuery q = some query...
TopDocs top = indexSearcher.search(q, size);
Collection<Integer> docNums = collectDocNums(top);
Iterator<Integer> it = docNums.iterator();
while (it.hasNext()) {
  int candDocNum = it.next();
  TermFreqVector tfv =
    indexReader.getTermFreqVector(candDocNum, "field");
  if (tfv.getTerms().length < N)
     it.remove();
}

这可以通过过滤查询本身或以某种方式批处理它下面的循环来更有效地完成吗?

4

2 回答 2

1

过滤器可能是一个合理的实现。听起来这样的过滤器会在搜索时经常重复使用,所以缓存过滤器是值得的。我不知道有什么标准过滤器可以做到这一点,但是定制的过滤器会很好用。

我会实现类似的东西:

//Important to wrap the filter with a CachingWrapper, for performance.
filter = new CachingWrapperFilter(new CustomFilter());

public class CustomFilter() Extends Filter{
    public getDocIdSet(IndexReader reader) {
        return new CustomSet(reader);
    }
}

public class CustomSet(IndexReader reader) extends FilteredDocIdSet{
    public boolean match(int docid) {
        reader.getTermFreqVector(candDocNum, "field");
        return (tfv.getTerms().length >= N);
    }
}
于 2012-12-19T20:53:26.807 回答
0

看看PositiveScoresOnlyCollector:它只收集具有score > 0. 您可能会编写自己的类似收集器,只接受具有score > X.

N当然,只有当您可以找到和之间的某种关系时,上述内容才适用X。据我了解,这两件事应该相关:匹配的术语越少,分数越低,反之亦然。

如果您可以定义一些最低分数阈值,那么这种方法应该比您当前使用的方法更有效。

于 2012-12-17T11:03:50.347 回答