Yes, you are correct, I close indexWriter and then add more docs. What's wrong? it worked out fine, and add docs i add will appear to NEW INSTANCES OF INDEX SEARCHERS after calling close on the indexWriter. As for creating new IndexWriter, I tried to, however i suffered of the lock exception i got, although i was closing the IndexWriter instance, before creating a new IndexWriter instance! I don't know why! furthermore, this is useless, for multiThreaded app, cause you can't know who is still writing to your index, and who has colsed his IndexWriter. Even checking that the index is locked b4, leads to unnecessary overhead which can be avoided since it works for me and i can write with one single instance of IndexWriter.
Well, I think that i don't get the problems you expect cause i use the Lucene version that is shiped by compass distribution (www.compassframework.org) In short, compass to Lucene is the same of ORM server like hibernate for DBMS like oracle. It's really works fine but i couldn't understand why compass hides the deleteDocuments(Term) method on IndexWriter class http://lucene.zones.apache.org:8080/hudson/job/Lucene-Nightly/javadoc/org/apache/lucene/index/IndexWriter.html#deleteDocuments(org.apache.lucene.index.Term) . This is why i used delete on a reader rather than using it on the same writer instance, and the only one i have. I couldn't manage my index in one particular situation using compass, because i had to store data not in the usual way we do (every row in table is a record). So i think i have to ask The compass team about that. Anyways, if you have coments, you or the others please do. No, I don't create a new Instance of indexWriter, the only one I create is in the Service constructor, so i create a new clean (has no docs) index only when program starts up. public LuceneServiceSHImp(String indexDirectory) throws IOException{this.indexDirectory = indexDirectory;standardAnalyzer = new StandardAnalyzer();indexWriter = new IndexWriter(new java.io.File(indexDirectory), standardAnalyzer, true);indexWriter.close();} > Subject: RE: IndexReader deletes more that expected> Date: Wed, 1 Aug 2007 > 09:07:32 -0700> From: [EMAIL PROTECTED]> To: java-user@lucene.apache.org> > > If I'm reading this correctly, there's something a little wonky here. In> > your example code, you close the IndexWriter and then, without creating> a > new IndexWriter, you call addDocument again. This shouldn't be> possible > (what version of Lucene are you using?)> > Assuming for the time being that > you are creating the IndexWriter again,> the other issue here is that you > shouldn't be able to have a reader and> a writer changing an index at the > same time. There should be a lock> failure. This should occur either in the > Index > > Might you be creating your IndexWriters (which you don't show) with > the> create flag always set to true? That will wipe your index each time,> > ignoring the locks and cause all sorts of weird results.> > -----Original > Message-----> From: Ridwan Habbal [mailto:[EMAIL PROTECTED] > Sent: > Wednesday, August 01, 2007 8:48 AM> To: java-user@lucene.apache.org> Subject: > IndexReader deletes more that expected> > Hi, I got unexpected behavior while > testing lucene. To shortly address> the problem: Using IndexWriter I add docs > with fields named ID with a> consecutive order (1,2,3,4, etc) then close that > index. I get new> IndexReader, and call IndexReader.deleteDocuments(Term). > The term is> simply new Term("ID", "1"). and then class close on IndexReader. > Things> work out fine. But if i add docs using IndexWriter, close writer, > then> create new IndexReader to delete one of the docs already inserted, but> > without closing index. while the indexReader that perform deletion is> still > not closed, I add more docs, and then commit the IndexWriter, so> when i > search I get all added docs in the two phases (before using> > deleteDocuments() on IndexReader and after because i haven't closed> > IndexReader, howerer, closed IndexWriter). I close IndexReader and then> > query the index, so i deletes all docs after opening it till closing it,> in > addition to the specified doc in the Term object (in this test case:> ID=1). > I know that i can avoid this by close IndexReader directly after> deleting > docs, but what about runing it on mutiThread app like web> application? There > you are the code: > IndexSearcher indexSearcher = new > IndexSearcher(this.indexDirectory);> Hits hitsB4InsertAndClose = null;> > hitsB4InsertAndClose = getAllAsHits(indexSearcher);> int beforeInsertAndClose > = hitsB4InsertAndClose.length();> > > indexWriter.addDocument(getNewElement());> > indexWriter.addDocument(getNewElement());> > indexWriter.addDocument(getNewElement());> indexWriter.close();> > IndexSearcher indexSearcherDel = new IndexSearcher(this.indexDirectory);> > indexSearcherDel.getIndexReader().deleteDocuments(new Term("ID","1"));> > > indexWriter.addDocument(getNewElement());> > indexWriter.addDocument(getNewElement());> > indexWriter.addDocument(getNewElement());> > indexWriter.addDocument(getNewElement());> > indexWriter.addDocument(getNewElement());> > indexWriter.addDocument(getNewElement());> > indexWriter.addDocument(getNewElement());> > indexWriter.addDocument(getNewElement());> > indexWriter.addDocument(getNewElement());> > indexWriter.addDocument(getNewElement());> > indexWriter.addDocument(getNewElement());> > indexWriter.close();> Hits > hitsAfterInsertAndClose = getAllAsHits(indexSearcher);> int > AfterInsertAndClose = hitsAfterInsertAndClose.length();//This is 14> > > indexWriter.addDocument(getNewElement());> indexWriter.close();> Hits > hitsAfterInsertAndAfterCloseb4Delete = getAllAsHits(indexSearcher);> int > hitsAfterInsertButAndAfterCountb4Delete => > hitsAfterInsertAndAfterCloseb4Delete.length();//This is 15> > > > > indexSearcherDel.close();> Hits hitsAfterInsertAndAfterClose = > getAllAsHits(indexSearcher);int> hitsAfterInsertButAndAfterCount => > hitsAfterInsertAndAfterClose.length();//This is 2 The two methods I> Use > > private Hits getAllAsHits(IndexSearcher indexSearcher){> try{> Analyzer > analyzer = new StandardAnalyzer();> String defaultSearchField = "all";> > QueryParser parser = new QueryParser(defaultSearchField, analyzer);> > indexSearcher = new IndexSearcher(this.indexDirectory);> Hits hits = > indexSearcher.search(parser.parse("+alias:mydoc"));> indexSearcher.close();> > return hits;> }catch(IOException ex){> throw new RuntimeException(ex);> > }catch(org.apache.lucene.queryParser.ParseException ex){> throw new > RuntimeException(ex);> }> > }> > private Document getNewElement(){> > Map<String, String> map = new HashMap();> map.put("ID", new > Integer(insertCounter).toString());> map.put("name", "name"+insertCounter);> > insertCounter++;> Document document = new Document();> for (Iterator iter = > map.keySet().iterator(); iter.hasNext();) {> String key = (String) > iter.next();> document.add(new Field(key, map.get(key), Store.YES, > Index.TOKENIZED));> }> document.add(new Field("alias", "mydoc", Store.YES,> > Index.UN_TOKENIZED));> return document;} any clue why it works that way? I > expect it to delete> only one doc? > > _________________________________________________________________> PC > Magazine's 2007 editors' choice for best web mail-award-winning> Windows Live > Hotmail.> > http://imagine-windowslive.com/hotmail/?locale=en-us&ocid=TXT_TAGHM_migr> > ation_HMWL_mini_pcmag_0707> > > ---------------------------------------------------------------------> To > unsubscribe, e-mail: [EMAIL PROTECTED]> For additional commands, e-mail: > [EMAIL PROTECTED]> _________________________________________________________________ Local listings, incredible imagery, and driving directions - all in one place! Find it! http://maps.live.com/?wip=69&FORM=MGAC01