5151import org .elasticsearch .index .Index ;
5252import org .elasticsearch .index .IndexSettings ;
5353import org .elasticsearch .index .IndexVersion ;
54+ import org .elasticsearch .index .IndexVersions ;
5455import org .elasticsearch .index .cache .bitset .BitsetFilterCache ;
5556import org .elasticsearch .index .fielddata .FieldDataContext ;
5657import org .elasticsearch .index .fielddata .IndexFieldData ;
@@ -106,6 +107,7 @@ static SearchExecutionContext createMockSearchExecutionContext(boolean allowExpe
106107
107108 static final int MAX_FIELD_LENGTH = 30 ;
108109 static WildcardFieldMapper wildcardFieldType ;
110+ static WildcardFieldMapper wildcardFieldType79 ;
109111 static KeywordFieldMapper keywordFieldType ;
110112 private DirectoryReader rewriteReader ;
111113 private BaseDirectoryWrapper rewriteDir ;
@@ -127,6 +129,9 @@ public void setUp() throws Exception {
127129 builder .ignoreAbove (MAX_FIELD_LENGTH );
128130 wildcardFieldType = builder .build (MapperBuilderContext .root (false , false ));
129131
132+ Builder builder79 = new WildcardFieldMapper .Builder (WILDCARD_FIELD_NAME , IndexVersions .V_7_9_0 );
133+ wildcardFieldType79 = builder79 .build (MapperBuilderContext .root (false , false ));
134+
130135 org .elasticsearch .index .mapper .KeywordFieldMapper .Builder kwBuilder = new KeywordFieldMapper .Builder (
131136 KEYWORD_FIELD_NAME ,
132137 IndexVersion .current ()
@@ -207,6 +212,37 @@ public void testIgnoreAbove() throws IOException {
207212 assertTrue (fields .stream ().anyMatch (field -> "field" .equals (field .stringValue ())));
208213 }
209214
215+ public void testBWCIndexVersion () throws IOException {
216+ // Create old format index using wildcard ngram analyzer used in 7.9 launch
217+ Directory dir = newDirectory ();
218+ IndexWriterConfig iwc = newIndexWriterConfig (WildcardFieldMapper .WILDCARD_ANALYZER_7_9 );
219+ iwc .setMergePolicy (newTieredMergePolicy (random ()));
220+ RandomIndexWriter iw = new RandomIndexWriter (random (), dir , iwc );
221+
222+ Document doc = new Document ();
223+ LuceneDocument parseDoc = new LuceneDocument ();
224+ addFields (parseDoc , doc , "a b" );
225+ indexDoc (parseDoc , doc , iw );
226+
227+ iw .forceMerge (1 );
228+ DirectoryReader reader = iw .getReader ();
229+ IndexSearcher searcher = newSearcher (reader );
230+ iw .close ();
231+
232+ // Unnatural circumstance - testing we fail if we were to use the new analyzer on old index
233+ Query oldWildcardFieldQuery = wildcardFieldType .fieldType ().wildcardQuery ("a b" , null , null );
234+ TopDocs oldWildcardFieldTopDocs = searcher .search (oldWildcardFieldQuery , 10 , Sort .INDEXORDER );
235+ assertThat (oldWildcardFieldTopDocs .totalHits .value (), equalTo (0L ));
236+
237+ // Natural circumstance test we revert to the old analyzer for old indices
238+ Query wildcardFieldQuery = wildcardFieldType79 .fieldType ().wildcardQuery ("a b" , null , null );
239+ TopDocs wildcardFieldTopDocs = searcher .search (wildcardFieldQuery , 10 , Sort .INDEXORDER );
240+ assertThat (wildcardFieldTopDocs .totalHits .value (), equalTo (1L ));
241+
242+ reader .close ();
243+ dir .close ();
244+ }
245+
210246 // Test long query strings don't cause exceptions
211247 public void testTooBigQueryField () throws IOException {
212248 Directory dir = newDirectory ();
0 commit comments