Index: solr/src/java/org/apache/solr/core/SolrConfig.java =================================================================== --- solr/src/java/org/apache/solr/core/SolrConfig.java (revision 1102361) +++ solr/src/java/org/apache/solr/core/SolrConfig.java (working copy) @@ -131,12 +131,12 @@ throws ParserConfigurationException, IOException, SAXException { super(loader, name, is, "/config/"); initLibs(); + luceneMatchVersion = getLuceneVersion("luceneMatchVersion", Version.LUCENE_24); defaultIndexConfig = new SolrIndexConfig(this, null, null); mainIndexConfig = new SolrIndexConfig(this, "mainIndex", defaultIndexConfig); reopenReaders = getBool("mainIndex/reopenReaders", true); booleanQueryMaxClauseCount = getInt("query/maxBooleanClauses", BooleanQuery.getMaxClauseCount()); - luceneMatchVersion = getLuceneVersion("luceneMatchVersion", Version.LUCENE_24); log.info("Using Lucene MatchVersion: " + luceneMatchVersion); filtOptEnabled = getBool("query/boolTofilterOptimizer/@enabled", false); Index: lucene/contrib/ant/src/java/org/apache/lucene/ant/IndexTask.java =================================================================== --- lucene/contrib/ant/src/java/org/apache/lucene/ant/IndexTask.java (revision 1102361) +++ lucene/contrib/ant/src/java/org/apache/lucene/ant/IndexTask.java (working copy) @@ -39,7 +39,7 @@ import org.apache.lucene.document.Field; import org.apache.lucene.index.IndexWriter; import org.apache.lucene.index.IndexWriterConfig; -import org.apache.lucene.index.LogMergePolicy; +import org.apache.lucene.index.TieredMergePolicy; import org.apache.lucene.index.Term; import org.apache.lucene.index.IndexWriterConfig.OpenMode; import org.apache.lucene.search.IndexSearcher; @@ -286,9 +286,9 @@ IndexWriterConfig conf = new IndexWriterConfig( Version.LUCENE_CURRENT, analyzer).setOpenMode( create ? OpenMode.CREATE : OpenMode.APPEND); - LogMergePolicy lmp = (LogMergePolicy) conf.getMergePolicy(); - lmp.setUseCompoundFile(useCompoundIndex); - lmp.setMergeFactor(mergeFactor); + TieredMergePolicy tmp = (TieredMergePolicy) conf.getMergePolicy(); + tmp.setUseCompoundFile(useCompoundIndex); + tmp.setMaxMergeAtOnce(mergeFactor); IndexWriter writer = new IndexWriter(dir, conf); int totalFiles = 0; int totalIndexed = 0; Index: lucene/contrib/wordnet/src/java/org/apache/lucene/wordnet/Syns2Index.java =================================================================== --- lucene/contrib/wordnet/src/java/org/apache/lucene/wordnet/Syns2Index.java (revision 1102361) +++ lucene/contrib/wordnet/src/java/org/apache/lucene/wordnet/Syns2Index.java (working copy) @@ -36,7 +36,7 @@ import org.apache.lucene.document.Field; import org.apache.lucene.index.IndexWriter; import org.apache.lucene.index.IndexWriterConfig; -import org.apache.lucene.index.LogMergePolicy; +import org.apache.lucene.index.TieredMergePolicy; import org.apache.lucene.index.IndexWriterConfig.OpenMode; import org.apache.lucene.store.FSDirectory; import org.apache.lucene.util.Version; @@ -250,7 +250,7 @@ // override the specific index if it already exists IndexWriter writer = new IndexWriter(dir, new IndexWriterConfig( Version.LUCENE_CURRENT, ana).setOpenMode(OpenMode.CREATE)); - ((LogMergePolicy) writer.getConfig().getMergePolicy()).setUseCompoundFile(true); // why? + ((TieredMergePolicy) writer.getConfig().getMergePolicy()).setUseCompoundFile(true); // why? Iterator i1 = word2Nums.keySet().iterator(); while (i1.hasNext()) // for each word { Index: lucene/contrib/misc/src/test/org/apache/lucene/index/TestIndexSplitter.java =================================================================== --- lucene/contrib/misc/src/test/org/apache/lucene/index/TestIndexSplitter.java (revision 1102361) +++ lucene/contrib/misc/src/test/org/apache/lucene/index/TestIndexSplitter.java (working copy) @@ -34,11 +34,12 @@ _TestUtil.rmDir(destDir); destDir.mkdirs(); Directory fsDir = newFSDirectory(dir); + LogMergePolicy mergePolicy = new LogByteSizeMergePolicy(); + mergePolicy.setNoCFSRatio(1); IndexWriterConfig conf = new IndexWriterConfig(TEST_VERSION_CURRENT, new MockAnalyzer(random)) - .setOpenMode(OpenMode.CREATE); - ((LogMergePolicy) conf.getMergePolicy()).setUseCompoundFile(true); - ((LogMergePolicy) conf.getMergePolicy()).setNoCFSRatio(1.0); + .setOpenMode(OpenMode.CREATE) + .setMergePolicy(mergePolicy); IndexWriter iw = new IndexWriter(fsDir, conf); Index: lucene/contrib/spellchecker/src/java/org/apache/lucene/search/spell/SpellChecker.java =================================================================== --- lucene/contrib/spellchecker/src/java/org/apache/lucene/search/spell/SpellChecker.java (revision 1102361) +++ lucene/contrib/spellchecker/src/java/org/apache/lucene/search/spell/SpellChecker.java (working copy) @@ -29,7 +29,7 @@ import org.apache.lucene.index.IndexReader; import org.apache.lucene.index.IndexWriter; import org.apache.lucene.index.IndexWriterConfig; -import org.apache.lucene.index.LogMergePolicy; +import org.apache.lucene.index.TieredMergePolicy; import org.apache.lucene.index.Term; import org.apache.lucene.index.IndexWriterConfig.OpenMode; import org.apache.lucene.search.BooleanClause; @@ -505,7 +505,7 @@ ensureOpen(); final Directory dir = this.spellIndex; final IndexWriter writer = new IndexWriter(dir, new IndexWriterConfig(Version.LUCENE_CURRENT, new WhitespaceAnalyzer(Version.LUCENE_CURRENT)).setRAMBufferSizeMB(ramMB)); - ((LogMergePolicy) writer.getConfig().getMergePolicy()).setMergeFactor(mergeFactor); + ((TieredMergePolicy) writer.getConfig().getMergePolicy()).setMaxMergeAtOnce(mergeFactor); IndexSearcher indexSearcher = obtainSearcher(); final List readers = new ArrayList(); Index: lucene/CHANGES.txt =================================================================== --- lucene/CHANGES.txt (revision 1102361) +++ lucene/CHANGES.txt (working copy) @@ -29,6 +29,13 @@ returns NumericField instances. (Uwe Schindler, Ryan McKinley, Mike McCandless) +* LUCENE-1076: Changed the default merge policy from + LogByteSizeMergePolicy to TieredMergePolicy, as of Version.LUCENE_32 + (passed to IndexWriterConfig), which is able to merge non-contiguous + segments. This means docIDs no longer necessarily stay "in order" + during indexing. If this is a problem then you can use either of + the LogMergePolicy impls. (Mike McCandless) + New features * LUCENE-3082: Added index upgrade tool oal.index.IndexUpgrader Index: lucene/src/test/org/apache/lucene/index/TestIndexWriterConfig.java =================================================================== --- lucene/src/test/org/apache/lucene/index/TestIndexWriterConfig.java (revision 1102361) +++ lucene/src/test/org/apache/lucene/index/TestIndexWriterConfig.java (working copy) @@ -80,7 +80,7 @@ assertNull(conf.getMergedSegmentWarmer()); assertEquals(IndexWriterConfig.DEFAULT_MAX_THREAD_STATES, conf.getMaxThreadStates()); assertEquals(IndexWriterConfig.DEFAULT_READER_TERMS_INDEX_DIVISOR, conf.getReaderTermsIndexDivisor()); - assertEquals(LogByteSizeMergePolicy.class, conf.getMergePolicy().getClass()); + assertEquals(TieredMergePolicy.class, conf.getMergePolicy().getClass()); // Sanity check - validate that all getters are covered. Set getters = new HashSet(); @@ -255,7 +255,7 @@ assertEquals(IndexWriterConfig.DEFAULT_MAX_THREAD_STATES, conf.getMaxThreadStates()); // Test MergePolicy - assertEquals(LogByteSizeMergePolicy.class, conf.getMergePolicy().getClass()); + assertEquals(TieredMergePolicy.class, conf.getMergePolicy().getClass()); conf.setMergePolicy(new LogDocMergePolicy()); assertEquals(LogDocMergePolicy.class, conf.getMergePolicy().getClass()); conf.setMergePolicy(null); Index: lucene/src/test/org/apache/lucene/index/TestAtomicUpdate.java =================================================================== --- lucene/src/test/org/apache/lucene/index/TestAtomicUpdate.java (revision 1102361) +++ lucene/src/test/org/apache/lucene/index/TestAtomicUpdate.java (working copy) @@ -129,7 +129,7 @@ IndexWriterConfig conf = new IndexWriterConfig( TEST_VERSION_CURRENT, new MockAnalyzer(random)) .setMaxBufferedDocs(7); - ((LogMergePolicy) conf.getMergePolicy()).setMergeFactor(3); + ((TieredMergePolicy) conf.getMergePolicy()).setMaxMergeAtOnce(3); IndexWriter writer = new MockIndexWriter(directory, conf); writer.setInfoStream(VERBOSE ? System.out : null); Index: lucene/src/java/org/apache/lucene/index/IndexWriterConfig.java =================================================================== --- lucene/src/java/org/apache/lucene/index/IndexWriterConfig.java (revision 1102361) +++ lucene/src/java/org/apache/lucene/index/IndexWriterConfig.java (working copy) @@ -132,10 +132,15 @@ /** * Creates a new config that with defaults that match the specified - * {@link Version} as well as the default {@link Analyzer}. {@link Version} is - * a placeholder for future changes. The default settings are relevant to 3.1 - * and before. In the future, if different settings will apply to different - * versions, they will be documented here. + * {@link Version} as well as the default {@link + * Analyzer}. If matchVersion is >= {@link + * Version#LUCENE_32}, {@link TieredMergePolicy} is used + * for merging; else {@link LogByteSizeMergePolicy}. + * Note that {@link TieredMergePolicy} is free to select + * non-contiguous merges, which means docIDs may not + * remain montonic over time. If this is a problem you + * should switch to {@link LogByteSizeMergePolicy} or + * {@link LogDocMergePolicy}. */ public IndexWriterConfig(Version matchVersion, Analyzer analyzer) { this.matchVersion = matchVersion; @@ -152,7 +157,11 @@ maxBufferedDocs = DEFAULT_MAX_BUFFERED_DOCS; indexingChain = DocumentsWriter.defaultIndexingChain; mergedSegmentWarmer = null; - mergePolicy = new LogByteSizeMergePolicy(); + if (matchVersion.onOrAfter(Version.LUCENE_32)) { + mergePolicy = new TieredMergePolicy(); + } else { + mergePolicy = new LogByteSizeMergePolicy(); + } maxThreadStates = DEFAULT_MAX_THREAD_STATES; readerPooling = DEFAULT_READER_POOLING; readerTermsIndexDivisor = DEFAULT_READER_TERMS_INDEX_DIVISOR;