Skip to content

Commit 2557dc5

Browse files
author
Christoph Büscher
committed
Addressing review comments
1 parent a5842b5 commit 2557dc5

File tree

6 files changed

+136
-107
lines changed

6 files changed

+136
-107
lines changed

server/src/main/java/org/elasticsearch/action/admin/indices/analyze/TransportAnalyzeAction.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -47,9 +47,9 @@
4747
import org.elasticsearch.index.IndexService;
4848
import org.elasticsearch.index.IndexSettings;
4949
import org.elasticsearch.index.analysis.AnalysisRegistry;
50+
import org.elasticsearch.index.analysis.AnalyzerComponents;
5051
import org.elasticsearch.index.analysis.CharFilterFactory;
5152
import org.elasticsearch.index.analysis.CustomAnalyzer;
52-
import org.elasticsearch.index.analysis.CustomAnalyzerProvider.AnalyzerComponents;
5353
import org.elasticsearch.index.analysis.IndexAnalyzers;
5454
import org.elasticsearch.index.analysis.NamedAnalyzer;
5555
import org.elasticsearch.index.analysis.NormalizingCharFilterFactory;
Lines changed: 111 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,111 @@
1+
/*
2+
* Licensed to Elasticsearch under one or more contributor
3+
* license agreements. See the NOTICE file distributed with
4+
* this work for additional information regarding copyright
5+
* ownership. Elasticsearch licenses this file to you under
6+
* the Apache License, Version 2.0 (the "License"); you may
7+
* not use this file except in compliance with the License.
8+
* You may obtain a copy of the License at
9+
*
10+
* http://www.apache.org/licenses/LICENSE-2.0
11+
*
12+
* Unless required by applicable law or agreed to in writing,
13+
* software distributed under the License is distributed on an
14+
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
15+
* KIND, either express or implied. See the License for the
16+
* specific language governing permissions and limitations
17+
* under the License.
18+
*/
19+
20+
package org.elasticsearch.index.analysis;
21+
22+
import org.elasticsearch.common.settings.Settings;
23+
24+
import java.util.ArrayList;
25+
import java.util.List;
26+
import java.util.Map;
27+
28+
/**
29+
* A class that groups analysis components necessary to produce a custom analyzer.
30+
* See {@link ReloadableCustomAnalyzer} for an example usage.
31+
*/
32+
public final class AnalyzerComponents {
33+
private final String tokenizerName;
34+
private final TokenizerFactory tokenizerFactory;
35+
private final CharFilterFactory[] charFilters;
36+
private final TokenFilterFactory[] tokenFilters;
37+
private final AnalysisMode analysisMode;
38+
39+
private AnalyzerComponents(String tokenizerName, TokenizerFactory tokenizerFactory, CharFilterFactory[] charFilters,
40+
TokenFilterFactory[] tokenFilters) {
41+
this.tokenizerName = tokenizerName;
42+
this.tokenizerFactory = tokenizerFactory;
43+
this.charFilters = charFilters;
44+
this.tokenFilters = tokenFilters;
45+
AnalysisMode mode = AnalysisMode.ALL;
46+
for (TokenFilterFactory f : tokenFilters) {
47+
mode = mode.merge(f.getAnalysisMode());
48+
}
49+
this.analysisMode = mode;
50+
}
51+
52+
static AnalyzerComponents createComponents(String name, Settings analyzerSettings, final Map<String, TokenizerFactory> tokenizers,
53+
final Map<String, CharFilterFactory> charFilters, final Map<String, TokenFilterFactory> tokenFilters) {
54+
String tokenizerName = analyzerSettings.get("tokenizer");
55+
if (tokenizerName == null) {
56+
throw new IllegalArgumentException("Custom Analyzer [" + name + "] must be configured with a tokenizer");
57+
}
58+
59+
TokenizerFactory tokenizer = tokenizers.get(tokenizerName);
60+
if (tokenizer == null) {
61+
throw new IllegalArgumentException(
62+
"Custom Analyzer [" + name + "] failed to find tokenizer under name " + "[" + tokenizerName + "]");
63+
}
64+
65+
List<String> charFilterNames = analyzerSettings.getAsList("char_filter");
66+
List<CharFilterFactory> charFiltersList = new ArrayList<>(charFilterNames.size());
67+
for (String charFilterName : charFilterNames) {
68+
CharFilterFactory charFilter = charFilters.get(charFilterName);
69+
if (charFilter == null) {
70+
throw new IllegalArgumentException(
71+
"Custom Analyzer [" + name + "] failed to find char_filter under name " + "[" + charFilterName + "]");
72+
}
73+
charFiltersList.add(charFilter);
74+
}
75+
76+
List<String> tokenFilterNames = analyzerSettings.getAsList("filter");
77+
List<TokenFilterFactory> tokenFilterList = new ArrayList<>(tokenFilterNames.size());
78+
for (String tokenFilterName : tokenFilterNames) {
79+
TokenFilterFactory tokenFilter = tokenFilters.get(tokenFilterName);
80+
if (tokenFilter == null) {
81+
throw new IllegalArgumentException(
82+
"Custom Analyzer [" + name + "] failed to find filter under name " + "[" + tokenFilterName + "]");
83+
}
84+
tokenFilter = tokenFilter.getChainAwareTokenFilterFactory(tokenizer, charFiltersList, tokenFilterList, tokenFilters::get);
85+
tokenFilterList.add(tokenFilter);
86+
}
87+
88+
return new AnalyzerComponents(tokenizerName, tokenizer, charFiltersList.toArray(new CharFilterFactory[charFiltersList.size()]),
89+
tokenFilterList.toArray(new TokenFilterFactory[tokenFilterList.size()]));
90+
}
91+
92+
public String getTokenizerName() {
93+
return tokenizerName;
94+
}
95+
96+
public TokenizerFactory getTokenizerFactory() {
97+
return tokenizerFactory;
98+
}
99+
100+
public TokenFilterFactory[] getTokenFilters() {
101+
return tokenFilters;
102+
}
103+
104+
public CharFilterFactory[] getCharFilters() {
105+
return charFilters;
106+
}
107+
108+
public AnalysisMode analysisMode() {
109+
return this.analysisMode;
110+
}
111+
}

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

Lines changed: 2 additions & 93 deletions
Original file line numberDiff line numberDiff line change
@@ -24,10 +24,10 @@
2424
import org.elasticsearch.index.IndexSettings;
2525
import org.elasticsearch.index.mapper.TextFieldMapper;
2626

27-
import java.util.ArrayList;
28-
import java.util.List;
2927
import java.util.Map;
3028

29+
import static org.elasticsearch.index.analysis.AnalyzerComponents.createComponents;
30+
3131
/**
3232
* A custom analyzer that is built out of a single {@link org.apache.lucene.analysis.Tokenizer} and a list
3333
* of {@link org.apache.lucene.analysis.TokenFilter}s.
@@ -69,99 +69,8 @@ private static Analyzer create(String name, Settings analyzerSettings, Map<Strin
6969
}
7070
}
7171

72-
static AnalyzerComponents createComponents(String name, Settings analyzerSettings,
73-
final Map<String, TokenizerFactory> tokenizers,
74-
final Map<String, CharFilterFactory> charFilters,
75-
final Map<String, TokenFilterFactory> tokenFilters) {
76-
String tokenizerName = analyzerSettings.get("tokenizer");
77-
if (tokenizerName == null) {
78-
throw new IllegalArgumentException("Custom Analyzer [" + name + "] must be configured with a tokenizer");
79-
}
80-
81-
TokenizerFactory tokenizer = tokenizers.get(tokenizerName);
82-
if (tokenizer == null) {
83-
throw new IllegalArgumentException("Custom Analyzer [" + name + "] failed to find tokenizer under name " +
84-
"[" + tokenizerName + "]");
85-
}
86-
87-
List<String> charFilterNames = analyzerSettings.getAsList("char_filter");
88-
List<CharFilterFactory> charFiltersList = new ArrayList<>(charFilterNames.size());
89-
for (String charFilterName : charFilterNames) {
90-
CharFilterFactory charFilter = charFilters.get(charFilterName);
91-
if (charFilter == null) {
92-
throw new IllegalArgumentException("Custom Analyzer [" + name + "] failed to find char_filter under name " +
93-
"[" + charFilterName + "]");
94-
}
95-
charFiltersList.add(charFilter);
96-
}
97-
98-
int positionIncrementGap = TextFieldMapper.Defaults.POSITION_INCREMENT_GAP;
99-
100-
positionIncrementGap = analyzerSettings.getAsInt("position_increment_gap", positionIncrementGap);
101-
102-
int offsetGap = analyzerSettings.getAsInt("offset_gap", -1);
103-
104-
List<String> tokenFilterNames = analyzerSettings.getAsList("filter");
105-
List<TokenFilterFactory> tokenFilterList = new ArrayList<>(tokenFilterNames.size());
106-
for (String tokenFilterName : tokenFilterNames) {
107-
TokenFilterFactory tokenFilter = tokenFilters.get(tokenFilterName);
108-
if (tokenFilter == null) {
109-
throw new IllegalArgumentException("Custom Analyzer [" + name + "] failed to find filter under name " +
110-
"[" + tokenFilterName + "]");
111-
}
112-
tokenFilter = tokenFilter.getChainAwareTokenFilterFactory(tokenizer, charFiltersList, tokenFilterList, tokenFilters::get);
113-
tokenFilterList.add(tokenFilter);
114-
}
115-
116-
return new AnalyzerComponents(tokenizerName, tokenizer,
117-
charFiltersList.toArray(new CharFilterFactory[charFiltersList.size()]),
118-
tokenFilterList.toArray(new TokenFilterFactory[tokenFilterList.size()])
119-
);
120-
}
121-
12272
@Override
12373
public Analyzer get() {
12474
return this.customAnalyzer;
12575
}
126-
127-
public static class AnalyzerComponents {
128-
private final String tokenizerName;
129-
private final TokenizerFactory tokenizerFactory;
130-
private final CharFilterFactory[] charFilters;
131-
private final TokenFilterFactory[] tokenFilters;
132-
private final AnalysisMode analysisMode;
133-
134-
AnalyzerComponents(String tokenizerName, TokenizerFactory tokenizerFactory, CharFilterFactory[] charFilters,
135-
TokenFilterFactory[] tokenFilters) {
136-
this.tokenizerName = tokenizerName;
137-
this.tokenizerFactory = tokenizerFactory;
138-
this.charFilters = charFilters;
139-
this.tokenFilters = tokenFilters;
140-
AnalysisMode mode = AnalysisMode.ALL;
141-
for (TokenFilterFactory f : tokenFilters) {
142-
mode = mode.merge(f.getAnalysisMode());
143-
}
144-
this.analysisMode = mode;
145-
}
146-
147-
public String getTokenizerName() {
148-
return tokenizerName;
149-
}
150-
151-
public TokenizerFactory getTokenizerFactory() {
152-
return tokenizerFactory;
153-
}
154-
155-
public TokenFilterFactory[] getTokenFilters() {
156-
return tokenFilters;
157-
}
158-
159-
public CharFilterFactory[] getCharFilters() {
160-
return charFilters;
161-
}
162-
163-
public AnalysisMode analysisMode() {
164-
return this.analysisMode;
165-
}
166-
}
16776
}

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

Lines changed: 18 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -24,12 +24,10 @@
2424

2525
import java.io.Closeable;
2626
import java.io.IOException;
27-
import java.util.HashMap;
2827
import java.util.Map;
2928
import java.util.Objects;
3029
import java.util.stream.Stream;
3130

32-
import static java.util.Collections.unmodifiableMap;
3331
import static org.elasticsearch.index.analysis.AnalysisRegistry.DEFAULT_ANALYZER_NAME;
3432
import static org.elasticsearch.index.analysis.AnalysisRegistry.DEFAULT_SEARCH_ANALYZER_NAME;
3533
import static org.elasticsearch.index.analysis.AnalysisRegistry.DEFAULT_SEARCH_QUOTED_ANALYZER_NAME;
@@ -54,16 +52,20 @@ public IndexAnalyzers(IndexSettings indexSettings, Map<String, NamedAnalyzer> an
5452
throw new IllegalStateException(
5553
"default analyzer must have the name [default] but was: [" + analyzers.get(DEFAULT_ANALYZER_NAME).name() + "]");
5654
}
57-
this.analyzers = unmodifiableMap(new HashMap<>(analyzers));
58-
this.normalizers = unmodifiableMap(new HashMap<>(normalizers));
59-
this.whitespaceNormalizers = unmodifiableMap(new HashMap<>(whitespaceNormalizers));
55+
this.analyzers = Map.copyOf(analyzers);
56+
this.normalizers = Map.copyOf(normalizers);
57+
this.whitespaceNormalizers = Map.copyOf(whitespaceNormalizers);
6058
}
6159

6260
/**
6361
* Returns an analyzer mapped to the given name or <code>null</code> if not present
6462
*/
6563
public NamedAnalyzer get(String name) {
66-
return analyzers.get(name);
64+
if (name != null) {
65+
return analyzers.get(name);
66+
} else {
67+
return null;
68+
}
6769
}
6870

6971
/**
@@ -77,14 +79,22 @@ public Map<String, NamedAnalyzer> getAnalyzers() {
7779
* Returns a normalizer mapped to the given name or <code>null</code> if not present
7880
*/
7981
public NamedAnalyzer getNormalizer(String name) {
80-
return normalizers.get(name);
82+
if (name != null) {
83+
return normalizers.get(name);
84+
} else {
85+
return null;
86+
}
8187
}
8288

8389
/**
8490
* Returns a normalizer that splits on whitespace mapped to the given name or <code>null</code> if not present
8591
*/
8692
public NamedAnalyzer getWhitespaceNormalizer(String name) {
87-
return whitespaceNormalizers.get(name);
93+
if (name != null) {
94+
return whitespaceNormalizers.get(name);
95+
} else {
96+
return null;
97+
}
8898
}
8999

90100
/**

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

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,6 @@
2424
import org.apache.lucene.analysis.Tokenizer;
2525
import org.apache.lucene.util.CloseableThreadLocal;
2626
import org.elasticsearch.common.settings.Settings;
27-
import org.elasticsearch.index.analysis.CustomAnalyzerProvider.AnalyzerComponents;
2827

2928
import java.io.Reader;
3029
import java.util.Map;
@@ -124,7 +123,7 @@ public synchronized void reload(String name,
124123
final Map<String, TokenizerFactory> tokenizers,
125124
final Map<String, CharFilterFactory> charFilters,
126125
final Map<String, TokenFilterFactory> tokenFilters) {
127-
AnalyzerComponents components = CustomAnalyzerProvider.createComponents(name, settings, tokenizers, charFilters, tokenFilters);
126+
AnalyzerComponents components = AnalyzerComponents.createComponents(name, settings, tokenizers, charFilters, tokenFilters);
128127
this.components = components;
129128
}
130129

server/src/main/java/org/elasticsearch/rest/action/admin/indices/RestReloadAnalyzersAction.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -47,8 +47,8 @@ public String getName() {
4747

4848
@Override
4949
public RestChannelConsumer prepareRequest(final RestRequest request, final NodeClient client) throws IOException {
50-
ReloadAnalyzersRequest reloadAnalyuersRequest = reloadAnalyzersRequest(Strings.splitStringByCommaToArray(request.param("index")));
51-
reloadAnalyuersRequest.indicesOptions(IndicesOptions.fromRequest(request, reloadAnalyuersRequest.indicesOptions()));
52-
return channel -> client.admin().indices().reloadAnalyzers(reloadAnalyuersRequest, new RestToXContentListener<>(channel));
50+
ReloadAnalyzersRequest reloadAnalyzersRequest = reloadAnalyzersRequest(Strings.splitStringByCommaToArray(request.param("index")));
51+
reloadAnalyzersRequest.indicesOptions(IndicesOptions.fromRequest(request, reloadAnalyzersRequest.indicesOptions()));
52+
return channel -> client.admin().indices().reloadAnalyzers(reloadAnalyzersRequest, new RestToXContentListener<>(channel));
5353
}
5454
}

0 commit comments

Comments
 (0)