Dear Digy, As of Lucene 2.3, there are new setValue(...) methods that allow you to change the value of a Field. However, there seems to be an issue with the org.apache.lucene.index.FieldWriter.writeField(...) API that stores the string value for the field, which happens to be null in the case of a TokenStream.
The org.apache.lucene.index.FieldWriter.writeField(...) API needs to be changed to verify whether the Field Data is an instance of String, Reader or a TokenStream and then retrieve the respective values. I shall patch this soon. Is there a particular reason you are using a TokenStream ? I suggest you set the text value directly to the Field: Field1.setValue("xxx"); Moreover, it's best to create a single Document instance, then add multiple Field instances to it, but hold onto these Field instances and re-use them by changing their values for each added document. After the document is added, you then directly change the Field values (idField.setValue(...), etc), and then re-add your Document instance. You cannot re-use a single Field instance within a Document, and, you should not change a Field's value until the Document containing that Field has been added to the index. 2008/7/8 Digy <[EMAIL PROTECTED]>: > Hi all, > > > > I am a Lucene.Net user. Since I need a fast indexing in my current project > I try to use Lucene 2.3.2 which I convert to .Net with IKVM(Since Lucene.Net > is currently in v2.1) and I use the same instances of document and fields to > gain some speed improvements. > > > > I use TokenStreams to set the value of fields. > > > > My problem is that I get NullPointerException in "addDocument". > > > > Exception in thread "main" java.lang.NullPointerException > > at > org.apache.lucene.store.IndexOutput.writeString(IndexOutput.java:99) > > at > org.apache.lucene.index.FieldsWriter.writeField(FieldsWriter.java:127) > > at > org.apache.lucene.index.DocumentsWriter$ThreadState$FieldData.processField(DocumentsWriter.java:1418) > > at > org.apache.lucene.index.DocumentsWriter$ThreadState.processDocument(DocumentsWriter.java:1121) > > at > org.apache.lucene.index.DocumentsWriter.updateDocument(DocumentsWriter.java:2442) > > at > org.apache.lucene.index.DocumentsWriter.addDocument(DocumentsWriter.java:2424) > > at > org.apache.lucene.index.IndexWriter.addDocument(IndexWriter.java:1464) > > at > org.apache.lucene.index.IndexWriter.addDocument(IndexWriter.java:1442) > > at MainClass.Test(MainClass.java:39) > > at MainClass.main(MainClass.java:10) > > > > To show the same bug in Java I prepared a sample application (oh, that was > hard since this is my second app. in java(first one was a "Hello World" > app.)) > > > > Is something wrong with my application or is it a bug in Lucene? > > > > Thanks, > > DIGY > > > > > > > > *SampleCode:* > > * public class **MainClass*** > > * {* > > * * > > * DummyTokenStream **DummyTokenStream1** = new DummyTokenStream();* > > * DummyTokenStream **DummyTokenStream2** = new DummyTokenStream();* > > * * > > * //use the same document&field instances for Indexing* > > * org.apache.lucene.document.Document **Doc** = new > org.apache.lucene.document.Document();* > > * * > > * org.apache.lucene.document.Field **Field1** = new > org.apache.lucene.document.Field("Field1", "", > org.apache.lucene.document.Field.Store.YES, > org.apache.lucene.document.Field.Index.TOKENIZED);* > > * org.apache.lucene.document.Field **Field2** = new > org.apache.lucene.document.Field("Field2", "", > org.apache.lucene.document.Field.Store.YES, > org.apache.lucene.document.Field.Index.TOKENIZED);* > > * * > > * public **MainClass**()* > > * {* > > * Doc.add(Field1);* > > * Doc.add(Field2);* > > * }* > > * * > > * * > > * public void Index() throws * > > * org.apache.lucene.index.CorruptIndexException, > * > > * > org.apache.lucene.store.LockObtainFailedException,* > > * java.io.IOException* > > * {* > > * System.out.println("Index Started"); * > > * org.apache.lucene.index.IndexWriter wr = new > org.apache.lucene.index.IndexWriter("testindex", new > org.apache.lucene.analysis.WhitespaceAnalyzer(),true);* > > * * > > * for (int i = 0; i < 100; i++)* > > * {* > > * PrepDoc();* > > * wr.addDocument(Doc);* > > * }* > > * wr.close();* > > * System.out.println("Index Completed"); * > > * }* > > * * > > * **void PrepDoc()* > > * {* > > * DummyTokenStream1.SetText("test1"); //Set a new Text to Token > Stream* > > * Field1.setValue(DummyTokenStream1); //Set TokenStream to > Field Value* > > * * > > * * > > * DummyTokenStream2.SetText("test2"); //Set a new Text to Token > Stream* > > * Field2.setValue(DummyTokenStream2); //Set TokenStream to > Field Value* > > * }* > > * * > > * public static void main(String[] args) throws* > > * org.apache.lucene.index.CorruptIndexException,* > > * org.apache.lucene.store.LockObtainFailedException,* > > * java.io.IOException* > > * {* > > * MainClass m = new MainClass();* > > * m.Index();* > > * }* > > * * > > * * > > * * > > * * > > * public class **DummyTokenStream **extends > org.apache.lucene.analysis.TokenStream* > > * {* > > * String Text = "";* > > * boolean EndOfStream = false;* > > * org.apache.lucene.analysis.Token Token = new > org.apache.lucene.analysis.Token();* > > * * > > * //return "Text" as the first token and null as the second* > > * public org.apache.lucene.analysis.Token next()* > > * {* > > * if (EndOfStream == false)* > > * {* > > * EndOfStream = true;* > > * * > > * Token.setTermText(Text);* > > * Token.setStartOffset(0);* > > * Token.setEndOffset(Text.length() - 1);* > > * Token.setTermLength(Text.length());* > > * return Token;* > > * }* > > * return null;* > > * }* > > * * > > * public void SetText(String Text)* > > * {* > > * EndOfStream = false;* > > * this.Text = Text;* > > * }* > > * }* > > * * > > * }* > > > > >