Skip to content

Commit 12d5642

Browse files
author
Christoph Büscher
committed
Small internal AnalysisRegistry changes (#42500)
Some internal refactorings to the AnalysisRegistry, spin-off from #40782.
1 parent a5b6ed8 commit 12d5642

File tree

1 file changed

+33
-46
lines changed

1 file changed

+33
-46
lines changed

server/src/main/java/org/elasticsearch/index/analysis/AnalysisRegistry.java

Lines changed: 33 additions & 46 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,6 @@
2626
import org.elasticsearch.common.settings.Settings;
2727
import org.elasticsearch.core.internal.io.IOUtils;
2828
import org.elasticsearch.env.Environment;
29-
import org.elasticsearch.index.Index;
3029
import org.elasticsearch.index.IndexSettings;
3130
import org.elasticsearch.index.mapper.TextFieldMapper;
3231
import org.elasticsearch.indices.analysis.AnalysisModule;
@@ -40,6 +39,7 @@
4039
import java.util.Locale;
4140
import java.util.Map;
4241
import java.util.concurrent.ConcurrentHashMap;
42+
import java.util.function.Function;
4343
import java.util.stream.Collectors;
4444

4545
import 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

Comments
 (0)