I have posted before about a problem with TermDocs.skipTo () but never managed to reproduce it. I have now got it to fail using the following program, please can someone try it and see if they get the stack trace:
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: Array index out of range: 101306 at org.apache.lucene.util.BitVector.get(BitVector.java:72) at org.apache.lucene.index.SegmentTermDocs.next(SegmentTermDocs.java:118) at org.apache.lucene.index.SegmentTermDocs.skipTo(SegmentTermDocs.java:176) at org.apache.lucene.index.MultiTermDocs.skipTo(MultiReader.java:413) at Test4.test(Test4.java:88) at main(Test4.java:69) The program creates a test index, if you run it a second time it will not create the index. Change the directory name on line 33. Many Thanks Mike Ps I am using Lucene 2.2 and java 1.6 u1 import java.io.IOException; import java.util.Random; import org.apache.lucene.analysis.standard.StandardAnalyzer; import org.apache.lucene.document.Document; import org.apache.lucene.document.Field; import org.apache.lucene.document.Field.Index; import org.apache.lucene.document.Field.Store; import org.apache.lucene.index.CorruptIndexException; import org.apache.lucene.index.IndexReader; import org.apache.lucene.index.IndexWriter; import org.apache.lucene.index.MultiReader; import org.apache.lucene.index.Term; import org.apache.lucene.index.TermDocs; import org.apache.lucene.store.Directory; import org.apache.lucene.store.FSDirectory; import org.apache.lucene.store.LockObtainFailedException; public class Test4 { /** * @param args * @throws IOException * @throws LockObtainFailedException * @throws CorruptIndexException */ public static void main(String[] args) throws Exception { Random rand = new Random(0); Directory[] dirs = new Directory[10]; for (int i = 0; i < dirs.length; i++) { dirs[i] = FSDirectory.getDirectory("c:\\temp\\lucenetest\\" + Integer.toString(i)); if (!IndexReader.indexExists(dirs[i])) { IndexWriter writer = new IndexWriter(dirs[i], new StandardAnalyzer(), true); for (int j = 0; j < 100000; j++) { Document doc = new Document(); doc.add(new Field("i", Integer.toString(rand.nextInt(100)), Store.YES, Index.UN_TOKENIZED)); doc.add(new Field("j", Integer.toString(rand.nextInt(1000)), Store.YES, Index.UN_TOKENIZED)); writer.addDocument(doc); if (j % 10000 == 0) { System.out.println(j); } } writer.optimize(); writer.close(); writer = null; } IndexReader reader = IndexReader.open(dirs[i]); for (int j = 0; j < 1000; j++) { reader.deleteDocument(rand.nextInt(reader.maxDoc())); } reader.close(); } IndexReader[] readers = new IndexReader[dirs.length]; for (int i = 0; i < dirs.length; i++) { readers[i] = IndexReader.open(dirs[i]); } IndexReader reader = new MultiReader(readers); TermDocs docs = reader.termDocs(); for (int i = 0; i < 100; i++) { for (int j = 0; j < 1000; j++) { try { test(docs, Integer.toString(i), Integer.toString(j)); } catch (Exception e) { System.err.println("Failed at i="+i+" j="+j); throw e; } } } docs.close(); reader.close(); } private static void test(TermDocs docs, String i, String j) throws IOException { docs.seek(new Term("i", i)); while (docs.next()); docs.seek(new Term("j", j)); while (docs.next()); docs.seek(new Term("i", i)); if (docs.next()) { while (docs.skipTo(docs.doc()+1000)); } docs.seek(new Term("j", j)); if (docs.next()) { while (docs.skipTo(docs.doc()+1000)); } } }