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));
}
}
}