88
99package org .elasticsearch .index .mapper ;
1010
11- import org .apache .lucene .analysis .Analyzer ;
1211import org .apache .lucene .analysis .TokenStream ;
13- import org .apache .lucene .analysis .standard .StandardAnalyzer ;
14- import org .elasticsearch .Version ;
15- import org .elasticsearch .cluster .metadata .IndexMetadata ;
1612import org .elasticsearch .common .settings .Settings ;
13+ import org .elasticsearch .index .IndexSettings ;
1714import org .elasticsearch .index .analysis .AbstractTokenFilterFactory ;
1815import org .elasticsearch .index .analysis .AnalysisMode ;
1916import org .elasticsearch .index .analysis .AnalyzerScope ;
2219import org .elasticsearch .index .analysis .IndexAnalyzers ;
2320import org .elasticsearch .index .analysis .NamedAnalyzer ;
2421import org .elasticsearch .index .analysis .TokenFilterFactory ;
25- import org .elasticsearch .test .ESTestCase ;
2622
27- import java .util . HashMap ;
23+ import java .io . IOException ;
2824import java .util .Map ;
2925
30- import static org .elasticsearch .index .analysis .AnalysisRegistry .DEFAULT_ANALYZER_NAME ;
3126import static org .hamcrest .Matchers .containsString ;
32- import static org .mockito .Mockito .mock ;
33- import static org .mockito .Mockito .when ;
34-
35- public class TextFieldAnalyzerModeTests extends ESTestCase {
36-
37- private static Map <String , NamedAnalyzer > defaultAnalyzers () {
38- Map <String , NamedAnalyzer > analyzers = new HashMap <>();
39- analyzers .put (DEFAULT_ANALYZER_NAME , new NamedAnalyzer ("default" , AnalyzerScope .INDEX , null ));
40- return analyzers ;
27+ import static org .hamcrest .Matchers .equalTo ;
28+
29+ public class TextFieldAnalyzerModeTests extends MapperServiceTestCase {
30+
31+ @ Override
32+ protected IndexAnalyzers createIndexAnalyzers (IndexSettings indexSettings ) {
33+ return IndexAnalyzers .of (
34+ Map .of (
35+ "all" ,
36+ createAnalyzerWithMode ("all" , AnalysisMode .ALL ),
37+ "index" ,
38+ createAnalyzerWithMode ("index" , AnalysisMode .INDEX_TIME ),
39+ "search" ,
40+ createAnalyzerWithMode ("search" , AnalysisMode .SEARCH_TIME )
41+ )
42+ );
4143 }
4244
43- private static final IndexMetadata EMPTY_INDEX_METADATA = IndexMetadata .builder ("" )
44- .settings (Settings .builder ().put (IndexMetadata .SETTING_VERSION_CREATED , Version .CURRENT ))
45- .numberOfShards (1 )
46- .numberOfReplicas (0 )
47- .build ();
48-
49- private Analyzer createAnalyzerWithMode (AnalysisMode mode ) {
45+ private static NamedAnalyzer createAnalyzerWithMode (String name , AnalysisMode mode ) {
5046 TokenFilterFactory tokenFilter = new AbstractTokenFilterFactory ("my_analyzer" , Settings .EMPTY ) {
5147 @ Override
5248 public AnalysisMode getAnalysisMode () {
@@ -58,118 +54,39 @@ public TokenStream create(TokenStream tokenStream) {
5854 return null ;
5955 }
6056 };
61- return new CustomAnalyzer (null , new CharFilterFactory [0 ], new TokenFilterFactory [] { tokenFilter });
62- }
63-
64- public void testParseTextFieldCheckAnalyzerAnalysisMode () {
65-
66- Map <String , Object > fieldNode = new HashMap <>();
67- fieldNode .put ("analyzer" , "my_analyzer" );
68- MappingParserContext parserContext = mock (MappingParserContext .class );
69- when (parserContext .indexVersionCreated ()).thenReturn (Version .CURRENT );
70-
71- // check AnalysisMode.ALL works
72- Map <String , NamedAnalyzer > analyzers = defaultAnalyzers ();
73- analyzers .put ("my_analyzer" , new NamedAnalyzer ("my_named_analyzer" , AnalyzerScope .INDEX , createAnalyzerWithMode (AnalysisMode .ALL )));
74-
75- IndexAnalyzers indexAnalyzers = IndexAnalyzers .of (analyzers );
76- when (parserContext .getIndexAnalyzers ()).thenReturn (indexAnalyzers );
77-
78- TextFieldMapper .PARSER .parse ("field" , fieldNode , parserContext );
79-
80- // check that "analyzer" set to something that only supports AnalysisMode.SEARCH_TIME or AnalysisMode.INDEX_TIME is blocked
81- AnalysisMode mode = randomFrom (AnalysisMode .SEARCH_TIME , AnalysisMode .INDEX_TIME );
82- analyzers = defaultAnalyzers ();
83- analyzers .put ("my_analyzer" , new NamedAnalyzer ("my_named_analyzer" , AnalyzerScope .INDEX , createAnalyzerWithMode (mode )));
84- indexAnalyzers = IndexAnalyzers .of (analyzers );
85- when (parserContext .getIndexAnalyzers ()).thenReturn (indexAnalyzers );
86- fieldNode .put ("analyzer" , "my_analyzer" );
87- MapperException ex = expectThrows (MapperException .class , () -> { TextFieldMapper .PARSER .parse ("name" , fieldNode , parserContext ); });
88- assertThat (
89- ex .getMessage (),
90- containsString ("analyzer [my_named_analyzer] contains filters [my_analyzer] that are not allowed to run" )
57+ return new NamedAnalyzer (
58+ name ,
59+ AnalyzerScope .INDEX ,
60+ new CustomAnalyzer (null , new CharFilterFactory [0 ], new TokenFilterFactory [] { tokenFilter })
9161 );
9262 }
9363
94- public void testParseTextFieldCheckSearchAnalyzerAnalysisMode () {
95-
96- for (String settingToTest : new String [] { "search_analyzer" , "search_quote_analyzer" }) {
97- Map <String , Object > fieldNode = new HashMap <>();
98- fieldNode .put (settingToTest , "my_analyzer" );
99- fieldNode .put ("analyzer" , "standard" );
100- if (settingToTest .equals ("search_quote_analyzer" )) {
101- fieldNode .put ("search_analyzer" , "standard" );
102- }
103- MappingParserContext parserContext = mock (MappingParserContext .class );
104- when (parserContext .indexVersionCreated ()).thenReturn (Version .CURRENT );
105-
106- // check AnalysisMode.ALL and AnalysisMode.SEARCH_TIME works
107- Map <String , NamedAnalyzer > analyzers = defaultAnalyzers ();
108- AnalysisMode mode = randomFrom (AnalysisMode .ALL , AnalysisMode .SEARCH_TIME );
109- analyzers .put ("my_analyzer" , new NamedAnalyzer ("my_named_analyzer" , AnalyzerScope .INDEX , createAnalyzerWithMode (mode )));
110- analyzers .put ("standard" , new NamedAnalyzer ("standard" , AnalyzerScope .INDEX , new StandardAnalyzer ()));
111-
112- IndexAnalyzers indexAnalyzers = IndexAnalyzers .of (analyzers );
113- when (parserContext .getIndexAnalyzers ()).thenReturn (indexAnalyzers );
114- TextFieldMapper .PARSER .parse ("textField" , fieldNode , parserContext );
64+ public void testParseTextFieldCheckAnalyzerAnalysisMode () throws IOException {
11565
116- // check that "analyzer" set to AnalysisMode.INDEX_TIME is blocked
117- mode = AnalysisMode .INDEX_TIME ;
118- analyzers = defaultAnalyzers ();
119- analyzers .put ("my_analyzer" , new NamedAnalyzer ("my_named_analyzer" , AnalyzerScope .INDEX , createAnalyzerWithMode (mode )));
120- analyzers .put ("standard" , new NamedAnalyzer ("standard" , AnalyzerScope .INDEX , new StandardAnalyzer ()));
121- indexAnalyzers = IndexAnalyzers .of (analyzers );
122- when (parserContext .getIndexAnalyzers ()).thenReturn (indexAnalyzers );
123- fieldNode .clear ();
124- fieldNode .put (settingToTest , "my_analyzer" );
125- fieldNode .put ("analyzer" , "standard" );
126- if (settingToTest .equals ("search_quote_analyzer" )) {
127- fieldNode .put ("search_analyzer" , "standard" );
128- }
129- MapperException ex = expectThrows (
130- MapperException .class ,
131- () -> { TextFieldMapper .PARSER .parse ("field" , fieldNode , parserContext ); }
132- );
133- assertEquals (
134- "analyzer [my_named_analyzer] contains filters [my_analyzer] that are not allowed to run in search time mode." ,
135- ex .getMessage ()
136- );
137- }
138- }
139-
140- public void testParseTextFieldCheckAnalyzerWithSearchAnalyzerAnalysisMode () {
66+ MapperService mapperService = createMapperService ("""
67+ { "_doc" : { "properties" : {
68+ "text1" : { "type" : "text", "analyzer" : "all" },
69+ "text2" : { "type" : "text", "analyzer" : "index", "search_analyzer" : "search" }
70+ }}}
71+ """ );
14172
142- Map <String , Object > fieldNode = new HashMap <>();
143- fieldNode .put ("analyzer" , "my_analyzer" );
144- MappingParserContext parserContext = mock (MappingParserContext .class );
145- when (parserContext .indexVersionCreated ()).thenReturn (Version .CURRENT );
73+ assertThat (mapperService .mappingLookup ().indexAnalyzer ("text1" , field -> null ).name (), equalTo ("all" ));
74+ assertThat (mapperService .mappingLookup ().indexAnalyzer ("text2" , field -> null ).name (), equalTo ("index" ));
14675
147- // check that "analyzer" set to AnalysisMode.INDEX_TIME is blocked if there is no search analyzer
148- AnalysisMode mode = AnalysisMode .INDEX_TIME ;
149- Map <String , NamedAnalyzer > analyzers = defaultAnalyzers ();
150- analyzers .put ("my_analyzer" , new NamedAnalyzer ("my_named_analyzer" , AnalyzerScope .INDEX , createAnalyzerWithMode (mode )));
151- IndexAnalyzers indexAnalyzers = IndexAnalyzers .of (analyzers );
152- when (parserContext .getIndexAnalyzers ()).thenReturn (indexAnalyzers );
153- MapperException ex = expectThrows (
154- MapperException .class ,
155- () -> { TextFieldMapper .PARSER .parse ("field" , fieldNode , parserContext ); }
156- );
157- assertThat (
158- ex .getMessage (),
159- containsString ("analyzer [my_named_analyzer] contains filters [my_analyzer] that are not allowed to run" )
160- );
76+ Exception e = expectThrows (MapperException .class , () -> createMapperService ("""
77+ { "_doc" : { "properties" : { "text" : { "type" : "text", "analyzer" : "search" } } } }
78+ """ ));
79+ assertThat (e .getMessage (), containsString ("analyzer [search] contains filters [my_analyzer] that are not allowed to run" ));
16180
162- // check AnalysisMode.INDEX_TIME is okay if search analyzer is also set
163- fieldNode .put ("analyzer" , "my_analyzer" );
164- fieldNode .put ("search_analyzer" , "standard" );
165- analyzers = defaultAnalyzers ();
166- mode = randomFrom (AnalysisMode .ALL , AnalysisMode .INDEX_TIME );
167- analyzers .put ("my_analyzer" , new NamedAnalyzer ("my_named_analyzer" , AnalyzerScope .INDEX , createAnalyzerWithMode (mode )));
168- analyzers .put ("standard" , new NamedAnalyzer ("standard" , AnalyzerScope .INDEX , new StandardAnalyzer ()));
81+ Exception e2 = expectThrows (MapperException .class , () -> createMapperService ("""
82+ { "_doc" : { "properties" : { "text" : { "type" : "text", "analyzer" : "index" } } } }
83+ """ ));
84+ assertThat (e2 .getMessage (), containsString ("analyzer [index] contains filters [my_analyzer] that are not allowed to run" ));
16985
170- indexAnalyzers = IndexAnalyzers .of (analyzers );
171- when (parserContext .getIndexAnalyzers ()).thenReturn (indexAnalyzers );
172- TextFieldMapper .PARSER .parse ("field" , fieldNode , parserContext );
86+ Exception e3 = expectThrows (MapperException .class , () -> createMapperService ("""
87+ { "_doc" : { "properties" : { "text" : { "type" : "text", "analyzer" : "index", "search_quote_analyzer" : "search" } } } }
88+ """ ));
89+ assertThat (e .getMessage (), containsString ("analyzer [search] contains filters [my_analyzer] that are not allowed to run" ));
17390 }
17491
17592}
0 commit comments