Skip to content

Commit 96fffe7

Browse files
committed
fixup! DATAES-462 - add support for mapping max score and document scores
1 parent a8a86ca commit 96fffe7

File tree

6 files changed

+43
-26
lines changed

6 files changed

+43
-26
lines changed
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
package org.springframework.data.elasticsearch.annotations;
2+
3+
import java.lang.annotation.Documented;
4+
import java.lang.annotation.ElementType;
5+
import java.lang.annotation.Inherited;
6+
import java.lang.annotation.Retention;
7+
import java.lang.annotation.RetentionPolicy;
8+
import java.lang.annotation.Target;
9+
10+
/**
11+
* Specifies that this field is used for storing the document score.
12+
*
13+
* @author Sascha Woo
14+
*/
15+
@Retention(RetentionPolicy.RUNTIME)
16+
@Target(ElementType.FIELD)
17+
@Documented
18+
@Inherited
19+
public @interface Score {
20+
}

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

Lines changed: 12 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717

1818
import java.io.ByteArrayOutputStream;
1919
import java.io.IOException;
20+
import java.lang.reflect.Field;
2021
import java.nio.charset.Charset;
2122
import java.util.ArrayList;
2223
import java.util.Collection;
@@ -33,12 +34,14 @@
3334
import org.springframework.data.domain.Pageable;
3435
import org.springframework.data.elasticsearch.ElasticsearchException;
3536
import org.springframework.data.elasticsearch.annotations.Document;
37+
import org.springframework.data.elasticsearch.annotations.Score;
3638
import org.springframework.data.elasticsearch.annotations.ScriptedField;
3739
import org.springframework.data.elasticsearch.core.aggregation.AggregatedPage;
3840
import org.springframework.data.elasticsearch.core.aggregation.impl.AggregatedPageImpl;
3941
import org.springframework.data.elasticsearch.core.mapping.ElasticsearchPersistentEntity;
4042
import org.springframework.data.elasticsearch.core.mapping.ElasticsearchPersistentProperty;
4143
import org.springframework.data.mapping.context.MappingContext;
44+
import org.springframework.data.util.ReflectionUtils;
4245
import org.springframework.util.Assert;
4346

4447
import com.fasterxml.jackson.core.JsonEncoding;
@@ -63,7 +66,8 @@ public DefaultResultMapper() {
6366
super(new DefaultEntityMapper());
6467
}
6568

66-
public DefaultResultMapper(MappingContext<? extends ElasticsearchPersistentEntity<?>, ElasticsearchPersistentProperty> mappingContext) {
69+
public DefaultResultMapper(
70+
MappingContext<? extends ElasticsearchPersistentEntity<?>, ElasticsearchPersistentProperty> mappingContext) {
6771
super(new DefaultEntityMapper());
6872
this.mappingContext = mappingContext;
6973
}
@@ -81,6 +85,8 @@ public DefaultResultMapper(
8185

8286
@Override
8387
public <T> AggregatedPage<T> mapResults(SearchResponse response, Class<T> clazz, Pageable pageable) {
88+
Field scoreField = ReflectionUtils.findField(clazz, f -> f.getAnnotation(Score.class) != null);
89+
8490
long totalHits = response.getHits().getTotalHits();
8591
float maxScore = response.getHits().getMaxScore();
8692

@@ -94,8 +100,9 @@ public <T> AggregatedPage<T> mapResults(SearchResponse response, Class<T> clazz,
94100
result = mapEntity(hit.getFields().values(), clazz);
95101
}
96102

97-
if (result instanceof ScoredEntity) {
98-
((ScoredEntity) result).setScore(hit.getScore());
103+
// set score to field annotated with @Score
104+
if (scoreField != null) {
105+
ReflectionUtils.setField(scoreField, result, hit.getScore());
99106
}
100107

101108
setPersistentEntityId(result, hit.getId(), clazz);
@@ -121,8 +128,8 @@ private <T> void populateScriptFields(T result, SearchHit hit) {
121128
try {
122129
field.set(result, searchHitField.getValue());
123130
} catch (IllegalArgumentException e) {
124-
throw new ElasticsearchException("failed to set scripted field: " + name + " with value: "
125-
+ searchHitField.getValue(), e);
131+
throw new ElasticsearchException(
132+
"failed to set scripted field: " + name + " with value: " + searchHitField.getValue(), e);
126133
} catch (IllegalAccessException e) {
127134
throw new ElasticsearchException("failed to access scripted field: " + name, e);
128135
}

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

Lines changed: 0 additions & 12 deletions
This file was deleted.

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

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,9 @@
44
import org.springframework.data.domain.Page;
55

66
/**
7+
* A score-aware page gaining information about max score.
8+
*
9+
* @param <T>
710
* @author Sascha Woo
811
*/
912
public interface ScoredPage<T> extends Page<T> {

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1536,8 +1536,8 @@ public void shouldReturnScores() {
15361536
AggregatedPage<SampleEntity> page = elasticsearchTemplate.queryForPage(searchQuery, SampleEntity.class);
15371537

15381538
// then
1539-
assertThat(page.getMaxScore(), is(not(Float.NaN)));
1540-
assertThat(page.getContent().get(0).getScore(), is(not(Float.NaN)));
1539+
assertThat(page.getMaxScore(), greaterThan(0f));
1540+
assertThat(page.getContent().get(0).getScore(), greaterThan(0f));
15411541
}
15421542

15431543
@Test

src/test/java/org/springframework/data/elasticsearch/entities/SampleEntity.java

Lines changed: 6 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -15,26 +15,24 @@
1515
*/
1616
package org.springframework.data.elasticsearch.entities;
1717

18-
import java.lang.Double;
19-
import java.lang.Long;
20-
import java.lang.Object;
18+
import static org.springframework.data.elasticsearch.annotations.FieldType.*;
19+
2120
import lombok.AllArgsConstructor;
2221
import lombok.Builder;
2322
import lombok.Getter;
2423
import lombok.NoArgsConstructor;
2524
import lombok.Setter;
2625
import lombok.ToString;
26+
2727
import org.springframework.data.annotation.Id;
2828
import org.springframework.data.annotation.Transient;
2929
import org.springframework.data.annotation.Version;
3030
import org.springframework.data.elasticsearch.annotations.Document;
3131
import org.springframework.data.elasticsearch.annotations.Field;
32+
import org.springframework.data.elasticsearch.annotations.Score;
3233
import org.springframework.data.elasticsearch.annotations.ScriptedField;
33-
import org.springframework.data.elasticsearch.core.ScoredEntity;
3434
import org.springframework.data.elasticsearch.core.geo.GeoPoint;
3535

36-
import static org.springframework.data.elasticsearch.annotations.FieldType.*;
37-
3836
/**
3937
* @author Rizwan Idrees
4038
* @author Mohsin Husen
@@ -48,7 +46,7 @@
4846
@ToString
4947
@Builder
5048
@Document(indexName = "test-index-sample", type = "test-type", shards = 1, replicas = 0, refreshInterval = "-1")
51-
public class SampleEntity implements ScoredEntity {
49+
public class SampleEntity {
5250

5351
@Id
5452
private String id;
@@ -64,6 +62,7 @@ public class SampleEntity implements ScoredEntity {
6462
private GeoPoint location;
6563
@Version
6664
private Long version;
65+
@Score
6766
@Transient
6867
private float score;
6968

0 commit comments

Comments
 (0)