Skip to content

Commit ca76712

Browse files
committed
Merge branch 'master' into feature/search-request-refactoring
2 parents 6819224 + 08f7f7f commit ca76712

File tree

6 files changed

+175
-14
lines changed

6 files changed

+175
-14
lines changed

core/src/main/java/org/elasticsearch/index/analysis/AnalysisService.java

Lines changed: 11 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,6 @@ public class AnalysisService extends AbstractIndexComponent implements Closeable
4848
private final Map<String, CharFilterFactory> charFilters;
4949
private final Map<String, TokenFilterFactory> tokenFilters;
5050

51-
private final NamedAnalyzer defaultAnalyzer;
5251
private final NamedAnalyzer defaultIndexAnalyzer;
5352
private final NamedAnalyzer defaultSearchAnalyzer;
5453
private final NamedAnalyzer defaultSearchQuoteAnalyzer;
@@ -263,12 +262,20 @@ public AnalysisService(Index index, @IndexSettings Settings indexSettings, @Null
263262
}
264263
}
265264

266-
defaultAnalyzer = analyzers.get("default");
265+
NamedAnalyzer defaultAnalyzer = analyzers.get("default");
267266
if (defaultAnalyzer == null) {
268267
throw new IllegalArgumentException("no default analyzer configured");
269268
}
270-
defaultIndexAnalyzer = analyzers.containsKey("default_index") ? analyzers.get("default_index") : analyzers.get("default");
271-
defaultSearchAnalyzer = analyzers.containsKey("default_search") ? analyzers.get("default_search") : analyzers.get("default");
269+
if (analyzers.containsKey("default_index")) {
270+
final Version createdVersion = Version.indexCreated(indexSettings);
271+
if (createdVersion.onOrAfter(Version.V_3_0_0)) {
272+
throw new IllegalArgumentException("setting [index.analysis.analyzer.default_index] is not supported anymore, use [index.analysis.analyzer.default] instead for index [" + index.getName() + "]");
273+
} else {
274+
deprecationLogger.deprecated("setting [index.analysis.analyzer.default_index] is deprecated, use [index.analysis.analyzer.default] instead for index [{}]", index.getName());
275+
}
276+
}
277+
defaultIndexAnalyzer = analyzers.containsKey("default_index") ? analyzers.get("default_index") : defaultAnalyzer;
278+
defaultSearchAnalyzer = analyzers.containsKey("default_search") ? analyzers.get("default_search") : defaultAnalyzer;
272279
defaultSearchQuoteAnalyzer = analyzers.containsKey("default_search_quote") ? analyzers.get("default_search_quote") : defaultSearchAnalyzer;
273280

274281
for (Map.Entry<String, NamedAnalyzer> analyzer : analyzers.entrySet()) {
@@ -299,10 +306,6 @@ public NamedAnalyzer analyzer(String name) {
299306
return analyzers.get(name);
300307
}
301308

302-
public NamedAnalyzer defaultAnalyzer() {
303-
return defaultAnalyzer;
304-
}
305-
306309
public NamedAnalyzer defaultIndexAnalyzer() {
307310
return defaultIndexAnalyzer;
308311
}
Lines changed: 124 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,124 @@
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.apache.lucene.analysis.en.EnglishAnalyzer;
23+
import org.apache.lucene.analysis.standard.StandardAnalyzer;
24+
import org.elasticsearch.Version;
25+
import org.elasticsearch.cluster.metadata.IndexMetaData;
26+
import org.elasticsearch.common.settings.Settings;
27+
import org.elasticsearch.index.Index;
28+
import org.elasticsearch.indices.analysis.IndicesAnalysisService;
29+
import org.elasticsearch.test.ESTestCase;
30+
import org.elasticsearch.test.VersionUtils;
31+
32+
import java.util.Collections;
33+
import java.util.HashMap;
34+
import java.util.Map;
35+
36+
import static org.hamcrest.Matchers.instanceOf;
37+
38+
public class AnalysisServiceTests extends ESTestCase {
39+
40+
private static AnalyzerProviderFactory analyzerProvider(final String name) {
41+
return new AnalyzerProviderFactory() {
42+
@Override
43+
public AnalyzerProvider create(String name, Settings settings) {
44+
return new PreBuiltAnalyzerProvider(name, AnalyzerScope.INDEX, new EnglishAnalyzer());
45+
}
46+
};
47+
}
48+
49+
public void testDefaultAnalyzers() {
50+
Version version = VersionUtils.randomVersion(getRandom());
51+
Settings settings = Settings.builder().put(IndexMetaData.SETTING_VERSION_CREATED, version).build();
52+
IndicesAnalysisService indicesAnalysisService = new IndicesAnalysisService(settings);
53+
AnalysisService analysisService = new AnalysisService(new Index("index"), settings, indicesAnalysisService,
54+
Collections.emptyMap(), Collections.emptyMap(), Collections.emptyMap(), Collections.emptyMap());
55+
assertThat(analysisService.defaultIndexAnalyzer().analyzer(), instanceOf(StandardAnalyzer.class));
56+
assertThat(analysisService.defaultSearchAnalyzer().analyzer(), instanceOf(StandardAnalyzer.class));
57+
assertThat(analysisService.defaultSearchQuoteAnalyzer().analyzer(), instanceOf(StandardAnalyzer.class));
58+
}
59+
60+
public void testOverrideDefaultAnalyzer() {
61+
Version version = VersionUtils.randomVersion(getRandom());
62+
Settings settings = Settings.builder().put(IndexMetaData.SETTING_VERSION_CREATED, version).build();
63+
IndicesAnalysisService indicesAnalysisService = new IndicesAnalysisService(settings);
64+
AnalysisService analysisService = new AnalysisService(new Index("index"), settings, indicesAnalysisService,
65+
Collections.singletonMap("default", analyzerProvider("default")),
66+
Collections.emptyMap(), Collections.emptyMap(), Collections.emptyMap());
67+
assertThat(analysisService.defaultIndexAnalyzer().analyzer(), instanceOf(EnglishAnalyzer.class));
68+
assertThat(analysisService.defaultSearchAnalyzer().analyzer(), instanceOf(EnglishAnalyzer.class));
69+
assertThat(analysisService.defaultSearchQuoteAnalyzer().analyzer(), instanceOf(EnglishAnalyzer.class));
70+
}
71+
72+
public void testOverrideDefaultIndexAnalyzer() {
73+
Version version = VersionUtils.randomVersionBetween(getRandom(), Version.V_3_0_0, Version.CURRENT);
74+
Settings settings = Settings.builder().put(IndexMetaData.SETTING_VERSION_CREATED, version).build();
75+
IndicesAnalysisService indicesAnalysisService = new IndicesAnalysisService(settings);
76+
try {
77+
AnalysisService analysisService = new AnalysisService(new Index("index"), settings, indicesAnalysisService,
78+
Collections.singletonMap("default_index", new PreBuiltAnalyzerProviderFactory("default_index", AnalyzerScope.INDEX, new EnglishAnalyzer())),
79+
Collections.emptyMap(), Collections.emptyMap(), Collections.emptyMap());
80+
fail("Expected ISE");
81+
} catch (IllegalArgumentException e) {
82+
// expected
83+
assertTrue(e.getMessage().contains("[index.analysis.analyzer.default_index] is not supported"));
84+
}
85+
}
86+
87+
public void testBackCompatOverrideDefaultIndexAnalyzer() {
88+
Version version = VersionUtils.randomVersionBetween(getRandom(), VersionUtils.getFirstVersion(), VersionUtils.getPreviousVersion(Version.V_3_0_0));
89+
Settings settings = Settings.builder().put(IndexMetaData.SETTING_VERSION_CREATED, version).build();
90+
IndicesAnalysisService indicesAnalysisService = new IndicesAnalysisService(settings);
91+
AnalysisService analysisService = new AnalysisService(new Index("index"), settings, indicesAnalysisService,
92+
Collections.singletonMap("default_index", analyzerProvider("default_index")),
93+
Collections.emptyMap(), Collections.emptyMap(), Collections.emptyMap());
94+
assertThat(analysisService.defaultIndexAnalyzer().analyzer(), instanceOf(EnglishAnalyzer.class));
95+
assertThat(analysisService.defaultSearchAnalyzer().analyzer(), instanceOf(StandardAnalyzer.class));
96+
assertThat(analysisService.defaultSearchQuoteAnalyzer().analyzer(), instanceOf(StandardAnalyzer.class));
97+
}
98+
99+
public void testOverrideDefaultSearchAnalyzer() {
100+
Version version = VersionUtils.randomVersion(getRandom());
101+
Settings settings = Settings.builder().put(IndexMetaData.SETTING_VERSION_CREATED, version).build();
102+
IndicesAnalysisService indicesAnalysisService = new IndicesAnalysisService(settings);
103+
AnalysisService analysisService = new AnalysisService(new Index("index"), settings, indicesAnalysisService,
104+
Collections.singletonMap("default_search", analyzerProvider("default_search")),
105+
Collections.emptyMap(), Collections.emptyMap(), Collections.emptyMap());
106+
assertThat(analysisService.defaultIndexAnalyzer().analyzer(), instanceOf(StandardAnalyzer.class));
107+
assertThat(analysisService.defaultSearchAnalyzer().analyzer(), instanceOf(EnglishAnalyzer.class));
108+
assertThat(analysisService.defaultSearchQuoteAnalyzer().analyzer(), instanceOf(EnglishAnalyzer.class));
109+
}
110+
111+
public void testBackCompatOverrideDefaultIndexAndSearchAnalyzer() {
112+
Version version = VersionUtils.randomVersionBetween(getRandom(), VersionUtils.getFirstVersion(), VersionUtils.getPreviousVersion(Version.V_3_0_0));
113+
Settings settings = Settings.builder().put(IndexMetaData.SETTING_VERSION_CREATED, version).build();
114+
IndicesAnalysisService indicesAnalysisService = new IndicesAnalysisService(settings);
115+
Map<String, AnalyzerProviderFactory> analyzers = new HashMap<>();
116+
analyzers.put("default_index", analyzerProvider("default_index"));
117+
analyzers.put("default_search", analyzerProvider("default_search"));
118+
AnalysisService analysisService = new AnalysisService(new Index("index"), settings, indicesAnalysisService,
119+
analyzers, Collections.emptyMap(), Collections.emptyMap(), Collections.emptyMap());
120+
assertThat(analysisService.defaultIndexAnalyzer().analyzer(), instanceOf(EnglishAnalyzer.class));
121+
assertThat(analysisService.defaultSearchAnalyzer().analyzer(), instanceOf(EnglishAnalyzer.class));
122+
assertThat(analysisService.defaultSearchQuoteAnalyzer().analyzer(), instanceOf(EnglishAnalyzer.class));
123+
}
124+
}

core/src/test/java/org/elasticsearch/index/query/AbstractQueryTestCase.java

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020
package org.elasticsearch.index.query;
2121

2222
import com.carrotsearch.randomizedtesting.generators.CodepointSetGenerator;
23+
import com.fasterxml.jackson.core.io.JsonStringEncoder;
2324

2425
import org.apache.lucene.search.Query;
2526
import org.elasticsearch.Version;
@@ -552,7 +553,13 @@ protected static Object getRandomValueForFieldName(String fieldName) {
552553
Object value;
553554
switch (fieldName) {
554555
case STRING_FIELD_NAME:
555-
value = rarely() ? randomUnicodeOfLength(10) : randomAsciiOfLengthBetween(1, 10); // unicode in 10% cases
556+
if (rarely()) {
557+
// unicode in 10% cases
558+
JsonStringEncoder encoder = JsonStringEncoder.getInstance();
559+
value = new String(encoder.quoteAsString(randomUnicodeOfLength(10)));
560+
} else {
561+
value = randomAsciiOfLengthBetween(1, 10);
562+
}
556563
break;
557564
case INT_FIELD_NAME:
558565
value = randomIntBetween(0, 10);

core/src/test/java/org/elasticsearch/index/query/AbstractTermQueryTestCase.java

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,8 @@
1919

2020
package org.elasticsearch.index.query;
2121

22+
import com.fasterxml.jackson.core.io.JsonStringEncoder;
23+
2224
import org.junit.Test;
2325

2426
import java.util.HashMap;
@@ -45,7 +47,8 @@ protected final QB doCreateTestQueryBuilder() {
4547
value = randomAsciiOfLengthBetween(1, 10);
4648
} else {
4749
// generate unicode string in 10% of cases
48-
value = randomUnicodeOfLength(10);
50+
JsonStringEncoder encoder = JsonStringEncoder.getInstance();
51+
value = new String(encoder.quoteAsString(randomUnicodeOfLength(10)));
4952
}
5053
break;
5154
case 2:
@@ -99,7 +102,13 @@ protected Map<String, QB> getAlternateVersions() {
99102
QB tempQuery = createTestQueryBuilder();
100103
QB testQuery = createQueryBuilder(tempQuery.fieldName(), tempQuery.value());
101104
boolean isString = testQuery.value() instanceof String;
102-
String value = (isString ? "\"" : "") + testQuery.value() + (isString ? "\"" : "");
105+
Object value;
106+
if (isString) {
107+
JsonStringEncoder encoder = JsonStringEncoder.getInstance();
108+
value = "\"" + new String(encoder.quoteAsString((String) testQuery.value())) + "\"";
109+
} else {
110+
value = testQuery.value();
111+
}
103112
String contentString = "{\n" +
104113
" \"" + testQuery.getName() + "\" : {\n" +
105114
" \"" + testQuery.fieldName() + "\" : " + value + "\n" +

docs/reference/analysis/analyzers.asciidoc

Lines changed: 15 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -23,10 +23,22 @@ defined, defaults are used. There is an option to define which analyzers
2323
will be used by default when none can be derived.
2424

2525
The `default` logical name allows one to configure an analyzer that will
26-
be used both for indexing and for searching APIs. The `default_index`
26+
be used both for indexing and for searching APIs. The `default_search`
2727
logical name can be used to configure a default analyzer that will be
28-
used just when indexing, and the `default_search` can be used to
29-
configure a default analyzer that will be used just when searching.
28+
used just when searching (the `default` analyzer would still be used for
29+
indexing).
30+
31+
For instance, the following settings could be used to perform exact matching
32+
only by default:
33+
34+
[source,js]
35+
--------------------------------------------------
36+
index :
37+
analysis :
38+
analyzer :
39+
default :
40+
tokenizer : keyword
41+
--------------------------------------------------
3042

3143
[float]
3244
[[aliasing-analyzers]]

docs/reference/migration/migrate_3_0.asciidoc

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -91,6 +91,12 @@ is needed then the `max_children` option shouldn't be defined at all on the `has
9191

9292
=== Settings changes ===
9393

94+
==== Analysis settings
95+
96+
The `index.analysis.analyzer.default_index` analyzer is not supported anymore.
97+
If you wish to change the analyzer to use for indexing, change the
98+
`index.analysis.analyzer.default` analyzer instead.
99+
94100
==== Ping timeout settings
95101

96102
Previously, there were three settings for the ping timeout: `discovery.zen.initial_ping_timeout`,

0 commit comments

Comments
 (0)