# JRE Version Migration Guide

If possible, use the same JRE major version at both index and search time.
When upgrading to a different JRE major version, consider re-indexing. 

Different JRE major versions may implement different versions of Unicode,
which will change the way some parts of Lucene treat your text.

For example: with Java 1.4, `LetterTokenizer` will split around the character U+02C6,
but with Java 5 it will not.
This is because Java 1.4 implements Unicode 3, but Java 5 implements Unicode 4.

For reference, JRE major versions with their corresponding Unicode versions:

 * Java 1.4, Unicode 3.0
 * Java 5, Unicode 4.0
 * Java 6, Unicode 4.0
 * Java 7, Unicode 6.0
 * Java 8, Unicode 6.2
 * Java 9 (not yet released / offcially supported by Lucene), Unicode 8.0

In general, whether or not you need to re-index largely depends upon the data that
you are searching, and what was changed in any given Unicode version. For example, 
if you are completely sure that your content is limited to the "Basic Latin" range 
of Unicode, you can safely ignore this. 

## Special Notes: LUCENE 2.9 TO 3.0, JAVA 1.4 TO JAVA 5 TRANSITION

* `StandardAnalyzer` will return the same results under Java 5 as it did under 
Java 1.4. This is because it is largely independent of the runtime JRE for
Unicode support, (with the exception of lowercasing).  However, no changes to 
casing have occurred in Unicode 4.0 that affect StandardAnalyzer, so if you are 
using this Analyzer you are NOT affected.

* `SimpleAnalyzer`, `StopAnalyzer`, `LetterTokenizer`, `LowerCaseFilter`, and 
`LowerCaseTokenizer` may return different results, along with many other `Analyzer`s
and `TokenStream`s in Lucene's analysis modules. If you are using one of these 
components, you may be affected.

