1

我目前正在尝试从 RamDirectory 中的 Lucene Index (v. 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。将已解析的查询替换为手动创建的 TermQuery 也无济于事。查询不返回任何结果。

希望有人可以帮助找到我的错误。谢谢

4

2 回答 2

1

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

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

至于提取所有记录,您无需添加字段即可。只需使用MatchAllDocsQuery

于 2013-01-18T20:31:53.820 回答
0

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

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

于 2013-01-18T18:42:56.133 回答