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 1999239bb..61cf750ca 100644 --- a/src/main/java/org/springframework/data/elasticsearch/core/ElasticsearchTemplate.java +++ b/src/main/java/org/springframework/data/elasticsearch/core/ElasticsearchTemplate.java @@ -17,6 +17,7 @@ import org.elasticsearch.common.unit.TimeValue; import org.elasticsearch.index.query.FilterBuilder; import org.elasticsearch.index.query.QueryBuilder; import org.elasticsearch.search.SearchHit; +import org.elasticsearch.search.sort.SortBuilder; import org.elasticsearch.search.sort.SortOrder; import org.springframework.data.domain.Page; import org.springframework.data.domain.PageImpl; @@ -100,13 +101,13 @@ public class ElasticsearchTemplate implements ElasticsearchOperations { @Override public Page queryForPage(SearchQuery query, Class clazz) { - SearchResponse response = doSearch(prepareSearch(query,clazz), query.getElasticsearchQuery(), query.getElasticsearchFilter()); + SearchResponse response = doSearch(prepareSearch(query,clazz), query.getElasticsearchQuery(), query.getElasticsearchFilter(),query.getElasticsearchSort()); return mapResults(response, clazz, query.getPageable()); } public Page queryForPage(SearchQuery query, ResultsMapper resultsMapper) { - SearchResponse response = doSearch(prepareSearch(query), query.getElasticsearchQuery(), query.getElasticsearchFilter()); + SearchResponse response = doSearch(prepareSearch(query), query.getElasticsearchQuery(), query.getElasticsearchFilter(),query.getElasticsearchSort()); return resultsMapper.mapResults(response); } @@ -121,10 +122,15 @@ public class ElasticsearchTemplate implements ElasticsearchOperations { return extractIds(response); } - private SearchResponse doSearch(SearchRequestBuilder searchRequest, QueryBuilder query, FilterBuilder filter ){ + private SearchResponse doSearch(SearchRequestBuilder searchRequest, QueryBuilder query, FilterBuilder filter, SortBuilder sortBuilder){ if(filter != null){ searchRequest.setFilter(filter); } + + if(sortBuilder != null){ + searchRequest.addSort(sortBuilder); + } + return searchRequest.setQuery(query).execute().actionGet(); } diff --git a/src/main/java/org/springframework/data/elasticsearch/core/query/SearchQuery.java b/src/main/java/org/springframework/data/elasticsearch/core/query/SearchQuery.java index 3f61075bf..0ec210f12 100644 --- a/src/main/java/org/springframework/data/elasticsearch/core/query/SearchQuery.java +++ b/src/main/java/org/springframework/data/elasticsearch/core/query/SearchQuery.java @@ -3,11 +3,13 @@ package org.springframework.data.elasticsearch.core.query; import org.elasticsearch.index.query.FilterBuilder; import org.elasticsearch.index.query.QueryBuilder; +import org.elasticsearch.search.sort.SortBuilder; public class SearchQuery extends AbstractQuery{ private QueryBuilder elasticsearchQuery; private FilterBuilder elasticsearchFilter; + private SortBuilder elasticsearchSort; public QueryBuilder getElasticsearchQuery() { return elasticsearchQuery; @@ -25,4 +27,11 @@ public class SearchQuery extends AbstractQuery{ this.elasticsearchFilter = elasticsearchFilter; } + public SortBuilder getElasticsearchSort() { + return elasticsearchSort; + } + + public void setElasticsearchSort(SortBuilder elasticsearchSort) { + this.elasticsearchSort = elasticsearchSort; + } } diff --git a/src/test/java/org/springframework/data/elasticsearch/core/ElasticsearchTemplateTest.java b/src/test/java/org/springframework/data/elasticsearch/core/ElasticsearchTemplateTest.java index e1cd4ecaa..7ef0898e6 100644 --- a/src/test/java/org/springframework/data/elasticsearch/core/ElasticsearchTemplateTest.java +++ b/src/test/java/org/springframework/data/elasticsearch/core/ElasticsearchTemplateTest.java @@ -3,6 +3,9 @@ package org.springframework.data.elasticsearch.core; import org.elasticsearch.action.search.SearchResponse; import org.elasticsearch.search.SearchHit; +import org.elasticsearch.search.sort.FieldSortBuilder; +import org.elasticsearch.search.sort.SortBuilder; +import org.elasticsearch.search.sort.SortOrder; import org.junit.Before; import org.junit.Ignore; import org.junit.Test; @@ -249,6 +252,65 @@ public class ElasticsearchTemplateTest { assertThat(sampleEntities.getTotalElements(), equalTo(1L)); } + @Test + public void shouldTestSortBuilder(){ + //given + List indexQueries = new ArrayList(); + //first document + String documentId = randomNumeric(5); + SampleEntity sampleEntity1 = new SampleEntity(); + sampleEntity1.setId(documentId); + sampleEntity1.setMessage("abc"); + sampleEntity1.setRate(10); + sampleEntity1.setVersion(System.currentTimeMillis()); + + IndexQuery indexQuery1 = new IndexQuery(); + indexQuery1.setId(documentId); + indexQuery1.setObject(sampleEntity1); + + //second document + String documentId2 = randomNumeric(5); + SampleEntity sampleEntity2 = new SampleEntity(); + sampleEntity2.setId(documentId2); + sampleEntity2.setMessage("xyz"); + sampleEntity2.setRate(5); + sampleEntity2.setVersion(System.currentTimeMillis()); + + IndexQuery indexQuery2 = new IndexQuery(); + indexQuery2.setId(documentId2); + indexQuery2.setObject(sampleEntity2); + + //third document + String documentId3 = randomNumeric(5); + SampleEntity sampleEntity3 = new SampleEntity(); + sampleEntity3.setId(documentId3); + sampleEntity3.setMessage("xyz"); + sampleEntity3.setRate(15); + sampleEntity3.setVersion(System.currentTimeMillis()); + + IndexQuery indexQuery3 = new IndexQuery(); + indexQuery3.setId(documentId3); + indexQuery3.setObject(sampleEntity3); + + indexQueries.add(indexQuery1); + indexQueries.add(indexQuery2); + indexQueries.add(indexQuery3); + + elasticsearchTemplate.bulkIndex(indexQueries); + elasticsearchTemplate.refresh(SampleEntity.class, true); + + SearchQuery searchQuery = new SearchQuery(); + searchQuery.setElasticsearchQuery(matchAllQuery()); + SortBuilder sortBuilder = new FieldSortBuilder("rate").ignoreUnmapped(true).order(SortOrder.ASC); + + searchQuery.setElasticsearchSort(sortBuilder); + //when + Page sampleEntities = elasticsearchTemplate.queryForPage(searchQuery,SampleEntity.class); + //then + assertThat(sampleEntities.getTotalElements(), equalTo(3L)); + assertThat(sampleEntities.getContent().get(0).getRate(),is(sampleEntity2.getRate())); + } + @Test public void shouldExecuteStringQuery(){ //given @@ -414,5 +476,4 @@ public class ElasticsearchTemplateTest { assertThat(page.getTotalElements(), is(equalTo(1L))); assertThat(page.getContent().get(0), is(message)); } - }