> 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?) 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. > > 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 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 > classhttp://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. > > 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.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();}> > > -----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]> Don't get caught with egg on your face. Play Chicktionary! _________________________________________________________________ Don't get caught with egg on your face. Play Chicktionary! http://club.live.com/chicktionary.aspx?icid=chick_wlmailtextlink