This is the code in charge of managing the Lucene index. Thanks for your help!
package luz.aurora.lucene; import java.io.File; import java.io.IOException; import java.util.*; import luz.aurora.search.ExtendedQueryParser; import org.apache.lucene.analysis.Analyzer; import org.apache.lucene.analysis.standard.StandardAnalyzer; import org.apache.lucene.document.Document; import org.apache.lucene.index.*; import org.apache.lucene.queryParser.ParseException; import org.apache.lucene.search.IndexSearcher; import org.apache.lucene.search.Query; import org.apache.lucene.search.TopDocs; import org.apache.lucene.search.highlight.Highlighter; import org.apache.lucene.search.highlight.QueryScorer; import org.apache.lucene.search.highlight.SimpleHTMLFormatter; import org.apache.lucene.search.highlight.SimpleSpanFragmenter; import org.apache.lucene.store.Directory; import org.apache.lucene.store.FSDirectory; public class LuceneManager { private HashMap<Integer,String> IndexesPaths; private HashMap<Integer,IndexWriter> Writers; private int CurrentOpenIndex_ID; private String CurrentOpenIndex_TablePrefix; public LuceneManager(int CurrentOpenIndex_ID,String CurrentOpenIndex_TablePrefix, HashMap<Integer,String> IndexesPaths) throws Exception { this.CurrentOpenIndex_ID = CurrentOpenIndex_ID; this.IndexesPaths = IndexesPaths; this.Writers = new HashMap<Integer,IndexWriter>(); this.CurrentOpenIndex_TablePrefix = CurrentOpenIndex_TablePrefix; SetUpWriters(); } private void SetUpWriters() throws Exception { Set set = IndexesPaths.entrySet(); Iterator i = set.iterator(); while(i.hasNext()){ Map.Entry index = (Map.Entry)i.next(); int id = (Integer)index.getKey(); String path = (String)index.getValue(); File app = new File(path); Directory dir = FSDirectory.open(app); IndexWriterConfig config = new IndexWriterConfig(LuceneVersion.CurrentVersion,new StandardAnalyzer(LuceneVersion.CurrentVersion)); //config.setMaxBufferedDocs(50); config.setRAMBufferSizeMB(400); TieredMergePolicy mp = (TieredMergePolicy)config.getMergePolicy(); mp.setUseCompoundFile(true); config.setMergePolicy(mp); /* LogMergePolicy lmp = (LogMergePolicy)config.getMergePolicy(); lmp.setUseCompoundFile(true); lmp.setMaxMergeDocs(10000); config.setMergePolicy(lmp); */ Writers.put(id, new IndexWriter(dir,config)); } } public void AddDocument(int IndexId,Document doc,Analyzer analyzer) throws CorruptIndexException, IOException { IndexWriter im = Writers.get(IndexId); im.addDocument(doc, analyzer); } public void AddDocument(Document doc,Analyzer analyzer) throws CorruptIndexException, IOException { IndexWriter im = Writers.get(this.CurrentOpenIndex_ID); im.addDocument(doc, analyzer); } public void DeleteDoc(int IndexId,int SegmentIdFromDb) throws CorruptIndexException, IOException { IndexWriter im = Writers.get(IndexId); Term term = new Term("SegmentID",Integer.toString(SegmentIdFromDb)); im.deleteDocuments(term); } public void DeleteDocuments(String query) throws ParseException, CorruptIndexException, IOException { ExtendedQueryParser parser = new ExtendedQueryParser(LuceneVersion.CurrentVersion,"ID",new StandardAnalyzer(LuceneVersion.CurrentVersion)); Query q = parser.parse(query); Set set = Writers.entrySet(); Iterator i = set.iterator(); while(i.hasNext()){ Map.Entry app = (Map.Entry)i.next(); IndexWriter im = (IndexWriter)app.getValue(); im.deleteDocuments(q); } } private IndexSearcher getSearcher() throws CorruptIndexException, IOException { int NumberOfIndexes = Writers.size(); ArrayList<IndexReader> readers = new ArrayList<IndexReader>(); IndexReader[] readerList = new IndexReader[NumberOfIndexes]; Set set = Writers.entrySet(); Iterator i = set.iterator(); while(i.hasNext()){ Map.Entry index = (Map.Entry)i.next(); IndexWriter iw = (IndexWriter)index.getValue(); readers.add(IndexReader.open(iw, true)); } MultiReader mr = new MultiReader(readers.toArray(readerList)); return new IndexSearcher(mr); } public void close() throws CorruptIndexException, IOException { Set set = Writers.entrySet(); Iterator i = set.iterator(); while(i.hasNext()){ Map.Entry index = (Map.Entry)i.next(); IndexWriter iw = (IndexWriter)index.getValue(); iw.close(); } } public void commit() throws CorruptIndexException, IOException, Exception { Set set = Writers.entrySet(); Iterator i = set.iterator(); while(i.hasNext()){ Map.Entry index = (Map.Entry)i.next(); IndexWriter iw = (IndexWriter)index.getValue(); iw.commit(); } } public int getCurrentOpenIndexId() { return this.CurrentOpenIndex_ID; } public String getCurrentOpenIndexTablePrefix() { return this.CurrentOpenIndex_TablePrefix; } //SEARCH START public TopDocs Search(String q,Analyzer analyzer,int NumberOfResults) throws Exception { ExtendedQueryParser parser = new ExtendedQueryParser(LuceneVersion.CurrentVersion,"ID",analyzer); Query query = parser.parse(q); //Filter f = NumericRangeFilter.newIntRange("SegmentID", 393, 393, true, true); //FilteredQuery fq = new FilteredQuery(query,f); //TopDocs docs = searcher.search(fq, NumberOfResults); //System.out.println(searcher.getIndexReader().) return getSearcher().search(query, NumberOfResults); } public TopDocs SearchAndHighlight(String q,Analyzer analyzer,int NumberOfResults) throws Exception { ExtendedQueryParser parser = new ExtendedQueryParser(LuceneVersion.CurrentVersion,"ID",analyzer); Query query = parser.parse(q); return getSearcher().search(query, NumberOfResults); } public Highlighter getHighlighter(String query,Analyzer analyzer,String OpeningTag,String ClosingTag) throws ParseException { ExtendedQueryParser qp = new ExtendedQueryParser(LuceneVersion.CurrentVersion,"ID",analyzer); Query q = qp.parse(query); QueryScorer qs = new QueryScorer(q); SimpleHTMLFormatter formatter = new SimpleHTMLFormatter(OpeningTag,ClosingTag); Highlighter hl = new Highlighter(formatter,qs); hl.setTextFragmenter(new SimpleSpanFragmenter(qs)); return hl; } public Document getDoc(int i) throws CorruptIndexException, IOException { return getSearcher().doc(i); } } On Thu, May 17, 2012 at 10:37 PM, findbestopensource < findbestopensou...@gmail.com> wrote: > Post complete code. You are not closing the objects (IndexWriter / Index > Searcher) properly. > > Regards > Aditya > www.findbestopensource.com > > > On Fri, May 18, 2012 at 6:51 AM, Michel Blase <mblas...@gmail.com> wrote: > > > Hi all, > > > > I have few problems Indexing. I keep hitting "Too many open files". It > > seems like Lucene is not releasing files handlers after deleting > segments. > > > > This is a piece from the lsof output showing the problem: > > > > > > java 23024 root *347r REG 251,0 2660 149376 > > /home/INDEXES_ROOT/SMPL_1/_bvq.cfs (deleted) > > java 23024 root *348r REG 251,0 2477 149382 > > /home/INDEXES_ROOT/SMPL_1/_bvr.cfs (deleted) > > java 23024 root *349r REG 251,0 2747 149392 > > /home/INDEXES_ROOT/SMPL_1/_bvu.cfs (deleted) > > java 23024 root *350r REG 251,0 2339 149384 > > /home/INDEXES_ROOT/SMPL_1/_bvs.cfs (deleted) > > > > and this is the code I'm using (I'm using Lucene3.6) > > > > -- IndexWriter creation: > > > > File app = new File(path); > > Directory dir = FSDirectory.open(app); > > IndexWriterConfig config = new > > IndexWriterConfig(LuceneVersion.CurrentVersion,new > > StandardAnalyzer(LuceneVersion.CurrentVersion)); > > > > //these are random tries attempting to solve the problem: > > config.setRAMBufferSizeMB(400); > > TieredMergePolicy mp = (TieredMergePolicy)config.getMergePolicy(); > > mp.setUseCompoundFile(true); > > config.setMergePolicy(mp); > > IndexWriter im = new IndexWriter(dir,config); > > > > -- Then just a loop over my doc list calling for indexing: > > im.addDocument(doc, analyzer); > > > > > > Any idea? > > Thanks, > > Luca > > >