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_migration_HMWL_mini_pcmag_0707

Reply via email to