mirror of
https://github.com/spring-projects/spring-data-elasticsearch.git
synced 2025-06-08 21:22:12 +00:00
DATAES-457 - ElasticsearchTemplate.prepareScroll() does not add sorting.
Original pull request: #273
This commit is contained in:
parent
4ab8af5116
commit
eb15c114b8
@ -945,6 +945,11 @@ public class ElasticsearchRestTemplate
|
||||
if (!isEmpty(query.getFields())) {
|
||||
searchSourceBuilder.fetchSource(toArray(query.getFields()), null);
|
||||
}
|
||||
|
||||
if (query.getSort() != null) {
|
||||
prepareSort(query, searchSourceBuilder);
|
||||
}
|
||||
|
||||
request.source(searchSourceBuilder);
|
||||
return request;
|
||||
}
|
||||
@ -992,6 +997,12 @@ public class ElasticsearchRestTemplate
|
||||
}
|
||||
request.source().version(true);
|
||||
|
||||
if (!isEmpty(searchQuery.getElasticsearchSorts())) {
|
||||
for (SortBuilder sort : searchQuery.getElasticsearchSorts()) {
|
||||
request.source().sort(sort);
|
||||
}
|
||||
}
|
||||
|
||||
try {
|
||||
return client.search(request);
|
||||
} catch (IOException e) {
|
||||
@ -1304,6 +1315,17 @@ public class ElasticsearchRestTemplate
|
||||
}
|
||||
|
||||
if (query.getSort() != null) {
|
||||
prepareSort(query, sourceBuilder);
|
||||
}
|
||||
|
||||
if (query.getMinScore() > 0) {
|
||||
sourceBuilder.minScore(query.getMinScore());
|
||||
}
|
||||
request.source(sourceBuilder);
|
||||
return request;
|
||||
}
|
||||
|
||||
private void prepareSort(Query query, SearchSourceBuilder sourceBuilder) {
|
||||
for (Sort.Order order : query.getSort()) {
|
||||
FieldSortBuilder sort = SortBuilders.fieldSort(order.getProperty())
|
||||
.order(order.getDirection().isDescending() ? SortOrder.DESC : SortOrder.ASC);
|
||||
@ -1316,13 +1338,6 @@ public class ElasticsearchRestTemplate
|
||||
}
|
||||
}
|
||||
|
||||
if (query.getMinScore() > 0) {
|
||||
sourceBuilder.minScore(query.getMinScore());
|
||||
}
|
||||
request.source(sourceBuilder);
|
||||
return request;
|
||||
}
|
||||
|
||||
private IndexRequest prepareIndex(IndexQuery query) {
|
||||
try {
|
||||
String indexName = StringUtils.isEmpty(query.getIndexName())
|
||||
|
@ -825,6 +825,11 @@ public class ElasticsearchTemplate implements ElasticsearchOperations, EsClient<
|
||||
if (!isEmpty(query.getFields())) {
|
||||
requestBuilder.setFetchSource(toArray(query.getFields()), null);
|
||||
}
|
||||
|
||||
if (query.getSort() != null) {
|
||||
prepareSort(query, requestBuilder);
|
||||
}
|
||||
|
||||
return requestBuilder;
|
||||
}
|
||||
|
||||
@ -859,6 +864,12 @@ public class ElasticsearchTemplate implements ElasticsearchOperations, EsClient<
|
||||
requestBuilder.setPostFilter(searchQuery.getFilter());
|
||||
}
|
||||
|
||||
if (!isEmpty(searchQuery.getElasticsearchSorts())) {
|
||||
for (SortBuilder sort : searchQuery.getElasticsearchSorts()) {
|
||||
requestBuilder.addSort(sort);
|
||||
}
|
||||
}
|
||||
|
||||
return getSearchResponse(requestBuilder.setQuery(searchQuery.getQuery()));
|
||||
}
|
||||
|
||||
@ -1110,6 +1121,16 @@ public class ElasticsearchTemplate implements ElasticsearchOperations, EsClient<
|
||||
}
|
||||
|
||||
if (query.getSort() != null) {
|
||||
prepareSort(query, searchRequestBuilder);
|
||||
}
|
||||
|
||||
if (query.getMinScore() > 0) {
|
||||
searchRequestBuilder.setMinScore(query.getMinScore());
|
||||
}
|
||||
return searchRequestBuilder;
|
||||
}
|
||||
|
||||
private void prepareSort(Query query, SearchRequestBuilder searchRequestBuilder) {
|
||||
for (Sort.Order order : query.getSort()) {
|
||||
SortOrder sortOrder = order.getDirection().isDescending() ? SortOrder.DESC : SortOrder.ASC;
|
||||
|
||||
@ -1135,12 +1156,6 @@ public class ElasticsearchTemplate implements ElasticsearchOperations, EsClient<
|
||||
}
|
||||
}
|
||||
|
||||
if (query.getMinScore() > 0) {
|
||||
searchRequestBuilder.setMinScore(query.getMinScore());
|
||||
}
|
||||
return searchRequestBuilder;
|
||||
}
|
||||
|
||||
private IndexRequestBuilder prepareIndex(IndexQuery query) {
|
||||
try {
|
||||
String indexName = StringUtils.isEmpty(query.getIndexName())
|
||||
|
@ -2717,6 +2717,96 @@ public class ElasticsearchTemplateTests {
|
||||
everyItem(nullValue()));
|
||||
}
|
||||
|
||||
@Test //DATAES-457
|
||||
public void shouldSortResultsGivenSortCriteriaWithScanAndScroll() {
|
||||
// given
|
||||
List<IndexQuery> indexQueries = new ArrayList<>();
|
||||
// first document
|
||||
String documentId = randomNumeric(5);
|
||||
SampleEntity sampleEntity1 = SampleEntity.builder().id(documentId).message("abc").rate(10)
|
||||
.version(System.currentTimeMillis()).build();
|
||||
|
||||
// second document
|
||||
String documentId2 = randomNumeric(5);
|
||||
SampleEntity sampleEntity2 = SampleEntity.builder().id(documentId2).message("xyz").rate(5)
|
||||
.version(System.currentTimeMillis()).build();
|
||||
|
||||
// third document
|
||||
String documentId3 = randomNumeric(5);
|
||||
SampleEntity sampleEntity3 = SampleEntity.builder().id(documentId3).message("xyz").rate(10)
|
||||
.version(System.currentTimeMillis()).build();
|
||||
|
||||
indexQueries = getIndexQueries(Arrays.asList(sampleEntity1, sampleEntity2, sampleEntity3));
|
||||
|
||||
elasticsearchTemplate.bulkIndex(indexQueries);
|
||||
elasticsearchTemplate.refresh(SampleEntity.class);
|
||||
|
||||
SearchQuery searchQuery = new NativeSearchQueryBuilder().withQuery(matchAllQuery())
|
||||
.withSort(new FieldSortBuilder("rate").order(SortOrder.ASC))
|
||||
.withSort(new FieldSortBuilder("message").order(SortOrder.DESC)).withPageable(PageRequest.of(0, 10))
|
||||
.build();
|
||||
// when
|
||||
ScrolledPage<SampleEntity> scroll = (ScrolledPage<SampleEntity>) elasticsearchTemplate
|
||||
.startScroll(1000, searchQuery, SampleEntity.class);
|
||||
List<SampleEntity> sampleEntities = new ArrayList<>();
|
||||
while (scroll.hasContent()) {
|
||||
sampleEntities.addAll(scroll.getContent());
|
||||
scroll = (ScrolledPage<SampleEntity>) elasticsearchTemplate
|
||||
.continueScroll(scroll.getScrollId(), 1000, SampleEntity.class);
|
||||
}
|
||||
// then
|
||||
assertThat(sampleEntities.size(), equalTo(3));
|
||||
assertThat(sampleEntities.get(0).getRate(), is(sampleEntity2.getRate()));
|
||||
assertThat(sampleEntities.get(1).getRate(), is(sampleEntity3.getRate()));
|
||||
assertThat(sampleEntities.get(1).getMessage(), is(sampleEntity3.getMessage()));
|
||||
assertThat(sampleEntities.get(2).getRate(), is(sampleEntity1.getRate()));
|
||||
assertThat(sampleEntities.get(2).getMessage(), is(sampleEntity1.getMessage()));
|
||||
}
|
||||
|
||||
@Test //DATAES-457
|
||||
public void shouldSortResultsGivenSortCriteriaFromPageableWithScanAndScroll() {
|
||||
// given
|
||||
List<IndexQuery> indexQueries = new ArrayList<>();
|
||||
// first document
|
||||
String documentId = randomNumeric(5);
|
||||
SampleEntity sampleEntity1 = SampleEntity.builder().id(documentId).message("abc").rate(10)
|
||||
.version(System.currentTimeMillis()).build();
|
||||
|
||||
// second document
|
||||
String documentId2 = randomNumeric(5);
|
||||
SampleEntity sampleEntity2 = SampleEntity.builder().id(documentId2).message("xyz").rate(5)
|
||||
.version(System.currentTimeMillis()).build();
|
||||
|
||||
// third document
|
||||
String documentId3 = randomNumeric(5);
|
||||
SampleEntity sampleEntity3 = SampleEntity.builder().id(documentId3).message("xyz").rate(10)
|
||||
.version(System.currentTimeMillis()).build();
|
||||
|
||||
indexQueries = getIndexQueries(Arrays.asList(sampleEntity1, sampleEntity2, sampleEntity3));
|
||||
|
||||
elasticsearchTemplate.bulkIndex(indexQueries);
|
||||
elasticsearchTemplate.refresh(SampleEntity.class);
|
||||
|
||||
SearchQuery searchQuery = new NativeSearchQueryBuilder().withQuery(matchAllQuery()).withPageable(
|
||||
PageRequest.of(0, 10, Sort.by(Sort.Direction.ASC, "rate").and(Sort.by(Sort.Direction.DESC, "message"))))
|
||||
.build();
|
||||
// when
|
||||
ScrolledPage<SampleEntity> scroll = (ScrolledPage<SampleEntity>) elasticsearchTemplate
|
||||
.startScroll(1000, searchQuery, SampleEntity.class);
|
||||
List<SampleEntity> sampleEntities = new ArrayList<>();
|
||||
while (scroll.hasContent()) {
|
||||
sampleEntities.addAll(scroll.getContent());
|
||||
scroll = (ScrolledPage<SampleEntity>) elasticsearchTemplate
|
||||
.continueScroll(scroll.getScrollId(), 1000, SampleEntity.class);
|
||||
}
|
||||
// then
|
||||
assertThat(sampleEntities.size(), equalTo(3));
|
||||
assertThat(sampleEntities.get(0).getRate(), is(sampleEntity2.getRate()));
|
||||
assertThat(sampleEntities.get(1).getRate(), is(sampleEntity3.getRate()));
|
||||
assertThat(sampleEntities.get(1).getMessage(), is(sampleEntity3.getMessage()));
|
||||
assertThat(sampleEntities.get(2).getRate(), is(sampleEntity1.getRate()));
|
||||
assertThat(sampleEntities.get(2).getMessage(), is(sampleEntity1.getMessage()));
|
||||
}
|
||||
|
||||
private IndexQuery getIndexQuery(SampleEntity sampleEntity) {
|
||||
return new IndexQueryBuilder()
|
||||
|
Loading…
x
Reference in New Issue
Block a user