Hey, Anshum u mean Indexwriter based on RAMdirectory must be a singleton/static, yeah, that works, finally success[?][?][?][?][?], thanks a lot!
Regards Hilly 2010/8/17 Anshum <ansh...@gmail.com> > Hi Hilly, > Seems like you are trying to use an already closed writer. Could you keep > the writer open and continue writing to the same indexdirectory using a > 'shared' indexwriter 'instance'. To put it as pseudo code > Something like a singleton/static indexwriter instance.. almost. > -- > Open indexwriter and keep open. > > accept data from thread1 and write to index using indexwriter [DO NOT CLOSE > THE INDEXWRITER HERE] > accept data from thread2 and write to index using indexwriter [DO NOT CLOSE > THE INDEXWRITER HERE] > . > . > > Close IndexWriter > -- > > Would this work/be implementable for your application? > > -- > Anshum Gupta > http://ai-cafe.blogspot.com > > > 2010/8/17 xiaoyan Zheng <hillyzh...@gmail.com> > > > the question is like this: > > > > when one user is using IndexWirter.addDocument(doc), and another user has > > already finished adding part and have closed IndexWirter, then, the first > > user embraces the error "ERROR: this IndexWriter is closed", cause both > of > > them creat the IndexWriter based on RAM by the same sever. > > > > I followed the error to the lucene source, there is ensureOpen(); in > > IndexWirter.addDocument( ), and the error is there, > > > > protected synchronized final void ensureOpen(boolean includePendingClose) > > throws AlreadyClosedException { > > if (!isOpen(includePendingClose)) { > > throw new AlreadyClosedException("this IndexWriter is closed"); > > } > > } > > how to avoid these kind of error? could lucene check this kind of > sitation > > by itself? > > > > > > 2010/8/17 xiaoyan Zheng <hillyzh...@gmail.com> > > > > > > > > about RAMDirectory based B/S plantform problem > > > > > > hello, I just start to use lucene and become confused about > RAMDirectory > > > based lucene index establishment, the problem is one user use this RAM > to > > > establish index is ok, but, when it comes to multi user, the results is > > not > > > correct. when i use synchronized{ writer.writeIndex (...)}, all go > > alright. > > > but users have to wait. i mean, is that RAM can only be used in single > > > thread, esp. writing the index? how to solve it in a B/S plantform? > > > > > > ============================ > > > the detailed test code is like these, very simple, just use jsp: > > > > > > > > > RAMDirectory idx=new RAMDirectory(); > > > > > > LuceneIndexWriterImpl writer=null; > > > writer=LuceneIndexWriterImpl.getInstance(); > > > > > > //RAM-based lucene index establishment > > > > > > synchronized(wirter){ > > > //if no synchronized the result is not correct > > > writer.writeIndex(idx); > > > > > > } > > > > > > LuceneIndexReaderImpl luceneReader=new LuceneIndexReaderImpl(idx); > > > .... > > > .... > > > > > > out.println("****"); > > > for(Integer id :documents.keySet()) > > > out.println(id); > > > out.println("****"); > > > > > > =========================== > > > result: > > > if only one user: out put is correct 7,3 > > > > > > but two users(if no synchronized): out put may be 0,0 and 4, 0 or other > > > unexpected result. > > > > > > > > > Regards > > > Hilly > > > > > >