Every solrconfig.xml element that will not load, or behaves differently, on a current Solr version, with what replaces it.
Old element / attribute → New (Solr 9)
Old
<luceneMatchVersion>5.1.0</luceneMatchVersion>
New
<luceneMatchVersion>9.4.0</luceneMatchVersion>
Notes
Match the Solr build the new index runs on. Wrong version is a startup error.
Notes
Inside <requestHandler name="/replication">.
Old
enableRemoteStreaming="true"
Notes
Still works in 9.x but stream.url / stream.body / stream.file are deprecated. Drop now if unused.
Notes
On <requestDispatcher>. Means custom qt dispatch by handler name; now you call /HANDLER directly.
Old
<lib dir="..." regex="..."/>
Notes
On Opensolr you do not maintain libs yourself anyway.
Old
solrcore.properties with solr.replication.master
New
solr.replication.leader (or omit entirely)
Notes
Solr 9 core autodiscovery just works without the file. Drop it unless you have other properties in there.
Old
solr.search.FastLRUCache / solr.search.LRUCache / solr.search.LFUCache
Notes
Affects filterCache, queryResultCache, documentCache, fieldValueCache. FastLRUCache, LRUCache and LFUCache are deprecated and removed as default cache classes in Solr 9 — rewrite the class="solr.FastLRUCache" attribute to class="solr.CaffeineCache" on every <cache> / <filterCache> / etc. block. Caffeine uses different tuning attributes: keep size and initialSize, drop acceptableSize and cleanupThread (both ignored). Add async="true" for async warming.
Old
<queryResponseWriter name="xslt" class="solr.XSLTResponseWriter">
and wt=xslt requests with tr=*.xsl
Notes
XSLTResponseWriter is gone in Solr 9 (was deprecated in 8.x). If your application called /select?wt=xslt&tr=mystyle.xsl to get HTML / RSS / custom XML out of Solr directly, those requests will return errors after migration. Replacement: switch to wt=json (or wt=xml) and do the XSL transform in your application layer (PHP XSLTProcessor, Java javax.xml.transform, etc.). Also remove every <queryResponseWriter name="xslt"> block from solrconfig.xml and any .xsl files referenced from it.
Old
<highlighting class="solr.HighlightComponent">
New
hl.method=unified param
Notes
Original Highlighter still available. Unified is the default. With hl.method=unified + hl.defaultSummary=true, an hl.q={!edismax ...}query wrapper silently returns raw field text — use plain text in hl.q.
Old
<dataDir>${solr.data.dir:}</dataDir>
Notes
Variable substitution still works.
Worked example of the replication handler conversion:
<!-- BEFORE: legacy solrconfig.xml -->
<luceneMatchVersion>5.1.0</luceneMatchVersion>
<requestParsers enableRemoteStreaming="true"
multipartUploadLimitInKB="2048000"/>
<requestDispatcher handleSelect="true"> ... </requestDispatcher>
<requestHandler name="/replication" class="solr.ReplicationHandler">
<lst name="master">
<str name="replicateAfter">commit</str>
<str name="confFiles">schema.xml,stopwords.txt</str>
</lst>
<lst name="slave">
<str name="masterUrl">http://leader-host.example.com:8983/solr/CORE_NAME</str>
<str name="pollInterval">00:00:60</str>
</lst>
</requestHandler>
<!-- AFTER: Solr 9.x solrconfig.xml -->
<luceneMatchVersion>9.4.0</luceneMatchVersion>
<requestParsers multipartUploadLimitInKB="2048000"/> <!-- enableRemoteStreaming removed -->
<requestDispatcher> ... </requestDispatcher> <!-- handleSelect removed -->
<requestHandler name="/replication" class="solr.ReplicationHandler">
<lst name="leader">
<str name="replicateAfter">commit</str>
<str name="confFiles">schema.xml,stopwords.txt</str>
</lst>
<lst name="follower">
<str name="leaderUrl">http://leader-host.example.com:8983/solr/CORE_NAME</str>
<str name="pollInterval">00:00:60</str>
</lst>
</requestHandler>
Solr migration
solrconfig.xml conversion table (this page)