Skip to content

Commit 07f5fab

Browse files
committed
DATAES-71 - Enhance Create Index in ElasticsearchTemplate
added createIndex(indexName, settings) getSetting(indexName) getSetting(class) methods
1 parent 6a99d35 commit 07f5fab

File tree

3 files changed

+112
-8
lines changed

3 files changed

+112
-8
lines changed

src/main/java/org/springframework/data/elasticsearch/core/ElasticsearchOperations.java

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717

1818
import java.util.LinkedList;
1919
import java.util.List;
20+
import java.util.Map;
2021
import java.util.Set;
2122

2223
import org.elasticsearch.action.update.UpdateResponse;
@@ -52,6 +53,13 @@ public interface ElasticsearchOperations {
5253
*/
5354
boolean createIndex(String indexName);
5455

56+
/**
57+
* Create an index for given indexName and Settings
58+
*
59+
* @param indexName
60+
* @param settings
61+
*/
62+
boolean createIndex(String indexName, Object settings);
5563

5664
/**
5765
* Create mapping for a class
@@ -61,6 +69,21 @@ public interface ElasticsearchOperations {
6169
*/
6270
<T> boolean putMapping(Class<T> clazz);
6371

72+
/**
73+
* Get settings for a given indexName
74+
*
75+
* @param indexName
76+
*/
77+
Map getSetting(String indexName);
78+
79+
/**
80+
* Get settings for a given class
81+
*
82+
* @param clazz
83+
*/
84+
<T> Map getSetting(Class<T> clazz);
85+
86+
6487
/**
6588
* Execute the query against elasticsearch and return the first returned object
6689
*

src/main/java/org/springframework/data/elasticsearch/core/ElasticsearchTemplate.java

Lines changed: 31 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -30,9 +30,11 @@
3030
import org.apache.commons.collections.CollectionUtils;
3131
import org.elasticsearch.action.admin.cluster.state.ClusterStateRequest;
3232
import org.elasticsearch.action.admin.indices.alias.IndicesAliasesRequestBuilder;
33+
import org.elasticsearch.action.admin.indices.create.CreateIndexRequestBuilder;
3334
import org.elasticsearch.action.admin.indices.delete.DeleteIndexRequest;
3435
import org.elasticsearch.action.admin.indices.mapping.delete.DeleteMappingRequest;
3536
import org.elasticsearch.action.admin.indices.mapping.put.PutMappingRequestBuilder;
37+
import org.elasticsearch.action.admin.indices.settings.get.GetSettingsRequest;
3638
import org.elasticsearch.action.bulk.BulkItemResponse;
3739
import org.elasticsearch.action.bulk.BulkRequestBuilder;
3840
import org.elasticsearch.action.bulk.BulkResponse;
@@ -377,6 +379,7 @@ public <T> boolean deleteIndex(Class<T> clazz) {
377379

378380
@Override
379381
public boolean deleteIndex(String indexName) {
382+
Assert.notNull(indexName, "No index defined for delete operation");
380383
if (indexExists(indexName)) {
381384
return client.admin().indices().delete(new DeleteIndexRequest(indexName)).actionGet().isAcknowledged();
382385
}
@@ -551,19 +554,42 @@ private <T> boolean createIndexIfNotCreated(Class<T> clazz) {
551554
}
552555

553556
private <T> boolean createIndexWithSettings(Class<T> clazz) {
554-
ElasticsearchPersistentEntity<T> persistentEntity = getPersistentEntityFor(clazz);
555-
return client.admin().indices()
556-
.create(Requests.createIndexRequest(persistentEntity.getIndexName()).settings(getSettings(persistentEntity)))
557-
.actionGet().isAcknowledged();
557+
return createIndex(getPersistentEntityFor(clazz).getIndexName(), getDefaultSettings(getPersistentEntityFor(clazz)));
558+
}
559+
560+
561+
@Override
562+
public boolean createIndex(String indexName, Object settings) {
563+
CreateIndexRequestBuilder createIndexRequestBuilder = client.admin().indices().prepareCreate(indexName);
564+
if (settings instanceof String) {
565+
createIndexRequestBuilder.setSettings(String.valueOf(settings));
566+
} else if (settings instanceof Map) {
567+
createIndexRequestBuilder.setSettings((Map) settings);
568+
} else if (settings instanceof XContentBuilder) {
569+
createIndexRequestBuilder.setSettings((XContentBuilder) settings);
570+
}
571+
return createIndexRequestBuilder.execute().actionGet().isAcknowledged();
558572
}
559573

560-
private <T> Map getSettings(ElasticsearchPersistentEntity<T> persistentEntity) {
574+
private <T> Map getDefaultSettings(ElasticsearchPersistentEntity<T> persistentEntity) {
561575
return new MapBuilder<String, String>().put("index.number_of_shards", String.valueOf(persistentEntity.getShards()))
562576
.put("index.number_of_replicas", String.valueOf(persistentEntity.getReplicas()))
563577
.put("index.refresh_interval", persistentEntity.getRefreshInterval())
564578
.put("index.store.type", persistentEntity.getIndexStoreType()).map();
565579
}
566580

581+
@Override
582+
public <T> Map getSetting(Class<T> clazz) {
583+
return getSetting(getPersistentEntityFor(clazz).getIndexName());
584+
}
585+
586+
@Override
587+
public Map getSetting(String indexName) {
588+
Assert.notNull(indexName, "No index defined for getSettings");
589+
return client.admin().indices().getSettings(new GetSettingsRequest())
590+
.actionGet().getIndexToSettings().get(indexName).getAsMap();
591+
}
592+
567593
private <T> SearchRequestBuilder prepareSearch(Query query, Class<T> clazz) {
568594
if (query.getIndices().isEmpty()) {
569595
query.addIndices(retrieveIndexNameFromPersistentEntity(clazz));

src/test/java/org/springframework/data/elasticsearch/core/ElasticsearchTemplateTests.java

Lines changed: 58 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1264,7 +1264,7 @@ private void cleanUpIndices() {
12641264

12651265
/*
12661266
DATAES-71
1267-
*/
1267+
*/
12681268
@Test
12691269
public void shouldCreatedIndexWithSpecifiedIndexName() {
12701270
// given
@@ -1277,7 +1277,7 @@ public void shouldCreatedIndexWithSpecifiedIndexName() {
12771277

12781278
/*
12791279
DATAES-72
1280-
*/
1280+
*/
12811281
@Test
12821282
public void shouldDeleteIndexForSpecifiedIndexName() {
12831283
// given
@@ -1331,7 +1331,7 @@ public void shouldReturnCountForGivenSearchQueryWithGivenIndexNameForSpecificInd
13311331

13321332
/*
13331333
DATAES-67
1334-
*/
1334+
*/
13351335
@Test(expected = IllegalArgumentException.class)
13361336
public void shouldThrowAnExceptionWhenNoIndexSpecifiedForCountQuery() {
13371337
// given
@@ -1351,6 +1351,61 @@ public void shouldThrowAnExceptionWhenNoIndexSpecifiedForCountQuery() {
13511351
assertThat(count, is(equalTo(1L)));
13521352
}
13531353

1354+
/*
1355+
DATAES-71
1356+
*/
1357+
@Test
1358+
public void shouldCreateIndexWithGivenSettings() {
1359+
// given
1360+
String settings =
1361+
"{ " +
1362+
"\"settings\" : { " +
1363+
"\"index\": { " +
1364+
"\"analysis\" :{ " +
1365+
"\"analyzer\": { " +
1366+
"\"email-analyzer\": { " +
1367+
"\"type\" : \"custom\"," +
1368+
"\"tokenizer\" : \"uax_url_email\"," +
1369+
"\"filter\" : [\"standard\", \"lowercase\", \"stop\"]\n" +
1370+
"}\n" +
1371+
"}\n" +
1372+
"}\n" +
1373+
"}\n" +
1374+
"}\n" +
1375+
"}";
1376+
elasticsearchTemplate.deleteIndex("test-index");
1377+
// when
1378+
elasticsearchTemplate.createIndex("test-index", settings);
1379+
// then
1380+
Map map = elasticsearchTemplate.getSetting("test-index");
1381+
boolean hasAnalyzer = map.containsKey("index.settings.index.analysis.analyzer.email-analyzer.tokenizer");
1382+
String emailAnalyzer = (String) map.get("index.settings.index.analysis.analyzer.email-analyzer.tokenizer");
1383+
assertThat(elasticsearchTemplate.indexExists("test-index"), is(true));
1384+
assertThat(hasAnalyzer, is(true));
1385+
assertThat(emailAnalyzer, is("uax_url_email"));
1386+
}
1387+
1388+
/*
1389+
DATAES-71
1390+
*/
1391+
@Test
1392+
public void shouldCreateGivenSettingsForGivenIndex() {
1393+
//given
1394+
//delete , create and apply mapping in before method
1395+
1396+
// then
1397+
Map map = elasticsearchTemplate.getSetting(SampleEntity.class);
1398+
assertThat(elasticsearchTemplate.indexExists("test-index"), is(true));
1399+
assertThat(map.containsKey("index.refresh_interval"), is(true));
1400+
assertThat(map.containsKey("index.number_of_replicas"), is(true));
1401+
assertThat(map.containsKey("index.number_of_shards"), is(true));
1402+
assertThat(map.containsKey("index.store.type"), is(true));
1403+
assertThat((String) map.get("index.refresh_interval"), is("-1"));
1404+
assertThat((String) map.get("index.number_of_replicas"), is("0"));
1405+
assertThat((String) map.get("index.number_of_shards"), is("1"));
1406+
assertThat((String) map.get("index.store.type"), is("memory"));
1407+
}
1408+
13541409
private IndexQuery getIndexQuery(SampleEntity sampleEntity) {
13551410
return new IndexQueryBuilder().withId(sampleEntity.getId()).withObject(sampleEntity).build();
13561411
}

0 commit comments

Comments
 (0)