diff --git a/src/main/java/org/springframework/data/elasticsearch/core/ElasticsearchOperations.java b/src/main/java/org/springframework/data/elasticsearch/core/ElasticsearchOperations.java index 303025296..e2dce69f0 100755 --- a/src/main/java/org/springframework/data/elasticsearch/core/ElasticsearchOperations.java +++ b/src/main/java/org/springframework/data/elasticsearch/core/ElasticsearchOperations.java @@ -69,6 +69,24 @@ public interface ElasticsearchOperations { */ boolean putMapping(Class clazz); + /** + * Create mapping for a given indexName and type + * + * @param indexName + * @param type + * @param mappings + */ + boolean putMapping(String indexName, String type, Object mappings); + + /** + * Create mapping for a class + * + * @param clazz + * @param mappings + */ + boolean putMapping(Class clazz, Object mappings); + + /** * Get mapping for a class * diff --git a/src/main/java/org/springframework/data/elasticsearch/core/ElasticsearchTemplate.java b/src/main/java/org/springframework/data/elasticsearch/core/ElasticsearchTemplate.java index 4c5f8f320..dda614e68 100755 --- a/src/main/java/org/springframework/data/elasticsearch/core/ElasticsearchTemplate.java +++ b/src/main/java/org/springframework/data/elasticsearch/core/ElasticsearchTemplate.java @@ -139,16 +139,35 @@ public class ElasticsearchTemplate implements ElasticsearchOperations { @Override public boolean putMapping(Class clazz) { ElasticsearchPersistentEntity persistentEntity = getPersistentEntityFor(clazz); - PutMappingRequestBuilder requestBuilder = client.admin().indices() - .preparePutMapping(persistentEntity.getIndexName()).setType(persistentEntity.getIndexType()); - + XContentBuilder xContentBuilder = null; try { - XContentBuilder xContentBuilder = buildMapping(clazz, persistentEntity.getIndexType(), persistentEntity + xContentBuilder = buildMapping(clazz, persistentEntity.getIndexType(), persistentEntity .getIdProperty().getFieldName(), persistentEntity.getParentType()); - return requestBuilder.setSource(xContentBuilder).execute().actionGet().isAcknowledged(); } catch (Exception e) { throw new ElasticsearchException("Failed to build mapping for " + clazz.getSimpleName(), e); } + return putMapping(clazz, xContentBuilder); + } + + @Override + public boolean putMapping(Class clazz, Object mapping) { + return putMapping(getPersistentEntityFor(clazz).getIndexName(), getPersistentEntityFor(clazz).getIndexType(), mapping); + } + + @Override + public boolean putMapping(String indexName, String type, Object mapping) { + Assert.notNull(indexName, "No index defined for putMapping()"); + Assert.notNull(type, "No type defined for putMapping()"); + PutMappingRequestBuilder requestBuilder = client.admin().indices() + .preparePutMapping(indexName).setType(type); + if (mapping instanceof String) { + requestBuilder.setSource(String.valueOf(mapping)); + } else if (mapping instanceof Map) { + requestBuilder.setSource((Map) mapping); + } else if (mapping instanceof XContentBuilder) { + requestBuilder.setSource((XContentBuilder) mapping); + } + return requestBuilder.execute().actionGet().isAcknowledged(); } @Override diff --git a/src/test/java/org/springframework/data/elasticsearch/repositories/setting/SettingEntityRepositoryTest.java b/src/test/java/org/springframework/data/elasticsearch/repositories/setting/SettingEntityRepositoryTest.java index 069f18476..03f5746dc 100644 --- a/src/test/java/org/springframework/data/elasticsearch/repositories/setting/SettingEntityRepositoryTest.java +++ b/src/test/java/org/springframework/data/elasticsearch/repositories/setting/SettingEntityRepositoryTest.java @@ -123,4 +123,29 @@ public class SettingEntityRepositoryTest { assertThat(((String) ((Map) properties.get("email")).get("type")), is("string")); assertThat((String) ((Map)properties.get("email")).get("analyzer"), is("emailAnalyzer")); } + + @Test + public void shouldCreateMappingWithSpecifiedMappings() { + //given + elasticsearchTemplate.deleteIndex(SettingEntity.class); + elasticsearchTemplate.createIndex(SettingEntity.class); + elasticsearchTemplate.refresh(SettingEntity.class, true); + //when + String mappings = "{\n" + + " \"test-setting-type\" : {\n" + + " \"properties\" : {\n" + + " \"email\" : {\"type\" : \"string\", \"analyzer\" : \"emailAnalyzer\" }\n" + + " }\n" + + " }\n" + + "}"; + elasticsearchTemplate.putMapping(SettingEntity.class, mappings); + elasticsearchTemplate.refresh(SettingEntity.class, true); + //then + Map mapping = elasticsearchTemplate.getMapping(SettingEntity.class); + Map properties = (Map) mapping.get("properties"); + assertThat(mapping, is(notNullValue())); + assertThat(properties, is(notNullValue())); + assertThat(((String) ((Map) properties.get("email")).get("type")), is("string")); + assertThat((String) ((Map)properties.get("email")).get("analyzer"), is("emailAnalyzer")); + } }