我在lucene索引中搜索时遇到问题。当使用indexSearcher访问索引时,我得到以下内容:
java.lang.IllegalArgumentException: docID must be >= 0 and < maxDoc=1300700 (got docID=1368129)
使用Google搜索没有帮助,所以我希望你能帮助我。
以下是我构建索引的方法:
Document lineOfIndex = new Document();
lineOfIndex.add(new TextField(attributeName, Class
.forName(attributeType).cast(valueOfEntry).toString(),
Store.YES));
writer.addDocument(lineOfIndex);
使用RAMDirectory将索引加载到RAM中。以下是我尝试获取文档的方式:
IndexSearcher searcher = new IndexSearcher(indexReader);
ScoreDoc[] hits = searcher.search(toSearch, 100).scoreDocs;
//move hits in ArrayList docs
for (int i = 0; i < docs.size(); i++) {
int docID = docs.get(i).doc;
Document d = searcher.doc(docID,
SearchService.fieldnamesForTableAsSet(table));
//do something with the document
}
我想读的索引是100mb大的鲁莽。 Lucene的版本是4.3。
这是stacktrace:
java.lang.IllegalArgumentException: docID must be >= 0 and < maxDoc=1300700 (got docID=1337488)
org.apache.lucene.index.BaseCompositeReader.readerIndex(BaseCompositeReader.java:182)
org.apache.lucene.index.BaseCompositeReader.document(BaseCompositeReader.java:109)
org.apache.lucene.index.IndexReader.document(IndexReader.java:447)
org.apache.lucene.search.IndexSearcher.doc(IndexSearcher.java:204)
de.fh.metadatenservice.search.SearchResultList.<init>(SearchResultList.java:42)
de.fh.metadatenservice.search.SearchService.processRequest(SearchService.java:78)
de.fh.metadatenservice.controller.handlers.SearchHandler.processRequest(SearchHandler.java:19)
de.fh.metadatenservice.controller.FrontController.doGet(FrontController.java:112)
de.fh.metadatenservice.controller.FrontController.doPost(FrontController.java:136)
javax.servlet.http.HttpServlet.service(HttpServlet.java:647)
javax.servlet.http.HttpServlet.service(HttpServlet.java:728)
任何帮助对你都很好。
提前致谢 费边
答案 0 :(得分:2)
根据BaseCompositeReader的源代码,在受保护的构造函数中计算maxDoc。
也许在创建indexReader
之后但在调用searcher.search()
之前,索引已被修改,因此maxDoc变得无效..
尝试在此行之前立即实例化indexReader
IndexSearcher searcher = new IndexSearcher(indexReader);