我目前正在尝试从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也无济于事。 查询不返回任何结果。
希望有人能帮忙找到我的错误。 感谢
答案 0 :(得分:1)
我相信您在搜索时遇到问题,因为您使用的是IntField,而不是StringField或TextField。 IntField和其他数字字段设计用于数值范围查询,并且不以其原始形式编制索引。您可以使用NumericRangeQuery来搜索它们。
但是,实际上,IntField只应该用于我的数字值,而不是用于数字字符串,这就是你看来的数字。通常,ID应该是关键字或文本字段。
就拉动所有记录而言,您无需添加字段即可。只需使用MatchAllDocsQuery。
答案 1 :(得分:0)
我认为首先应该运行Luke来验证索引的内容。
此外,如果您允许 * 作为queryParser.setAllowLeadingWildcard(true);
查询的第一个字符,则ID:*
之类的查询将检索所有文档,而不必包含 getAll 字段。