Skip to content

Instantly share code, notes, and snippets.

@EikeDehling
Created April 1, 2015 08:43
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save EikeDehling/2e34a78a54de646b71ca to your computer and use it in GitHub Desktop.
Save EikeDehling/2e34a78a54de646b71ca to your computer and use it in GitHub Desktop.
--- a/src/main/java/org/elasticsearch/index/mapper/core/AbstractFieldMapper.java
+++ b/src/main/java/org/elasticsearch/index/mapper/core/AbstractFieldMapper.java
@@ -24,7 +24,6 @@ import com.carrotsearch.hppc.cursors.ObjectCursor;
import com.carrotsearch.hppc.cursors.ObjectObjectCursor;
import com.google.common.base.Objects;
import com.google.common.collect.ImmutableList;
-
import org.apache.lucene.analysis.Analyzer;
import org.apache.lucene.document.Field;
import org.apache.lucene.document.FieldType;
@@ -763,10 +762,17 @@ public abstract class AbstractFieldMapper<T> implements FieldMapper<T> {
builder.field("similarity", SimilarityLookupService.DEFAULT_SIMILARITY);
}
+ TreeMap<String, Object> orderedFielddataSettings = new TreeMap<String, Object>(new Comparator<String>() {
+ public int compare(String o1, String o2) {
+ return o1.toLowerCase().compareTo(o2.toLowerCase());
+ }
+ });
if (customFieldDataSettings != null) {
- builder.field("fielddata", (Map) customFieldDataSettings.getAsMap());
+ orderedFielddataSettings.putAll(customFieldDataSettings.getAsMap());
+ builder.field("fielddata", orderedFielddataSettings);
} else if (includeDefaults) {
- builder.field("fielddata", (Map) fieldDataType.getSettings().getAsMap());
+ orderedFielddataSettings.putAll((Map) fieldDataType.getSettings().getAsMap());
+ builder.field("fielddata", orderedFielddataSettings);
}
multiFields.toXContent(builder, params);
diff --git a/src/test/java/org/elasticsearch/index/mapper/multifield/MultiFieldTests.java b/src/test/java/org/elasticsearch/index/mapper/multifield/MultiFieldTests.java
index 7f4366d..5dc32d3 100644
--- a/src/test/java/org/elasticsearch/index/mapper/multifield/MultiFieldTests.java
+++ b/src/test/java/org/elasticsearch/index/mapper/multifield/MultiFieldTests.java
@@ -445,4 +445,37 @@ public class MultiFieldTests extends ElasticsearchSingleNodeTest {
assertThat(field, equalTo(multiFieldNames[i++]));
}
}
+
+ @Test
+ @SuppressWarnings("unchecked")
+ // The fielddata settings need to be in consistent order, else unneccesary mapping sync's can be triggered
+ public void testMultiFieldsFieldDataSettingsInConsistentOrder() throws Exception {
+ final String MY_MULTI_FIELD = "multi_field";
+
+ // Generate a mapping with (un-/wrong-)ordered fielddata settings
+ XContentBuilder builder = jsonBuilder().startObject().startObject("type").startObject("properties")
+ .startObject("my_field").field("type", "string").startObject("fields").startObject(MY_MULTI_FIELD)
+ .field("type", "string").startObject("fielddata").field("filter.frequency.min", 2)
+ .field("filter.frequency.max", 2).field("filter.regex.pattern", ".*").endObject().endObject()
+ .endObject().endObject().endObject().endObject().endObject();
+
+ String mapping = builder.string();
+ DocumentMapper docMapper = createIndex("test").mapperService().documentMapperParser().parse(mapping);
+
+ // Extract the fielddata settings of our field from the mapping
+ Map<String, Object> sourceAsMap = XContentHelper.convertToMap(docMapper.mappingSource().compressed(), true).v2();
+ Map<String, Object> fieldDataSettings = (Map<String, Object>)
+ XContentMapValues.extractValue("type.properties.my_field.fields." + MY_MULTI_FIELD + ".fielddata", sourceAsMap);
+
+ // Extract/sort the keys of field data settings
+ String[] expectedKeys = fieldDataSettings.keySet().toArray(new String[]{});
+ Arrays.sort(expectedKeys);
+
+ // The keySet of fieldDataSettings is in order of data that was in the XContent object,
+ // so we expect the keySet to be ordered just as our sorted array
+ int i = 0;
+ for (String key : fieldDataSettings.keySet()) {
+ assertThat(key, equalTo(expectedKeys[i++]));
+ }
+ }
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment