From 07f5fab022ab92dc7b00971adc61408b288039ce Mon Sep 17 00:00:00 2001 From: Mohsin Husen Date: Sat, 22 Mar 2014 19:27:38 +0000 Subject: [PATCH] DATAES-71 - Enhance Create Index in ElasticsearchTemplate added createIndex(indexName, settings) getSetting(indexName) getSetting(class) methods --- .../core/ElasticsearchOperations.java | 23 +++++++ .../core/ElasticsearchTemplate.java | 36 +++++++++-- .../core/ElasticsearchTemplateTests.java | 61 ++++++++++++++++++- 3 files changed, 112 insertions(+), 8 deletions(-) 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 e19091292..b961795c2 100755 --- a/src/main/java/org/springframework/data/elasticsearch/core/ElasticsearchOperations.java +++ b/src/main/java/org/springframework/data/elasticsearch/core/ElasticsearchOperations.java @@ -17,6 +17,7 @@ package org.springframework.data.elasticsearch.core; import java.util.LinkedList; import java.util.List; +import java.util.Map; import java.util.Set; import org.elasticsearch.action.update.UpdateResponse; @@ -52,6 +53,13 @@ public interface ElasticsearchOperations { */ boolean createIndex(String indexName); + /** + * Create an index for given indexName and Settings + * + * @param indexName + * @param settings + */ + boolean createIndex(String indexName, Object settings); /** * Create mapping for a class @@ -61,6 +69,21 @@ public interface ElasticsearchOperations { */ boolean putMapping(Class clazz); + /** + * Get settings for a given indexName + * + * @param indexName + */ + Map getSetting(String indexName); + + /** + * Get settings for a given class + * + * @param clazz + */ + Map getSetting(Class clazz); + + /** * Execute the query against elasticsearch and return the first returned object * 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 8a4a49e14..b0c08dd29 100755 --- a/src/main/java/org/springframework/data/elasticsearch/core/ElasticsearchTemplate.java +++ b/src/main/java/org/springframework/data/elasticsearch/core/ElasticsearchTemplate.java @@ -30,9 +30,11 @@ import java.util.*; import org.apache.commons.collections.CollectionUtils; import org.elasticsearch.action.admin.cluster.state.ClusterStateRequest; import org.elasticsearch.action.admin.indices.alias.IndicesAliasesRequestBuilder; +import org.elasticsearch.action.admin.indices.create.CreateIndexRequestBuilder; import org.elasticsearch.action.admin.indices.delete.DeleteIndexRequest; import org.elasticsearch.action.admin.indices.mapping.delete.DeleteMappingRequest; import org.elasticsearch.action.admin.indices.mapping.put.PutMappingRequestBuilder; +import org.elasticsearch.action.admin.indices.settings.get.GetSettingsRequest; import org.elasticsearch.action.bulk.BulkItemResponse; import org.elasticsearch.action.bulk.BulkRequestBuilder; import org.elasticsearch.action.bulk.BulkResponse; @@ -377,6 +379,7 @@ public class ElasticsearchTemplate implements ElasticsearchOperations { @Override public boolean deleteIndex(String indexName) { + Assert.notNull(indexName, "No index defined for delete operation"); if (indexExists(indexName)) { return client.admin().indices().delete(new DeleteIndexRequest(indexName)).actionGet().isAcknowledged(); } @@ -551,19 +554,42 @@ public class ElasticsearchTemplate implements ElasticsearchOperations { } private boolean createIndexWithSettings(Class clazz) { - ElasticsearchPersistentEntity persistentEntity = getPersistentEntityFor(clazz); - return client.admin().indices() - .create(Requests.createIndexRequest(persistentEntity.getIndexName()).settings(getSettings(persistentEntity))) - .actionGet().isAcknowledged(); + return createIndex(getPersistentEntityFor(clazz).getIndexName(), getDefaultSettings(getPersistentEntityFor(clazz))); } - private Map getSettings(ElasticsearchPersistentEntity persistentEntity) { + + @Override + public boolean createIndex(String indexName, Object settings) { + CreateIndexRequestBuilder createIndexRequestBuilder = client.admin().indices().prepareCreate(indexName); + if (settings instanceof String) { + createIndexRequestBuilder.setSettings(String.valueOf(settings)); + } else if (settings instanceof Map) { + createIndexRequestBuilder.setSettings((Map) settings); + } else if (settings instanceof XContentBuilder) { + createIndexRequestBuilder.setSettings((XContentBuilder) settings); + } + return createIndexRequestBuilder.execute().actionGet().isAcknowledged(); + } + + private Map getDefaultSettings(ElasticsearchPersistentEntity persistentEntity) { return new MapBuilder().put("index.number_of_shards", String.valueOf(persistentEntity.getShards())) .put("index.number_of_replicas", String.valueOf(persistentEntity.getReplicas())) .put("index.refresh_interval", persistentEntity.getRefreshInterval()) .put("index.store.type", persistentEntity.getIndexStoreType()).map(); } + @Override + public Map getSetting(Class clazz) { + return getSetting(getPersistentEntityFor(clazz).getIndexName()); + } + + @Override + public Map getSetting(String indexName) { + Assert.notNull(indexName, "No index defined for getSettings"); + return client.admin().indices().getSettings(new GetSettingsRequest()) + .actionGet().getIndexToSettings().get(indexName).getAsMap(); + } + private SearchRequestBuilder prepareSearch(Query query, Class clazz) { if (query.getIndices().isEmpty()) { query.addIndices(retrieveIndexNameFromPersistentEntity(clazz)); diff --git a/src/test/java/org/springframework/data/elasticsearch/core/ElasticsearchTemplateTests.java b/src/test/java/org/springframework/data/elasticsearch/core/ElasticsearchTemplateTests.java index 1b2e138e5..07a8a7d09 100755 --- a/src/test/java/org/springframework/data/elasticsearch/core/ElasticsearchTemplateTests.java +++ b/src/test/java/org/springframework/data/elasticsearch/core/ElasticsearchTemplateTests.java @@ -1264,7 +1264,7 @@ public class ElasticsearchTemplateTests { /* DATAES-71 - */ + */ @Test public void shouldCreatedIndexWithSpecifiedIndexName() { // given @@ -1277,7 +1277,7 @@ public class ElasticsearchTemplateTests { /* DATAES-72 - */ + */ @Test public void shouldDeleteIndexForSpecifiedIndexName() { // given @@ -1331,7 +1331,7 @@ public class ElasticsearchTemplateTests { /* DATAES-67 - */ + */ @Test(expected = IllegalArgumentException.class) public void shouldThrowAnExceptionWhenNoIndexSpecifiedForCountQuery() { // given @@ -1351,6 +1351,61 @@ public class ElasticsearchTemplateTests { assertThat(count, is(equalTo(1L))); } + /* + DATAES-71 + */ + @Test + public void shouldCreateIndexWithGivenSettings() { + // given + String settings = + "{ " + + "\"settings\" : { " + + "\"index\": { " + + "\"analysis\" :{ " + + "\"analyzer\": { " + + "\"email-analyzer\": { " + + "\"type\" : \"custom\"," + + "\"tokenizer\" : \"uax_url_email\"," + + "\"filter\" : [\"standard\", \"lowercase\", \"stop\"]\n" + + "}\n" + + "}\n" + + "}\n" + + "}\n" + + "}\n" + + "}"; + elasticsearchTemplate.deleteIndex("test-index"); + // when + elasticsearchTemplate.createIndex("test-index", settings); + // then + Map map = elasticsearchTemplate.getSetting("test-index"); + boolean hasAnalyzer = map.containsKey("index.settings.index.analysis.analyzer.email-analyzer.tokenizer"); + String emailAnalyzer = (String) map.get("index.settings.index.analysis.analyzer.email-analyzer.tokenizer"); + assertThat(elasticsearchTemplate.indexExists("test-index"), is(true)); + assertThat(hasAnalyzer, is(true)); + assertThat(emailAnalyzer, is("uax_url_email")); + } + + /* + DATAES-71 + */ + @Test + public void shouldCreateGivenSettingsForGivenIndex() { + //given + //delete , create and apply mapping in before method + + // then + Map map = elasticsearchTemplate.getSetting(SampleEntity.class); + assertThat(elasticsearchTemplate.indexExists("test-index"), is(true)); + assertThat(map.containsKey("index.refresh_interval"), is(true)); + assertThat(map.containsKey("index.number_of_replicas"), is(true)); + assertThat(map.containsKey("index.number_of_shards"), is(true)); + assertThat(map.containsKey("index.store.type"), is(true)); + assertThat((String) map.get("index.refresh_interval"), is("-1")); + assertThat((String) map.get("index.number_of_replicas"), is("0")); + assertThat((String) map.get("index.number_of_shards"), is("1")); + assertThat((String) map.get("index.store.type"), is("memory")); + } + private IndexQuery getIndexQuery(SampleEntity sampleEntity) { return new IndexQueryBuilder().withId(sampleEntity.getId()).withObject(sampleEntity).build(); }