Skip to content

Commit 020b5e1

Browse files
xhaggiodrotbohm
authored andcommitted
DATAES-467 - Fix sorting by _score if Spring Data sort is used.
Original pull request: #209.
1 parent 4a26af3 commit 020b5e1

File tree

2 files changed

+74
-18
lines changed

2 files changed

+74
-18
lines changed

src/main/java/org/springframework/data/elasticsearch/core/ElasticsearchTemplate.java

+51-18
Original file line numberDiff line numberDiff line change
@@ -15,20 +15,24 @@
1515
*/
1616
package org.springframework.data.elasticsearch.core;
1717

18-
import static org.apache.commons.lang.StringUtils.isBlank;
19-
import static org.apache.commons.lang.StringUtils.isNotBlank;
20-
import static org.elasticsearch.client.Requests.indicesExistsRequest;
21-
import static org.elasticsearch.client.Requests.refreshRequest;
22-
import static org.elasticsearch.index.VersionType.EXTERNAL;
23-
import static org.elasticsearch.index.query.QueryBuilders.moreLikeThisQuery;
24-
import static org.elasticsearch.index.query.QueryBuilders.wrapperQuery;
25-
import static org.springframework.data.elasticsearch.core.MappingBuilder.buildMapping;
18+
import static org.apache.commons.lang.StringUtils.*;
19+
import static org.elasticsearch.client.Requests.*;
20+
import static org.elasticsearch.index.VersionType.*;
21+
import static org.elasticsearch.index.query.QueryBuilders.*;
22+
import static org.springframework.data.elasticsearch.core.MappingBuilder.*;
2623
import static org.springframework.util.CollectionUtils.isEmpty;
2724

2825
import java.io.BufferedReader;
2926
import java.io.IOException;
3027
import java.io.InputStreamReader;
31-
import java.util.*;
28+
import java.util.ArrayList;
29+
import java.util.Collections;
30+
import java.util.HashMap;
31+
import java.util.Iterator;
32+
import java.util.LinkedList;
33+
import java.util.List;
34+
import java.util.Map;
35+
import java.util.NoSuchElementException;
3236
import java.util.stream.Collectors;
3337

3438
import org.elasticsearch.action.ActionFuture;
@@ -67,6 +71,7 @@
6771
import org.elasticsearch.search.aggregations.AbstractAggregationBuilder;
6872
import org.elasticsearch.search.fetch.subphase.highlight.HighlightBuilder;
6973
import org.elasticsearch.search.sort.FieldSortBuilder;
74+
import org.elasticsearch.search.sort.ScoreSortBuilder;
7075
import org.elasticsearch.search.sort.SortBuilder;
7176
import org.elasticsearch.search.sort.SortBuilders;
7277
import org.elasticsearch.search.sort.SortOrder;
@@ -93,7 +98,21 @@
9398
import org.springframework.data.elasticsearch.core.mapping.ElasticsearchPersistentEntity;
9499
import org.springframework.data.elasticsearch.core.mapping.ElasticsearchPersistentProperty;
95100
import org.springframework.data.elasticsearch.core.mapping.SimpleElasticsearchMappingContext;
96-
import org.springframework.data.elasticsearch.core.query.*;
101+
import org.springframework.data.elasticsearch.core.query.AliasQuery;
102+
import org.springframework.data.elasticsearch.core.query.CriteriaQuery;
103+
import org.springframework.data.elasticsearch.core.query.DeleteQuery;
104+
import org.springframework.data.elasticsearch.core.query.FetchSourceFilter;
105+
import org.springframework.data.elasticsearch.core.query.GetQuery;
106+
import org.springframework.data.elasticsearch.core.query.IndexBoost;
107+
import org.springframework.data.elasticsearch.core.query.IndexQuery;
108+
import org.springframework.data.elasticsearch.core.query.MoreLikeThisQuery;
109+
import org.springframework.data.elasticsearch.core.query.NativeSearchQueryBuilder;
110+
import org.springframework.data.elasticsearch.core.query.Query;
111+
import org.springframework.data.elasticsearch.core.query.ScriptField;
112+
import org.springframework.data.elasticsearch.core.query.SearchQuery;
113+
import org.springframework.data.elasticsearch.core.query.SourceFilter;
114+
import org.springframework.data.elasticsearch.core.query.StringQuery;
115+
import org.springframework.data.elasticsearch.core.query.UpdateQuery;
97116
import org.springframework.data.util.CloseableIterator;
98117
import org.springframework.util.Assert;
99118

@@ -118,6 +137,8 @@
118137
public class ElasticsearchTemplate implements ElasticsearchOperations, ApplicationContextAware {
119138

120139
private static final Logger logger = LoggerFactory.getLogger(ElasticsearchTemplate.class);
140+
private static final String FIELD_SCORE = "_score";
141+
121142
private Client client;
122143
private ElasticsearchConverter elasticsearchConverter;
123144
private ResultsMapper resultsMapper;
@@ -1015,15 +1036,27 @@ private SearchRequestBuilder prepareSearch(Query query) {
10151036

10161037
if (query.getSort() != null) {
10171038
for (Sort.Order order : query.getSort()) {
1018-
FieldSortBuilder sort = SortBuilders.fieldSort(order.getProperty())
1019-
.order(order.getDirection().isDescending() ? SortOrder.DESC : SortOrder.ASC);
1020-
if (order.getNullHandling() == Sort.NullHandling.NULLS_FIRST) {
1021-
sort.missing("_first");
1022-
}
1023-
else if (order.getNullHandling() == Sort.NullHandling.NULLS_LAST) {
1024-
sort.missing("_last");
1039+
SortOrder sortOrder = order.getDirection().isDescending() ? SortOrder.DESC : SortOrder.ASC;
1040+
1041+
if (FIELD_SCORE.equals(order.getProperty())) {
1042+
ScoreSortBuilder sort = SortBuilders //
1043+
.scoreSort() //
1044+
.order(sortOrder);
1045+
1046+
searchRequestBuilder.addSort(sort);
1047+
} else {
1048+
FieldSortBuilder sort = SortBuilders //
1049+
.fieldSort(order.getProperty()) //
1050+
.order(sortOrder);
1051+
1052+
if (order.getNullHandling() == Sort.NullHandling.NULLS_FIRST) {
1053+
sort.missing("_first");
1054+
} else if (order.getNullHandling() == Sort.NullHandling.NULLS_LAST) {
1055+
sort.missing("_last");
1056+
}
1057+
1058+
searchRequestBuilder.addSort(sort);
10251059
}
1026-
searchRequestBuilder.addSort(sort);
10271060
}
10281061
}
10291062

src/test/java/org/springframework/data/elasticsearch/core/ElasticsearchTemplateTests.java

+23
Original file line numberDiff line numberDiff line change
@@ -595,6 +595,29 @@ public void shouldSortResultsGivenNullLastSortCriteria() {
595595
assertThat(sampleEntities.getContent().get(1).getMessage(), is(sampleEntity2.getMessage()));
596596
}
597597

598+
@Test // DATAES-467
599+
public void shouldSortResultsByScore() {
600+
// given
601+
List<SampleEntity> entities = Arrays.asList( //
602+
SampleEntity.builder().id("1").message("abc").build(), //
603+
SampleEntity.builder().id("2").message("def").build(), //
604+
SampleEntity.builder().id("3").message("ghi").build());
605+
606+
elasticsearchTemplate.bulkIndex(getIndexQueries(entities));
607+
elasticsearchTemplate.refresh(SampleEntity.class);
608+
609+
SearchQuery searchQuery = new NativeSearchQueryBuilder()
610+
.withQuery(matchAllQuery())
611+
.withPageable(PageRequest.of(0, 10, Sort.by(Sort.Order.asc("_score"))))
612+
.build();
613+
614+
// when
615+
Page<SampleEntity> sampleEntities = elasticsearchTemplate.queryForPage(searchQuery, SampleEntity.class);
616+
617+
// then
618+
assertThat(sampleEntities.getTotalElements(), equalTo(3L));
619+
}
620+
598621
@Test
599622
public void shouldExecuteStringQuery() {
600623
// given

0 commit comments

Comments
 (0)