lucene 4.x用户定义的Filter,getDocIdSet(....)中的DocsEnum返回null并且无法工作

时间:2013-12-30 15:53:21

标签: lucene

我利用lucene 4.0来构建我的搜索引擎。我需要在搜索时定义一个Filter。像这样的过滤器代码可以正常工作:

public DocIdSet getDocIdSet(AtomicReaderContext context, Bits acceptDocs)
        throws IOException {
            String[] target_real_names = {"eMule"};
    OpenBitSet obs = new OpenBitSet(context.reader().maxDoc());
    for(String target_real_name : target_real_names){
        TermQuery query=new TermQuery(new Term(Fields.PROJECT_REAL_NAME,target_real_name)); 
        IndexSearcher indexSearcher=new IndexSearcher(context.reader());  
        TopDocs docs=indexSearcher.search(query,context.reader().maxDoc());  
        ScoreDoc[] scoreDocs=docs.scoreDocs;  
        if (scoreDocs.length==1) {  
            obs.set(scoreDocs[0].doc);  
        }  
    }
    return obs;
}

但是像这样的代码无效:

public DocIdSet getDocIdSet(AtomicReaderContext context, Bits acceptDocs)
        throws IOException {
    OpenBitSet obs = new OpenBitSet(context.reader().maxDoc());
            String[] target_real_names = {"eMule"};
    for(String target_real_name : target_real_names){
        DocsEnum de = context.reader().termDocsEnum(new Term(Fields.PROJECT_REAL_NAME, target_real_name));
        if(de.nextDoc()!= -1){
            obs.set((long)de.docID());
        }
    }
    return obs;
}

在这段代码中,de将为null,我不知道为什么。任何人都可以帮助我吗?

1 个答案:

答案 0 :(得分:0)

查看termDocsEnum()的javadoc - >如果字段或术语不存在,则返回null。

这意味着当您的术语target_real_name不存在时,de为null是完全正常的。