mirror of
https://github.com/spring-projects/spring-data-elasticsearch.git
synced 2025-06-29 15:22:11 +00:00
DATAES-70 - Alias creation with routing not supported
added routing parameters
This commit is contained in:
parent
3453f30a26
commit
9e97dec225
@ -19,6 +19,7 @@ import static org.apache.commons.collections.CollectionUtils.isNotEmpty;
|
|||||||
import static org.apache.commons.lang.StringUtils.*;
|
import static org.apache.commons.lang.StringUtils.*;
|
||||||
import static org.elasticsearch.action.search.SearchType.*;
|
import static org.elasticsearch.action.search.SearchType.*;
|
||||||
import static org.elasticsearch.client.Requests.*;
|
import static org.elasticsearch.client.Requests.*;
|
||||||
|
import static org.elasticsearch.cluster.metadata.AliasAction.Type.ADD;
|
||||||
import static org.elasticsearch.common.collect.Sets.*;
|
import static org.elasticsearch.common.collect.Sets.*;
|
||||||
import static org.elasticsearch.index.VersionType.*;
|
import static org.elasticsearch.index.VersionType.*;
|
||||||
import static org.springframework.data.elasticsearch.core.MappingBuilder.*;
|
import static org.springframework.data.elasticsearch.core.MappingBuilder.*;
|
||||||
@ -53,6 +54,7 @@ import org.elasticsearch.action.update.UpdateRequestBuilder;
|
|||||||
import org.elasticsearch.action.update.UpdateResponse;
|
import org.elasticsearch.action.update.UpdateResponse;
|
||||||
import org.elasticsearch.client.Client;
|
import org.elasticsearch.client.Client;
|
||||||
import org.elasticsearch.client.Requests;
|
import org.elasticsearch.client.Requests;
|
||||||
|
import org.elasticsearch.cluster.metadata.AliasAction;
|
||||||
import org.elasticsearch.cluster.metadata.MappingMetaData;
|
import org.elasticsearch.cluster.metadata.MappingMetaData;
|
||||||
import org.elasticsearch.common.collect.ImmutableOpenMap;
|
import org.elasticsearch.common.collect.ImmutableOpenMap;
|
||||||
import org.elasticsearch.common.collect.MapBuilder;
|
import org.elasticsearch.common.collect.MapBuilder;
|
||||||
@ -706,15 +708,19 @@ public class ElasticsearchTemplate implements ElasticsearchOperations {
|
|||||||
public Boolean addAlias(AliasQuery query) {
|
public Boolean addAlias(AliasQuery query) {
|
||||||
Assert.notNull(query.getIndexName(), "No index defined for Alias");
|
Assert.notNull(query.getIndexName(), "No index defined for Alias");
|
||||||
Assert.notNull(query.getAliasName(), "No alias defined");
|
Assert.notNull(query.getAliasName(), "No alias defined");
|
||||||
IndicesAliasesRequestBuilder indicesAliasesRequestBuilder = null;
|
AliasAction aliasAction = new AliasAction(ADD, query.getIndexName(), query.getAliasName());
|
||||||
if (query.getFilterBuilder() != null) {
|
if (query.getFilterBuilder() != null) {
|
||||||
indicesAliasesRequestBuilder = client.admin().indices().prepareAliases().addAlias(query.getIndexName(), query.getAliasName(), query.getFilterBuilder());
|
aliasAction.filter(query.getFilterBuilder());
|
||||||
} else if (query.getFilter() != null) {
|
} else if (query.getFilter() != null) {
|
||||||
indicesAliasesRequestBuilder = client.admin().indices().prepareAliases().addAlias(query.getIndexName(), query.getAliasName(), query.getFilter());
|
aliasAction.filter(query.getFilter());
|
||||||
} else {
|
} else if (isNotBlank(query.getRouting())) {
|
||||||
indicesAliasesRequestBuilder = client.admin().indices().prepareAliases().addAlias(query.getIndexName(), query.getAliasName());
|
aliasAction.routing(query.getRouting());
|
||||||
|
} else if (isNotBlank(query.getSearchRouting())) {
|
||||||
|
aliasAction.searchRouting(query.getSearchRouting());
|
||||||
|
} else if (isNotBlank(query.getIndexRouting())) {
|
||||||
|
aliasAction.indexRouting(query.getIndexRouting());
|
||||||
}
|
}
|
||||||
return indicesAliasesRequestBuilder.execute().actionGet().isAcknowledged();
|
return client.admin().indices().prepareAliases().addAliasAction(aliasAction).execute().actionGet().isAcknowledged();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright 2013 the original author or authors.
|
* Copyright 2013-2014 the original author or authors.
|
||||||
*
|
*
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
* you may not use this file except in compliance with the License.
|
* you may not use this file except in compliance with the License.
|
||||||
@ -28,6 +28,9 @@ public class AliasBuilder {
|
|||||||
private String aliasName;
|
private String aliasName;
|
||||||
private FilterBuilder filterBuilder;
|
private FilterBuilder filterBuilder;
|
||||||
private Map<String, Object> filter;
|
private Map<String, Object> filter;
|
||||||
|
private String searchRouting;
|
||||||
|
private String indexRouting;
|
||||||
|
private String routing;
|
||||||
|
|
||||||
public AliasBuilder withIndexName(String indexName) {
|
public AliasBuilder withIndexName(String indexName) {
|
||||||
this.indexName = indexName;
|
this.indexName = indexName;
|
||||||
@ -49,12 +52,30 @@ public class AliasBuilder {
|
|||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public AliasBuilder withSearchRouting(String searchRouting) {
|
||||||
|
this.searchRouting = searchRouting;
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public AliasBuilder withIndexRouting(String indexRouting) {
|
||||||
|
this.indexRouting = indexRouting;
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public AliasBuilder withRouting(String routing) {
|
||||||
|
this.routing = routing;
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
public AliasQuery build() {
|
public AliasQuery build() {
|
||||||
AliasQuery aliasQuery = new AliasQuery();
|
AliasQuery aliasQuery = new AliasQuery();
|
||||||
aliasQuery.setIndexName(indexName);
|
aliasQuery.setIndexName(indexName);
|
||||||
aliasQuery.setAliasName(aliasName);
|
aliasQuery.setAliasName(aliasName);
|
||||||
aliasQuery.setFilterBuilder(filterBuilder);
|
aliasQuery.setFilterBuilder(filterBuilder);
|
||||||
aliasQuery.setFilter(filter);
|
aliasQuery.setFilter(filter);
|
||||||
|
aliasQuery.setSearchRouting(searchRouting);
|
||||||
|
aliasQuery.setIndexRouting(indexRouting);
|
||||||
|
aliasQuery.setRouting(routing);
|
||||||
return aliasQuery;
|
return aliasQuery;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright 2013 the original author or authors.
|
* Copyright 2013-2014 the original author or authors.
|
||||||
*
|
*
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
* you may not use this file except in compliance with the License.
|
* you may not use this file except in compliance with the License.
|
||||||
@ -30,6 +30,9 @@ public class AliasQuery {
|
|||||||
private String aliasName;
|
private String aliasName;
|
||||||
private FilterBuilder filterBuilder;
|
private FilterBuilder filterBuilder;
|
||||||
private Map<String, Object> filter;
|
private Map<String, Object> filter;
|
||||||
|
private String searchRouting;
|
||||||
|
private String indexRouting;
|
||||||
|
private String routing;
|
||||||
|
|
||||||
public String getIndexName() {
|
public String getIndexName() {
|
||||||
return indexName;
|
return indexName;
|
||||||
@ -62,4 +65,28 @@ public class AliasQuery {
|
|||||||
public void setFilter(Map<String, Object> filter) {
|
public void setFilter(Map<String, Object> filter) {
|
||||||
this.filter = filter;
|
this.filter = filter;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public String getSearchRouting() {
|
||||||
|
return searchRouting;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setSearchRouting(String searchRouting) {
|
||||||
|
this.searchRouting = searchRouting;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getIndexRouting() {
|
||||||
|
return indexRouting;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setIndexRouting(String indexRouting) {
|
||||||
|
this.indexRouting = indexRouting;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getRouting() {
|
||||||
|
return routing;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setRouting(String routing) {
|
||||||
|
this.routing = routing;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -927,6 +927,104 @@ public class ElasticsearchTemplateTests {
|
|||||||
assertThat(aliases.size(), is(0));
|
assertThat(aliases.size(), is(0));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
DATAES-70
|
||||||
|
*/
|
||||||
|
@Test
|
||||||
|
public void shouldAddAliasWithGivenRoutingValue() {
|
||||||
|
//given
|
||||||
|
String indexName = INDEX_NAME;
|
||||||
|
String alias = "test-alias";
|
||||||
|
|
||||||
|
AliasQuery aliasQuery = new AliasBuilder()
|
||||||
|
.withIndexName(indexName)
|
||||||
|
.withAliasName(alias)
|
||||||
|
.withRouting("0").build();
|
||||||
|
|
||||||
|
//when
|
||||||
|
elasticsearchTemplate.addAlias(aliasQuery);
|
||||||
|
|
||||||
|
String documentId = randomNumeric(5);
|
||||||
|
SampleEntity sampleEntity = new SampleEntityBuilder(documentId)
|
||||||
|
.message("some message")
|
||||||
|
.version(System.currentTimeMillis()).build();
|
||||||
|
|
||||||
|
IndexQuery indexQuery = new IndexQueryBuilder()
|
||||||
|
.withIndexName(alias)
|
||||||
|
.withId(sampleEntity.getId())
|
||||||
|
.withObject(sampleEntity).build();
|
||||||
|
|
||||||
|
elasticsearchTemplate.index(indexQuery);
|
||||||
|
elasticsearchTemplate.refresh(SampleEntity.class, true);
|
||||||
|
|
||||||
|
SearchQuery query = new NativeSearchQueryBuilder().withQuery(matchAllQuery())
|
||||||
|
.withIndices(alias).build();
|
||||||
|
long count = elasticsearchTemplate.count(query, SampleEntity.class);
|
||||||
|
//then
|
||||||
|
Set<String> aliases = elasticsearchTemplate.queryForAlias(INDEX_NAME);
|
||||||
|
assertThat(aliases, is(notNullValue()));
|
||||||
|
assertThat(aliases.contains(alias), is(true));
|
||||||
|
assertThat(count, is(1L));
|
||||||
|
|
||||||
|
//cleanup
|
||||||
|
elasticsearchTemplate.removeAlias(aliasQuery);
|
||||||
|
elasticsearchTemplate.refresh(SampleEntity.class, true);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
DATAES-70
|
||||||
|
*/
|
||||||
|
@Test
|
||||||
|
public void shouldAddAliasForVariousRoutingValues() {
|
||||||
|
//given
|
||||||
|
String indexName = INDEX_NAME;
|
||||||
|
String alias1 = "test-alias-1";
|
||||||
|
String alias2 = "test-alias-2";
|
||||||
|
|
||||||
|
AliasQuery aliasQuery1 = new AliasBuilder()
|
||||||
|
.withIndexName(indexName)
|
||||||
|
.withAliasName(alias1)
|
||||||
|
.withIndexRouting("0").build();
|
||||||
|
|
||||||
|
AliasQuery aliasQuery2 = new AliasBuilder()
|
||||||
|
.withIndexName(indexName)
|
||||||
|
.withAliasName(alias2)
|
||||||
|
.withSearchRouting("1").build();
|
||||||
|
|
||||||
|
//when
|
||||||
|
elasticsearchTemplate.addAlias(aliasQuery1);
|
||||||
|
elasticsearchTemplate.addAlias(aliasQuery2);
|
||||||
|
|
||||||
|
String documentId = randomNumeric(5);
|
||||||
|
SampleEntity sampleEntity = new SampleEntityBuilder(documentId)
|
||||||
|
.message("some message")
|
||||||
|
.version(System.currentTimeMillis()).build();
|
||||||
|
|
||||||
|
IndexQuery indexQuery = new IndexQueryBuilder()
|
||||||
|
.withIndexName(alias1)
|
||||||
|
.withId(sampleEntity.getId())
|
||||||
|
.withObject(sampleEntity).build();
|
||||||
|
|
||||||
|
elasticsearchTemplate.index(indexQuery);
|
||||||
|
elasticsearchTemplate.refresh(SampleEntity.class, true);
|
||||||
|
|
||||||
|
SearchQuery query = new NativeSearchQueryBuilder().withQuery(matchAllQuery())
|
||||||
|
.withIndices(alias2).build();
|
||||||
|
long count = elasticsearchTemplate.count(query, SampleEntity.class);
|
||||||
|
// then
|
||||||
|
Set<String> aliases = elasticsearchTemplate.queryForAlias(INDEX_NAME);
|
||||||
|
assertThat(aliases, is(notNullValue()));
|
||||||
|
assertThat(aliases.contains(alias1), is(true));
|
||||||
|
assertThat(aliases.contains(alias2), is(true));
|
||||||
|
assertThat(count, is(0L));
|
||||||
|
|
||||||
|
//cleanup
|
||||||
|
elasticsearchTemplate.removeAlias(aliasQuery1);
|
||||||
|
elasticsearchTemplate.removeAlias(aliasQuery2);
|
||||||
|
elasticsearchTemplate.refresh(SampleEntity.class, true);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void shouldIndexDocumentForSpecifiedSource() {
|
public void shouldIndexDocumentForSpecifiedSource() {
|
||||||
@ -1402,7 +1500,7 @@ public class ElasticsearchTemplateTests {
|
|||||||
assertThat(map.containsKey("index.store.type"), is(true));
|
assertThat(map.containsKey("index.store.type"), is(true));
|
||||||
assertThat((String) map.get("index.refresh_interval"), is("-1"));
|
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_replicas"), is("0"));
|
||||||
assertThat((String) map.get("index.number_of_shards"), is("1"));
|
assertThat((String) map.get("index.number_of_shards"), is("2"));
|
||||||
assertThat((String) map.get("index.store.type"), is("memory"));
|
assertThat((String) map.get("index.store.type"), is("memory"));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -25,7 +25,7 @@ import org.springframework.data.elasticsearch.annotations.Document;
|
|||||||
* @author Rizwan Idrees
|
* @author Rizwan Idrees
|
||||||
* @author Mohsin Husen
|
* @author Mohsin Husen
|
||||||
*/
|
*/
|
||||||
@Document(indexName = "test-index", type = "test-type", indexStoreType = "memory", shards = 1, replicas = 0, refreshInterval = "-1")
|
@Document(indexName = "test-index", type = "test-type", indexStoreType = "memory", shards = 2, replicas = 0, refreshInterval = "-1")
|
||||||
public class SampleEntity {
|
public class SampleEntity {
|
||||||
|
|
||||||
@Id
|
@Id
|
||||||
|
Loading…
x
Reference in New Issue
Block a user