DATAES-52 - Implement elastic search get and multi get with routing support

This commit is contained in:
Ryan Murfitt 2014-02-11 19:52:59 +10:00 committed by Mohsin Husen
parent eafdbed68e
commit dd0ce8a947
3 changed files with 115 additions and 3 deletions

View File

@ -15,6 +15,8 @@
*/ */
package org.springframework.data.elasticsearch.core; package org.springframework.data.elasticsearch.core;
import java.util.Collection;
import java.util.LinkedList;
import java.util.List; import java.util.List;
import java.util.Set; import java.util.Set;
@ -181,7 +183,27 @@ public interface ElasticsearchOperations {
*/ */
<T> long count(SearchQuery query, Class<T> clazz); <T> long count(SearchQuery query, Class<T> clazz);
/** /**
* Execute a multiget against elasticsearch for the given ids
*
* @param ids
* @param route
* @param clazz
* @return
*/
<T> LinkedList<T> getObjects(Collection<String> ids, String route, Class<T> clazz);
/**
* Execute a get against elasticsearch for the given id
*
* @param id
* @param route
* @param clazz
* @return
*/
<T> T getObject(String id, String route, Class<T> clazz);
/**
* Index an object. Will do save or update * Index an object. Will do save or update
* *
* @param query * @param query

View File

@ -37,7 +37,7 @@ import org.elasticsearch.action.bulk.BulkItemResponse;
import org.elasticsearch.action.bulk.BulkRequestBuilder; import org.elasticsearch.action.bulk.BulkRequestBuilder;
import org.elasticsearch.action.bulk.BulkResponse; import org.elasticsearch.action.bulk.BulkResponse;
import org.elasticsearch.action.count.CountRequestBuilder; import org.elasticsearch.action.count.CountRequestBuilder;
import org.elasticsearch.action.get.GetResponse; import org.elasticsearch.action.get.*;
import org.elasticsearch.action.index.IndexRequestBuilder; import org.elasticsearch.action.index.IndexRequestBuilder;
import org.elasticsearch.action.mlt.MoreLikeThisRequestBuilder; import org.elasticsearch.action.mlt.MoreLikeThisRequestBuilder;
import org.elasticsearch.action.search.SearchRequestBuilder; import org.elasticsearch.action.search.SearchRequestBuilder;
@ -246,7 +246,36 @@ public class ElasticsearchTemplate implements ElasticsearchOperations {
return countRequestBuilder.execute().actionGet().getCount(); return countRequestBuilder.execute().actionGet().getCount();
} }
@Override @Override
public <T> LinkedList<T> getObjects(Collection<String> ids, String route, Class<T> clazz) {
ElasticsearchPersistentEntity<T> persistentEntity = getPersistentEntityFor(clazz);
MultiGetRequestBuilder builder = client.prepareMultiGet();
for (String id : ids) {
builder.add(new MultiGetRequest.Item(persistentEntity.getIndexName(), persistentEntity.getIndexType(), id).routing(route));
}
MultiGetResponse responses = builder.execute().actionGet();
final LinkedList<T> result = new LinkedList<T>();
for (MultiGetItemResponse response : responses.getResponses()) {
if (!response.isFailed() && response.getResponse().isExists()) {
result.add(resultsMapper.mapResult(response.getResponse(), clazz));
}
}
return result;
}
@Override
public <T> T getObject(String id, String route, Class<T> clazz) {
if (id != null) {
ElasticsearchPersistentEntity<T> persistentEntity = getPersistentEntityFor(clazz);
GetResponse response = client
.prepareGet(persistentEntity.getIndexName(), persistentEntity.getIndexType(), id).setRouting(route)
.execute().actionGet();
return resultsMapper.mapResult(response, clazz);
}
return null;
}
@Override
public String index(IndexQuery query) { public String index(IndexQuery query) {
String documentId = prepareIndex(query).execute().actionGet().getId(); String documentId = prepareIndex(query).execute().actionGet().getId();
// We should call this because we are not going through a mapper. // We should call this because we are not going through a mapper.

View File

@ -112,6 +112,67 @@ public class ElasticsearchTemplateTests {
assertEquals(sampleEntity, sampleEntity1); assertEquals(sampleEntity, sampleEntity1);
} }
@Test
public void shouldReturnObjectForGivenIdUsingGet() {
// given
String documentId = randomNumeric(5);
SampleEntity sampleEntity = new SampleEntity();
sampleEntity.setId(documentId);
sampleEntity.setMessage("some message");
sampleEntity.setVersion(System.currentTimeMillis());
IndexQuery indexQuery = new IndexQuery();
indexQuery.setId(documentId);
indexQuery.setObject(sampleEntity);
elasticsearchTemplate.index(indexQuery);
// when
SampleEntity sampleEntity1 = elasticsearchTemplate.getObject(documentId, "", SampleEntity.class);
// then
assertNotNull("not null....", sampleEntity1);
assertEquals(sampleEntity, sampleEntity1);
}
@Test
public void shouldReturnObjectsForGivenIdsUsingMultiGet() {
// given
List<IndexQuery> indexQueries = new ArrayList<IndexQuery>();
// first document
String documentId = randomNumeric(5);
SampleEntity sampleEntity1 = new SampleEntity();
sampleEntity1.setId(documentId);
sampleEntity1.setMessage("some message");
sampleEntity1.setVersion(System.currentTimeMillis());
IndexQuery indexQuery1 = new IndexQuery();
indexQuery1.setId(documentId);
indexQuery1.setObject(sampleEntity1);
indexQueries.add(indexQuery1);
// second document
String documentId2 = randomNumeric(5);
SampleEntity sampleEntity2 = new SampleEntity();
sampleEntity2.setId(documentId2);
sampleEntity2.setMessage("some message");
sampleEntity2.setVersion(System.currentTimeMillis());
IndexQuery indexQuery2 = new IndexQuery();
indexQuery2.setId(documentId2);
indexQuery2.setObject(sampleEntity2);
indexQueries.add(indexQuery2);
elasticsearchTemplate.bulkIndex(indexQueries);
elasticsearchTemplate.refresh(SampleEntity.class, true);
// when
LinkedList<SampleEntity> sampleEntities = elasticsearchTemplate.getObjects(Arrays.asList(documentId, documentId2), "", SampleEntity.class);
// then
assertThat(sampleEntities.size(), is(equalTo(2)));
assertEquals(sampleEntities.get(0), sampleEntity1);
assertEquals(sampleEntities.get(1), sampleEntity2);
}
@Test @Test
public void shouldReturnPageForGivenSearchQuery() { public void shouldReturnPageForGivenSearchQuery() {
// given // given