Skip to content

Commit b8fda58

Browse files
authored
Ensure that index_prefixes settings cannot be changed (#30967)
1 parent 11887fa commit b8fda58

File tree

3 files changed

+25
-40
lines changed

3 files changed

+25
-40
lines changed

server/src/main/java/org/elasticsearch/index/mapper/TextFieldMapper.java

Lines changed: 19 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -288,18 +288,6 @@ public String toString() {
288288
return super.toString() + ",prefixChars=" + minChars + ":" + maxChars;
289289
}
290290

291-
@Override
292-
public void checkCompatibility(MappedFieldType other, List<String> conflicts) {
293-
super.checkCompatibility(other, conflicts);
294-
PrefixFieldType otherFieldType = (PrefixFieldType) other;
295-
if (otherFieldType.minChars != this.minChars) {
296-
conflicts.add("mapper [" + name() + "] has different min_chars values");
297-
}
298-
if (otherFieldType.maxChars != this.maxChars) {
299-
conflicts.add("mapper [" + name() + "] has different max_chars values");
300-
}
301-
}
302-
303291
@Override
304292
public Query existsQuery(QueryShardContext context) {
305293
throw new UnsupportedOperationException();
@@ -479,6 +467,25 @@ public IndexFieldData.Builder fielddataBuilder(String fullyQualifiedIndexName) {
479467
}
480468
return new PagedBytesIndexFieldData.Builder(fielddataMinFrequency, fielddataMaxFrequency, fielddataMinSegmentSize);
481469
}
470+
471+
@Override
472+
public void checkCompatibility(MappedFieldType other, List<String> conflicts) {
473+
super.checkCompatibility(other, conflicts);
474+
TextFieldType tft = (TextFieldType) other;
475+
if (Objects.equals(this.prefixFieldType, tft.prefixFieldType) == false) {
476+
if (this.prefixFieldType == null) {
477+
conflicts.add("mapper [" + name()
478+
+ "] has different [index_prefixes] settings, cannot change from disabled to enabled");
479+
}
480+
else if (tft.prefixFieldType == null) {
481+
conflicts.add("mapper [" + name()
482+
+ "] has different [index_prefixes] settings, cannot change from enabled to disabled");
483+
}
484+
else {
485+
conflicts.add("mapper [" + name() + "] has different [index_prefixes] settings");
486+
}
487+
}
488+
}
482489
}
483490

484491
private int positionIncrementGap;

server/src/test/java/org/elasticsearch/index/mapper/TextFieldMapperTests.java

Lines changed: 0 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -734,25 +734,6 @@ public void testIndexPrefixMapping() throws IOException {
734734
Query q6 = mapper.mappers().getMapper("field").fieldType().prefixQuery("goings",
735735
CONSTANT_SCORE_REWRITE, queryShardContext);
736736
assertThat(q6, instanceOf(PrefixQuery.class));
737-
738-
indexService.mapperService().merge("type", json, MergeReason.MAPPING_UPDATE);
739-
740-
String badUpdate = Strings.toString(XContentFactory.jsonBuilder().startObject().startObject("type")
741-
.startObject("properties").startObject("field")
742-
.field("type", "text")
743-
.field("analyzer", "english")
744-
.startObject("index_prefixes")
745-
.field("min_chars", 1)
746-
.field("max_chars", 10)
747-
.endObject()
748-
.endObject().endObject()
749-
.endObject().endObject());
750-
751-
IllegalArgumentException e = expectThrows(IllegalArgumentException.class, () -> {
752-
indexService.mapperService()
753-
.merge("type", new CompressedXContent(badUpdate), MergeReason.MAPPING_UPDATE);
754-
});
755-
assertThat(e.getMessage(), containsString("mapper [field._index_prefix] has different min_chars values"));
756737
}
757738

758739
{

server/src/test/java/org/elasticsearch/index/mapper/TextFieldTypeTests.java

Lines changed: 6 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -18,23 +18,20 @@
1818
*/
1919
package org.elasticsearch.index.mapper;
2020

21-
import java.util.ArrayList;
22-
import java.util.Arrays;
23-
import java.util.List;
24-
25-
import org.apache.lucene.document.LongPoint;
2621
import org.apache.lucene.index.IndexOptions;
2722
import org.apache.lucene.index.Term;
28-
import org.apache.lucene.search.TermInSetQuery;
2923
import org.apache.lucene.search.FuzzyQuery;
3024
import org.apache.lucene.search.RegexpQuery;
25+
import org.apache.lucene.search.TermInSetQuery;
3126
import org.apache.lucene.search.TermQuery;
3227
import org.apache.lucene.util.BytesRef;
3328
import org.elasticsearch.common.unit.Fuzziness;
34-
import org.elasticsearch.index.mapper.MappedFieldType;
35-
import org.elasticsearch.index.mapper.TextFieldMapper;
3629
import org.junit.Before;
3730

31+
import java.util.ArrayList;
32+
import java.util.Arrays;
33+
import java.util.List;
34+
3835
public class TextFieldTypeTests extends FieldTypeTestCase {
3936
@Override
4037
protected MappedFieldType createDefaultFieldType() {
@@ -71,7 +68,7 @@ public void modify(MappedFieldType ft) {
7168
tft.setFielddataMinSegmentSize(1000);
7269
}
7370
});
74-
addModifier(new Modifier("index_prefixes", true) {
71+
addModifier(new Modifier("index_prefixes", false) {
7572
@Override
7673
public void modify(MappedFieldType ft) {
7774
TextFieldMapper.TextFieldType tft = (TextFieldMapper.TextFieldType)ft;

0 commit comments

Comments
 (0)