1

我在 lucene 索引中搜索时遇到问题。当使用 indexSearcher 访问索引时,我得到以下信息:

java.lang.IllegalArgumentException: docID must be >= 0 and < maxDoc=1300700 (got docID=1368129)

用谷歌搜索没有帮助,所以我希望你能帮助我。

这是我构建索引的方式:

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。

这是堆栈跟踪:

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)

任何帮助都会对你很好。

在此先感谢费边

4

1 回答 1

2

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

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

尝试indexReader在此行之前实例化

IndexSearcher searcher = new IndexSearcher(indexReader);

于 2013-06-16T10:39:19.763 回答