Lucene:DocID太高,从IndexSearcher获取Exception

时间:2013-06-15 23:32:49

标签: lucene indexing

我在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)

任何帮助对你都很好。

提前致谢 费边

1 个答案:

答案 0 :(得分:2)

根据BaseCompositeReader的源代码,在受保护的构造函数中计算maxDoc。

也许在创建indexReader之后但在调用searcher.search()之前,索引已被修改,因此maxDoc变得无效..

尝试在此行之前立即实例化indexReader

IndexSearcher searcher = new IndexSearcher(indexReader);