Skip to content

Commit 1d329d8

Browse files
author
Christoph Büscher
committed
Deprecate nGram and edgeNGram names for ngram filters (#30209)
The camel case name `nGram` should be removed in favour of `ngram` and similar for `edgeNGram` and `edge_ngram`. Before removal, we need to deprecate the camel case names first. This change adds deprecation warnings for indices with versions 6.4.0 and higher and logs deprecation warnings.
1 parent e7debce commit 1d329d8

File tree

4 files changed

+146
-24
lines changed

4 files changed

+146
-24
lines changed

modules/analysis-common/src/main/java/org/elasticsearch/analysis/common/CommonAnalysisPlugin.java

Lines changed: 16 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -237,9 +237,14 @@ public List<PreConfiguredTokenFilter> getPreConfiguredTokenFilters() {
237237
filters.add(PreConfiguredTokenFilter.singleton("dutch_stem", false, input -> new SnowballFilter(input, new DutchStemmer())));
238238
filters.add(PreConfiguredTokenFilter.singleton("edge_ngram", false, input ->
239239
new EdgeNGramTokenFilter(input, EdgeNGramTokenFilter.DEFAULT_MIN_GRAM_SIZE, EdgeNGramTokenFilter.DEFAULT_MAX_GRAM_SIZE)));
240-
// TODO deprecate edgeNGram
241-
filters.add(PreConfiguredTokenFilter.singleton("edgeNGram", false, input ->
242-
new EdgeNGramTokenFilter(input, EdgeNGramTokenFilter.DEFAULT_MIN_GRAM_SIZE, EdgeNGramTokenFilter.DEFAULT_MAX_GRAM_SIZE)));
240+
filters.add(PreConfiguredTokenFilter.singletonWithVersion("edgeNGram", false, (reader, version) -> {
241+
if (version.onOrAfter(org.elasticsearch.Version.V_6_4_0)) {
242+
DEPRECATION_LOGGER.deprecatedAndMaybeLog("edgeNGram_deprecation",
243+
"The [edgeNGram] token filter name is deprecated and will be removed in a future version. "
244+
+ "Please change the filter name to [edge_ngram] instead.");
245+
}
246+
return new EdgeNGramTokenFilter(reader, EdgeNGramTokenFilter.DEFAULT_MIN_GRAM_SIZE, EdgeNGramTokenFilter.DEFAULT_MAX_GRAM_SIZE);
247+
}));
243248
filters.add(PreConfiguredTokenFilter.singleton("elision", true,
244249
input -> new ElisionFilter(input, FrenchAnalyzer.DEFAULT_ARTICLES)));
245250
filters.add(PreConfiguredTokenFilter.singleton("french_stem", false, input -> new SnowballFilter(input, new FrenchStemmer())));
@@ -256,8 +261,14 @@ public List<PreConfiguredTokenFilter> getPreConfiguredTokenFilters() {
256261
LimitTokenCountFilterFactory.DEFAULT_MAX_TOKEN_COUNT,
257262
LimitTokenCountFilterFactory.DEFAULT_CONSUME_ALL_TOKENS)));
258263
filters.add(PreConfiguredTokenFilter.singleton("ngram", false, NGramTokenFilter::new));
259-
// TODO deprecate nGram
260-
filters.add(PreConfiguredTokenFilter.singleton("nGram", false, NGramTokenFilter::new));
264+
filters.add(PreConfiguredTokenFilter.singletonWithVersion("nGram", false, (reader, version) -> {
265+
if (version.onOrAfter(org.elasticsearch.Version.V_6_4_0)) {
266+
DEPRECATION_LOGGER.deprecatedAndMaybeLog("nGram_deprecation",
267+
"The [nGram] token filter name is deprecated and will be removed in a future version. "
268+
+ "Please change the filter name to [ngram] instead.");
269+
}
270+
return new NGramTokenFilter(reader);
271+
}));
261272
filters.add(PreConfiguredTokenFilter.singleton("persian_normalization", true, PersianNormalizationFilter::new));
262273
filters.add(PreConfiguredTokenFilter.singleton("porter_stem", false, PorterStemFilter::new));
263274
filters.add(PreConfiguredTokenFilter.singleton("reverse", false, ReverseStringFilter::new));
Lines changed: 119 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,119 @@
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.analysis.common;
21+
22+
import org.apache.lucene.analysis.MockTokenizer;
23+
import org.apache.lucene.analysis.Tokenizer;
24+
import org.elasticsearch.Version;
25+
import org.elasticsearch.cluster.metadata.IndexMetaData;
26+
import org.elasticsearch.common.settings.Settings;
27+
import org.elasticsearch.env.Environment;
28+
import org.elasticsearch.index.IndexSettings;
29+
import org.elasticsearch.index.analysis.TokenFilterFactory;
30+
import org.elasticsearch.test.ESTestCase;
31+
import org.elasticsearch.test.IndexSettingsModule;
32+
import org.elasticsearch.test.VersionUtils;
33+
34+
import java.io.IOException;
35+
import java.io.StringReader;
36+
import java.util.Map;
37+
38+
public class CommonAnalysisPluginTests extends ESTestCase {
39+
40+
/**
41+
* Check that the deprecated name "nGram" issues a deprecation warning for indices created since 6.3.0
42+
*/
43+
public void testNGramDeprecationWarning() throws IOException {
44+
Settings settings = Settings.builder().put(Environment.PATH_HOME_SETTING.getKey(), createTempDir())
45+
.put(IndexMetaData.SETTING_VERSION_CREATED, VersionUtils.randomVersionBetween(random(), Version.V_6_4_0, Version.CURRENT))
46+
.build();
47+
48+
IndexSettings idxSettings = IndexSettingsModule.newIndexSettings("index", settings);
49+
try (CommonAnalysisPlugin commonAnalysisPlugin = new CommonAnalysisPlugin()) {
50+
Map<String, TokenFilterFactory> tokenFilters = createTestAnalysis(idxSettings, settings, commonAnalysisPlugin).tokenFilter;
51+
TokenFilterFactory tokenFilterFactory = tokenFilters.get("nGram");
52+
Tokenizer tokenizer = new MockTokenizer();
53+
tokenizer.setReader(new StringReader("foo bar"));
54+
assertNotNull(tokenFilterFactory.create(tokenizer));
55+
assertWarnings(
56+
"The [nGram] token filter name is deprecated and will be removed in a future version. "
57+
+ "Please change the filter name to [ngram] instead.");
58+
}
59+
}
60+
61+
/**
62+
* Check that the deprecated name "nGram" does NOT issues a deprecation warning for indices created before 6.4.0
63+
*/
64+
public void testNGramNoDeprecationWarningPre6_4() throws IOException {
65+
Settings settings = Settings.builder().put(Environment.PATH_HOME_SETTING.getKey(), createTempDir())
66+
.put(IndexMetaData.SETTING_VERSION_CREATED,
67+
VersionUtils.randomVersionBetween(random(), Version.V_5_0_0, Version.V_6_3_0))
68+
.build();
69+
70+
IndexSettings idxSettings = IndexSettingsModule.newIndexSettings("index", settings);
71+
try (CommonAnalysisPlugin commonAnalysisPlugin = new CommonAnalysisPlugin()) {
72+
Map<String, TokenFilterFactory> tokenFilters = createTestAnalysis(idxSettings, settings, commonAnalysisPlugin).tokenFilter;
73+
TokenFilterFactory tokenFilterFactory = tokenFilters.get("nGram");
74+
Tokenizer tokenizer = new MockTokenizer();
75+
tokenizer.setReader(new StringReader("foo bar"));
76+
assertNotNull(tokenFilterFactory.create(tokenizer));
77+
}
78+
}
79+
80+
/**
81+
* Check that the deprecated name "edgeNGram" issues a deprecation warning for indices created since 6.3.0
82+
*/
83+
public void testEdgeNGramDeprecationWarning() throws IOException {
84+
Settings settings = Settings.builder().put(Environment.PATH_HOME_SETTING.getKey(), createTempDir())
85+
.put(IndexMetaData.SETTING_VERSION_CREATED, VersionUtils.randomVersionBetween(random(), Version.V_6_4_0, Version.CURRENT))
86+
.build();
87+
88+
IndexSettings idxSettings = IndexSettingsModule.newIndexSettings("index", settings);
89+
try (CommonAnalysisPlugin commonAnalysisPlugin = new CommonAnalysisPlugin()) {
90+
Map<String, TokenFilterFactory> tokenFilters = createTestAnalysis(idxSettings, settings, commonAnalysisPlugin).tokenFilter;
91+
TokenFilterFactory tokenFilterFactory = tokenFilters.get("edgeNGram");
92+
Tokenizer tokenizer = new MockTokenizer();
93+
tokenizer.setReader(new StringReader("foo bar"));
94+
assertNotNull(tokenFilterFactory.create(tokenizer));
95+
assertWarnings(
96+
"The [edgeNGram] token filter name is deprecated and will be removed in a future version. "
97+
+ "Please change the filter name to [edge_ngram] instead.");
98+
}
99+
}
100+
101+
/**
102+
* Check that the deprecated name "edgeNGram" does NOT issues a deprecation warning for indices created before 6.4.0
103+
*/
104+
public void testEdgeNGramNoDeprecationWarningPre6_4() throws IOException {
105+
Settings settings = Settings.builder().put(Environment.PATH_HOME_SETTING.getKey(), createTempDir())
106+
.put(IndexMetaData.SETTING_VERSION_CREATED,
107+
VersionUtils.randomVersionBetween(random(), Version.V_5_0_0, Version.V_6_3_0))
108+
.build();
109+
110+
IndexSettings idxSettings = IndexSettingsModule.newIndexSettings("index", settings);
111+
try (CommonAnalysisPlugin commonAnalysisPlugin = new CommonAnalysisPlugin()) {
112+
Map<String, TokenFilterFactory> tokenFilters = createTestAnalysis(idxSettings, settings, commonAnalysisPlugin).tokenFilter;
113+
TokenFilterFactory tokenFilterFactory = tokenFilters.get("edgeNGram");
114+
Tokenizer tokenizer = new MockTokenizer();
115+
tokenizer.setReader(new StringReader("foo bar"));
116+
assertNotNull(tokenFilterFactory.create(tokenizer));
117+
}
118+
}
119+
}

modules/analysis-common/src/test/java/org/elasticsearch/analysis/common/NGramTokenizerFactoryTests.java

Lines changed: 2 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -32,15 +32,11 @@
3232
import org.elasticsearch.index.IndexSettings;
3333
import org.elasticsearch.test.ESTokenStreamTestCase;
3434
import org.elasticsearch.test.IndexSettingsModule;
35+
import org.elasticsearch.test.VersionUtils;
3536

3637
import java.io.IOException;
3738
import java.io.StringReader;
38-
import java.lang.reflect.Field;
39-
import java.lang.reflect.Modifier;
40-
import java.util.ArrayList;
4139
import java.util.Arrays;
42-
import java.util.List;
43-
import java.util.Random;
4440

4541
import static com.carrotsearch.randomizedtesting.RandomizedTest.scaledRandomIntBetween;
4642
import static org.hamcrest.Matchers.instanceOf;
@@ -128,7 +124,7 @@ public void testBackwardsCompatibilityEdgeNgramTokenFilter() throws Exception {
128124
for (int i = 0; i < iters; i++) {
129125
final Index index = new Index("test", "_na_");
130126
final String name = "ngr";
131-
Version v = randomVersion(random());
127+
Version v = VersionUtils.randomVersion(random());
132128
Builder builder = newAnalysisSettingsBuilder().put("min_gram", 2).put("max_gram", 3);
133129
boolean reverse = random().nextBoolean();
134130
if (reverse) {
@@ -148,17 +144,4 @@ public void testBackwardsCompatibilityEdgeNgramTokenFilter() throws Exception {
148144
}
149145
}
150146
}
151-
152-
153-
private Version randomVersion(Random random) throws IllegalArgumentException, IllegalAccessException {
154-
Field[] declaredFields = Version.class.getFields();
155-
List<Field> versionFields = new ArrayList<>();
156-
for (Field field : declaredFields) {
157-
if ((field.getModifiers() & Modifier.STATIC) != 0 && field.getName().startsWith("V_") && field.getType() == Version.class) {
158-
versionFields.add(field);
159-
}
160-
}
161-
return (Version) versionFields.get(random.nextInt(versionFields.size())).get(Version.class);
162-
}
163-
164147
}

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

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,15 @@ public static PreConfiguredTokenFilter singleton(String name, boolean useFilterF
4141
(tokenStream, version) -> create.apply(tokenStream));
4242
}
4343

44+
/**
45+
* Create a pre-configured token filter that may not vary at all.
46+
*/
47+
public static PreConfiguredTokenFilter singletonWithVersion(String name, boolean useFilterForMultitermQueries,
48+
BiFunction<TokenStream, Version, TokenStream> create) {
49+
return new PreConfiguredTokenFilter(name, useFilterForMultitermQueries, CachingStrategy.ONE,
50+
(tokenStream, version) -> create.apply(tokenStream, version));
51+
}
52+
4453
/**
4554
* Create a pre-configured token filter that may vary based on the Lucene version.
4655
*/

0 commit comments

Comments
 (0)