2626import org .elasticsearch .common .settings .Settings ;
2727import org .elasticsearch .core .internal .io .IOUtils ;
2828import org .elasticsearch .env .Environment ;
29- import org .elasticsearch .index .Index ;
3029import org .elasticsearch .index .IndexSettings ;
3130import org .elasticsearch .index .mapper .TextFieldMapper ;
3231import org .elasticsearch .indices .analysis .AnalysisModule ;
4039import java .util .Locale ;
4140import java .util .Map ;
4241import java .util .concurrent .ConcurrentHashMap ;
42+ import java .util .function .Function ;
4343import java .util .stream .Collectors ;
4444
4545import static java .util .Collections .unmodifiableMap ;
@@ -159,19 +159,18 @@ public void close() throws IOException {
159159 * Creates an index-level {@link IndexAnalyzers} from this registry using the given index settings
160160 */
161161 public IndexAnalyzers build (IndexSettings indexSettings ) throws IOException {
162-
163162 final Map <String , CharFilterFactory > charFilterFactories = buildCharFilterFactories (indexSettings );
164163 final Map <String , TokenizerFactory > tokenizerFactories = buildTokenizerFactories (indexSettings );
165164 final Map <String , TokenFilterFactory > tokenFilterFactories = buildTokenFilterFactories (indexSettings );
166- final Map <String , AnalyzerProvider <?>> analyzierFactories = buildAnalyzerFactories (indexSettings );
165+ final Map <String , AnalyzerProvider <?>> analyzerFactories = buildAnalyzerFactories (indexSettings );
167166 final Map <String , AnalyzerProvider <?>> normalizerFactories = buildNormalizerFactories (indexSettings );
168- return build (indexSettings , analyzierFactories , normalizerFactories , tokenizerFactories , charFilterFactories , tokenFilterFactories );
167+ return build (indexSettings , analyzerFactories , normalizerFactories , tokenizerFactories , charFilterFactories , tokenFilterFactories );
169168 }
170169
171170 public Map <String , TokenFilterFactory > buildTokenFilterFactories (IndexSettings indexSettings ) throws IOException {
172171 final Map <String , Settings > tokenFiltersSettings = indexSettings .getSettings ().getGroups (INDEX_ANALYSIS_FILTER );
173- return buildMapping (Component .FILTER , indexSettings , tokenFiltersSettings ,
174- Collections . unmodifiableMap ( this . tokenFilters ), prebuiltAnalysis .preConfiguredTokenFilters );
172+ return buildMapping (Component .FILTER , indexSettings , tokenFiltersSettings , this . tokenFilters ,
173+ prebuiltAnalysis .preConfiguredTokenFilters );
175174 }
176175
177176 public Map <String , TokenizerFactory > buildTokenizerFactories (IndexSettings indexSettings ) throws IOException {
@@ -205,13 +204,8 @@ public Map<String, AnalyzerProvider<?>> buildNormalizerFactories(IndexSettings i
205204 * @return {@link TokenizerFactory} provider or <code>null</code>
206205 */
207206 public AnalysisProvider <TokenizerFactory > getTokenizerProvider (String tokenizer , IndexSettings indexSettings ) {
208- final Map <String , Settings > tokenizerSettings = indexSettings .getSettings ().getGroups ("index.analysis.tokenizer" );
209- if (tokenizerSettings .containsKey (tokenizer )) {
210- Settings currentSettings = tokenizerSettings .get (tokenizer );
211- return getAnalysisProvider (Component .TOKENIZER , tokenizers , tokenizer , currentSettings .get ("type" ));
212- } else {
213- return getTokenizerProvider (tokenizer );
214- }
207+ return getProvider (Component .TOKENIZER , tokenizer , indexSettings , "index.analysis.tokenizer" , tokenizers ,
208+ this ::getTokenizerProvider );
215209 }
216210
217211 /**
@@ -223,14 +217,8 @@ public AnalysisProvider<TokenizerFactory> getTokenizerProvider(String tokenizer,
223217 * @return {@link TokenFilterFactory} provider or <code>null</code>
224218 */
225219 public AnalysisProvider <TokenFilterFactory > getTokenFilterProvider (String tokenFilter , IndexSettings indexSettings ) {
226- final Map <String , Settings > tokenFilterSettings = indexSettings .getSettings ().getGroups ("index.analysis.filter" );
227- if (tokenFilterSettings .containsKey (tokenFilter )) {
228- Settings currentSettings = tokenFilterSettings .get (tokenFilter );
229- String typeName = currentSettings .get ("type" );
230- return getAnalysisProvider (Component .FILTER , tokenFilters , tokenFilter , typeName );
231- } else {
232- return getTokenFilterProvider (tokenFilter );
233- }
220+ return getProvider (Component .FILTER , tokenFilter , indexSettings , "index.analysis.filter" , tokenFilters ,
221+ this ::getTokenFilterProvider );
234222 }
235223
236224 /**
@@ -242,12 +230,18 @@ public AnalysisProvider<TokenFilterFactory> getTokenFilterProvider(String tokenF
242230 * @return {@link CharFilterFactory} provider or <code>null</code>
243231 */
244232 public AnalysisProvider <CharFilterFactory > getCharFilterProvider (String charFilter , IndexSettings indexSettings ) {
245- final Map <String , Settings > tokenFilterSettings = indexSettings .getSettings ().getGroups ("index.analysis.char_filter" );
246- if (tokenFilterSettings .containsKey (charFilter )) {
247- Settings currentSettings = tokenFilterSettings .get (charFilter );
248- return getAnalysisProvider (Component .CHAR_FILTER , charFilters , charFilter , currentSettings .get ("type" ));
233+ return getProvider (Component .CHAR_FILTER , charFilter , indexSettings , "index.analysis.char_filter" , charFilters ,
234+ this ::getCharFilterProvider );
235+ }
236+
237+ private <T > AnalysisProvider <T > getProvider (Component componentType , String componentName , IndexSettings indexSettings ,
238+ String componentSettings , Map <String , AnalysisProvider <T >> providers , Function <String , AnalysisProvider <T >> providerFunction ) {
239+ final Map <String , Settings > subSettings = indexSettings .getSettings ().getGroups (componentSettings );
240+ if (subSettings .containsKey (componentName )) {
241+ Settings currentSettings = subSettings .get (componentName );
242+ return getAnalysisProvider (componentType , providers , componentName , currentSettings .get ("type" ));
249243 } else {
250- return getCharFilterProvider ( charFilter );
244+ return providerFunction . apply ( componentName );
251245 }
252246 }
253247
@@ -326,9 +320,9 @@ private <T> Map<String, T> buildMapping(Component component, IndexSettings setti
326320
327321 }
328322 // go over the char filters in the bindings and register the ones that are not configured
329- for (Map .Entry <String , ? extends AnalysisModule . AnalysisProvider <T >> entry : providerMap .entrySet ()) {
323+ for (Map .Entry <String , ? extends AnalysisProvider <T >> entry : providerMap .entrySet ()) {
330324 String name = entry .getKey ();
331- AnalysisModule . AnalysisProvider <T > provider = entry .getValue ();
325+ AnalysisProvider <T > provider = entry .getValue ();
332326 // we don't want to re-register one that already exists
333327 if (settingsMap .containsKey (name )) {
334328 continue ;
@@ -337,7 +331,7 @@ private <T> Map<String, T> buildMapping(Component component, IndexSettings setti
337331 if (provider .requiresAnalysisSettings ()) {
338332 continue ;
339333 }
340- AnalysisModule . AnalysisProvider <T > defaultProvider = defaultInstance .get (name );
334+ AnalysisProvider <T > defaultProvider = defaultInstance .get (name );
341335 final T instance ;
342336 if (defaultProvider == null ) {
343337 instance = provider .get (settings , environment , name , defaultSettings );
@@ -347,20 +341,15 @@ private <T> Map<String, T> buildMapping(Component component, IndexSettings setti
347341 factories .put (name , instance );
348342 }
349343
350- for (Map .Entry <String , ? extends AnalysisModule . AnalysisProvider <T >> entry : defaultInstance .entrySet ()) {
344+ for (Map .Entry <String , ? extends AnalysisProvider <T >> entry : defaultInstance .entrySet ()) {
351345 final String name = entry .getKey ();
352- final AnalysisModule .AnalysisProvider <T > provider = entry .getValue ();
353- if (factories .containsKey (name ) == false ) {
354- final T instance = provider .get (settings , environment , name , defaultSettings );
355- if (factories .containsKey (name ) == false ) {
356- factories .put (name , instance );
357- }
358- }
346+ final AnalysisProvider <T > provider = entry .getValue ();
347+ factories .putIfAbsent (name , provider .get (settings , environment , name , defaultSettings ));
359348 }
360349 return factories ;
361350 }
362351
363- private <T > AnalysisProvider <T > getAnalysisProvider (Component component , Map <String , ? extends AnalysisProvider <T >> providerMap ,
352+ private static <T > AnalysisProvider <T > getAnalysisProvider (Component component , Map <String , ? extends AnalysisProvider <T >> providerMap ,
364353 String name , String typeName ) {
365354 if (typeName == null ) {
366355 throw new IllegalArgumentException (component + " [" + name + "] must specify either an analyzer type, or a tokenizer" );
@@ -374,7 +363,7 @@ private <T> AnalysisProvider<T> getAnalysisProvider(Component component, Map<Str
374363
375364 private static class PrebuiltAnalysis implements Closeable {
376365
377- final Map <String , AnalysisModule . AnalysisProvider <AnalyzerProvider <?>>> analyzerProviderFactories ;
366+ final Map <String , AnalysisProvider <AnalyzerProvider <?>>> analyzerProviderFactories ;
378367 final Map <String , ? extends AnalysisProvider <TokenFilterFactory >> preConfiguredTokenFilters ;
379368 final Map <String , ? extends AnalysisProvider <TokenizerFactory >> preConfiguredTokenizers ;
380369 final Map <String , ? extends AnalysisProvider <CharFilterFactory >> preConfiguredCharFilterFactories ;
@@ -399,19 +388,19 @@ private PrebuiltAnalysis(
399388 this .preConfiguredTokenizers = preConfiguredTokenizers ;
400389 }
401390
402- public AnalysisModule . AnalysisProvider <CharFilterFactory > getCharFilterFactory (String name ) {
391+ public AnalysisProvider <CharFilterFactory > getCharFilterFactory (String name ) {
403392 return preConfiguredCharFilterFactories .get (name );
404393 }
405394
406- public AnalysisModule . AnalysisProvider <TokenFilterFactory > getTokenFilterFactory (String name ) {
395+ public AnalysisProvider <TokenFilterFactory > getTokenFilterFactory (String name ) {
407396 return preConfiguredTokenFilters .get (name );
408397 }
409398
410- public AnalysisModule . AnalysisProvider <TokenizerFactory > getTokenizerFactory (String name ) {
399+ public AnalysisProvider <TokenizerFactory > getTokenizerFactory (String name ) {
411400 return preConfiguredTokenizers .get (name );
412401 }
413402
414- public AnalysisModule . AnalysisProvider <AnalyzerProvider <?>> getAnalyzerProvider (String name ) {
403+ public AnalysisProvider <AnalyzerProvider <?>> getAnalyzerProvider (String name ) {
415404 return analyzerProviderFactories .get (name );
416405 }
417406
@@ -429,8 +418,6 @@ public IndexAnalyzers build(IndexSettings indexSettings,
429418 Map <String , CharFilterFactory > charFilterFactoryFactories ,
430419 Map <String , TokenFilterFactory > tokenFilterFactoryFactories ) {
431420
432- Index index = indexSettings .getIndex ();
433- analyzerProviders = new HashMap <>(analyzerProviders );
434421 Map <String , NamedAnalyzer > analyzers = new HashMap <>();
435422 Map <String , NamedAnalyzer > normalizers = new HashMap <>();
436423 Map <String , NamedAnalyzer > whitespaceNormalizers = new HashMap <>();
@@ -461,7 +448,7 @@ public IndexAnalyzers build(IndexSettings indexSettings,
461448
462449 if (analyzers .containsKey ("default_index" )) {
463450 throw new IllegalArgumentException ("setting [index.analysis.analyzer.default_index] is not supported anymore, use " +
464- "[index.analysis.analyzer.default] instead for index [" + index .getName () + "]" );
451+ "[index.analysis.analyzer.default] instead for index [" + indexSettings . getIndex () .getName () + "]" );
465452 }
466453
467454 for (Map .Entry <String , NamedAnalyzer > analyzer : analyzers .entrySet ()) {
0 commit comments