Lucene Query即使应该返回结果也不会返回结果

时间:2013-01-18 17:37:45

标签: lucene

我目前正在尝试从RamDirectory中的Lucene索引(第4版)获取所有文档。

关于索引创建,使用以下addDocument函数:

public void addDocument(int id, String[] values, String[] fields) throws IOException{
    Document doc = new Document();

    doc.add(new IntField("getAll", 1, IntField.TYPE_STORED));    
    doc.add(new IntField("ID", id, IntField.TYPE_STORED));                                              
    for(int i = 0; i < fields.length; i++){
        doc.add(new TextField(fields[i], values[i], Field.Store.NO));
    }

    writer.addDocument(doc);
}

在为所有文件调用此文件后,作者将被关闭。 正如您从添加到文档的第一个字段中看到的那样,我添加了一个额外的字段“getAll”,以便于检索所有文档。如果我理解正确,查询“getAll:1”应该返回索引中的所有文档。但事实并非如此。 我正在使用以下功能:

public List<Integer> getDocIds(int noOfDocs) throws IOException, ParseException{
    List<Integer>   result    = new ArrayList<Integer>(noOfDocs);
    Query           query     = parser.parse("getAll:1");
    ScoreDoc[]      docs      = searcher.search(query, noOfDocs).scoreDocs;

    for(ScoreDoc doc : docs){
        result.add(doc.doc);
    }

    return result;
}

noOfDocs是已编制索引的文档数。当然,我在创建IndexSearcher时使用了相同的RamDirectory。 将解析后的Query替换为手动创建的TermQuery也无济于事。 查询不返回任何结果。

希望有人能帮忙找到我的错误。 感谢

2 个答案:

答案 0 :(得分:1)

我相信您在搜索时遇到问题,因为您使用的是IntField,而不是StringField或TextField。 IntField和其他数字字段设计用于数值范围查询,并且不以其原始形式编制索引。您可以使用NumericRangeQuery来搜索它们。

但是,实际上,IntField只应该用于我的数字值,而不是用于数字字符串,这就是你看来的数字。通常,ID应该是关键字或文本字段。

就拉动所有记录而言,您无需添加字段即可。只需使用MatchAllDocsQuery

答案 1 :(得分:0)

我认为首先应该运行Luke来验证索引的内容。

此外,如果您允许 * 作为queryParser.setAllowLeadingWildcard(true);查询的第一个字符,则ID:*之类的查询将检索所有文档,而不必包含 getAll 字段。