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(); |