mirror of
https://github.com/spring-projects/spring-data-elasticsearch.git
synced 2025-06-22 20:12:11 +00:00
DATAES-52 - Implement elastic search get and multi get with routing support
This commit is contained in:
parent
eafdbed68e
commit
dd0ce8a947
@ -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
|
||||||
|
@ -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.
|
||||||
|
@ -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
|
||||||
|
Loading…
x
Reference in New Issue
Block a user