Skip to content

Commit 37bc97d

Browse files
committed
DATAES-467 - Fix sorting by _score if Spring Data sort is used.
Original pull request: #209.
1 parent 26eba03 commit 37bc97d

File tree

2 files changed

+46
-8
lines changed

2 files changed

+46
-8
lines changed

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

+23-8
Original file line numberDiff line numberDiff line change
@@ -67,6 +67,7 @@
6767
import org.elasticsearch.search.aggregations.AbstractAggregationBuilder;
6868
import org.elasticsearch.search.fetch.subphase.highlight.HighlightBuilder;
6969
import org.elasticsearch.search.sort.FieldSortBuilder;
70+
import org.elasticsearch.search.sort.ScoreSortBuilder;
7071
import org.elasticsearch.search.sort.SortBuilder;
7172
import org.elasticsearch.search.sort.SortBuilders;
7273
import org.elasticsearch.search.sort.SortOrder;
@@ -131,6 +132,8 @@
131132
public class ElasticsearchTemplate implements ElasticsearchOperations, ApplicationContextAware {
132133

133134
private static final Logger logger = LoggerFactory.getLogger(ElasticsearchTemplate.class);
135+
private static final String FIELD_SCORE = "_score";
136+
134137
private Client client;
135138
private ElasticsearchConverter elasticsearchConverter;
136139
private ResultsMapper resultsMapper;
@@ -1022,15 +1025,27 @@ private SearchRequestBuilder prepareSearch(Query query) {
10221025

10231026
if (query.getSort() != null) {
10241027
for (Sort.Order order : query.getSort()) {
1025-
FieldSortBuilder sort = SortBuilders.fieldSort(order.getProperty())
1026-
.order(order.getDirection().isDescending() ? SortOrder.DESC : SortOrder.ASC);
1027-
if (order.getNullHandling() == Sort.NullHandling.NULLS_FIRST) {
1028-
sort.missing("_first");
1029-
}
1030-
else if (order.getNullHandling() == Sort.NullHandling.NULLS_LAST) {
1031-
sort.missing("_last");
1028+
SortOrder sortOrder = order.getDirection().isDescending() ? SortOrder.DESC : SortOrder.ASC;
1029+
1030+
if (FIELD_SCORE.equals(order.getProperty())) {
1031+
ScoreSortBuilder sort = SortBuilders //
1032+
.scoreSort() //
1033+
.order(sortOrder);
1034+
1035+
searchRequestBuilder.addSort(sort);
1036+
} else {
1037+
FieldSortBuilder sort = SortBuilders //
1038+
.fieldSort(order.getProperty()) //
1039+
.order(sortOrder);
1040+
1041+
if (order.getNullHandling() == Sort.NullHandling.NULLS_FIRST) {
1042+
sort.missing("_first");
1043+
} else if (order.getNullHandling() == Sort.NullHandling.NULLS_LAST) {
1044+
sort.missing("_last");
1045+
}
1046+
1047+
searchRequestBuilder.addSort(sort);
10321048
}
1033-
searchRequestBuilder.addSort(sort);
10341049
}
10351050
}
10361051

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

+23
Original file line numberDiff line numberDiff line change
@@ -564,6 +564,29 @@ public void shouldSortResultsGivenNullLastSortCriteria() {
564564
assertThat(sampleEntities.getContent().get(1).getMessage(), is(sampleEntity2.getMessage()));
565565
}
566566

567+
@Test // DATAES-467
568+
public void shouldSortResultsByScore() {
569+
// given
570+
List<SampleEntity> entities = Arrays.asList( //
571+
SampleEntity.builder().id("1").message("abc").build(), //
572+
SampleEntity.builder().id("2").message("def").build(), //
573+
SampleEntity.builder().id("3").message("ghi").build());
574+
575+
elasticsearchTemplate.bulkIndex(getIndexQueries(entities));
576+
elasticsearchTemplate.refresh(SampleEntity.class);
577+
578+
SearchQuery searchQuery = new NativeSearchQueryBuilder()
579+
.withQuery(matchAllQuery())
580+
.withPageable(PageRequest.of(0, 10, Sort.by(Sort.Order.asc("_score"))))
581+
.build();
582+
583+
// when
584+
Page<SampleEntity> sampleEntities = elasticsearchTemplate.queryForPage(searchQuery, SampleEntity.class);
585+
586+
// then
587+
assertThat(sampleEntities.getTotalElements(), equalTo(3L));
588+
}
589+
567590
@Test
568591
public void shouldExecuteStringQuery() {
569592
// given

0 commit comments

Comments
 (0)