在Lucene查询中筛选少于N个术语的文档

在Lucene查询中筛选少于N个术语的文档,lucene,Lucene,作为Lucene查询的一部分,是否可以从结果中排除少于N个术语或小于给定大小的文档 完整的故事:我有一个包含许多文档的Lucene索引。有的很大,有的很小,可能只有几个字。我想运行一些测试,但只能在大小合理的文档上运行。如何筛选出小文档?目前,我正在获取术语频率向量并删除少于N个术语的文档: BooleanQuery q = some query... TopDocs top = indexSearcher.search(q, size); Collection<Integer> d

作为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();
}
BooleanQuery q=一些查询。。。
TopDocs top=indexSearcher.search(q,大小);
Collection docNums=collectDocNums(顶部);
迭代器it=docNums.Iterator();
while(it.hasNext()){
int candDocNum=it.next();
频率向量=
getTermFreqVector(candDocNum,“字段”);
if(tfv.getTerms().length
这可以通过在查询本身中进行筛选或以某种方式对其下方的循环进行批处理来更有效地完成吗?

请看一看:它只收集得分>0的文档。您可以编写自己的类似收集器,只接受具有
score>X
的文档

当然,只有当您能够找到
N
X
之间的某种关系时,以上才适用。根据我的理解,这两件事应该相互关联:匹配项越少,分数越低,反之亦然

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

请看一看:它只收集分数>0的文档。您可以编写自己的类似收集器,只接受具有
score>X
的文档

当然,只有当您能够找到
N
X
之间的某种关系时,以上才适用。根据我的理解,这两件事应该相互关联:匹配项越少,分数越低,反之亦然


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

过滤器可能是一种合理的实现。听起来这样的过滤器在搜索时会被频繁重用,所以缓存过滤器是值得的。我不知道有哪种标准的过滤器可以做到这一点,但是定制的过滤器会很好地工作

我将实现如下功能:

//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);
    }
}

过滤器可能是一个合理的实现。听起来这样的过滤器在搜索时会被频繁重用,所以缓存过滤器是值得的。我不知道有哪种标准的过滤器可以做到这一点,但是定制的过滤器会很好地工作

我将实现如下功能:

//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);
    }
}

问题:FilteredDocIdSet不将IndexReader作为Ctr。参数,但另一个DocIdSet。问题:FilteredDocIdSet不将IndexReader作为Ctr。参数,但另一个DocIdSet。