Index: src/java/org/apache/lucene/index/IndexWriter.java =================================================================== RCS file: /home/cvspublic/jakarta-lucene/src/java/org/apache/lucene/index/IndexWriter.java,v retrieving revision 1.44 diff -u -r1.44 IndexWriter.java --- src/java/org/apache/lucene/index/IndexWriter.java 12 Dec 2004 20:26:27 -0000 1.44 +++ src/java/org/apache/lucene/index/IndexWriter.java 18 Jan 2005 20:28:24 -0000 @@ -462,6 +462,28 @@ */ public PrintStream infoStream = null; + /** + * Merges all segments together into a single segment, optimizing an index for search + * and naming the final segment with the supplied segment name. + * + * @param segmentName + * The name to use for the final segment if there is one. + * @throws IOException + */ + public synchronized void optimize(String segmentName) throws IOException { + // it would be slightly more efficient to copy the optimize code here + // and conditionalize the merge when minSegment <= 0, but it seems more + // straightforward to not copy that code. + optimize(); + + // if there is a segment, rename it using the merge code so all the files + // representing the segment including the ones inside a compound index are + // properly renamed + if (segmentInfos.size() == 1) { + mergeSegments(0, segmentName); + } + } + /** Merges all segments together into a single segment, optimizing an index for search. */ public synchronized void optimize() throws IOException { @@ -598,11 +620,15 @@ } } + private final void mergeSegments(int minSegment) throws IOException { + final String mergedName = newSegmentName(); + mergeSegments(minSegment, mergedName); + } + /** Pops segments off of segmentInfos stack down to minSegment, merges them, and pushes the merged index onto the top of the segmentInfos stack. */ - private final void mergeSegments(int minSegment) + private final void mergeSegments(int minSegment, final String mergedName) throws IOException { - final String mergedName = newSegmentName(); if (infoStream != null) infoStream.print("merging segments"); SegmentMerger merger = new SegmentMerger(directory, mergedName); Index: src/test/org/apache/lucene/index/TestIndexWriter.java =================================================================== RCS file: /home/cvspublic/jakarta-lucene/src/test/org/apache/lucene/index/TestIndexWriter.java,v retrieving revision 1.4 diff -u -r1.4 TestIndexWriter.java --- src/test/org/apache/lucene/index/TestIndexWriter.java 10 Oct 2004 15:58:32 -0000 1.4 +++ src/test/org/apache/lucene/index/TestIndexWriter.java 18 Jan 2005 20:28:24 -0000 @@ -71,6 +71,34 @@ } } + public void testOptimizeWithSegmentName() + { + Directory dir = new RAMDirectory(); + + IndexWriter writer = null; + + try { + writer = new IndexWriter(dir, new WhitespaceAnalyzer(), true); + + // add 100 documents + for (int i = 0; i < 100; i++) { + addDoc(writer); + } + writer.optimize("mysegmentname"); + writer.close(); + + // verify the segment is named properly + SegmentInfos infos = new SegmentInfos(); + infos.read(dir); + assertTrue("Index does not contain a single segment.", (infos.size() == 1)); + SegmentInfo info = infos.info(0); + assertEquals("mysegmentname",info.name); + } + catch (IOException e) { + e.printStackTrace(); + } + } + private void addDoc(IndexWriter writer) { Document doc = new Document();