Skip to content

Commit 120eed0

Browse files
committed
Polishing.
1 parent b289d5f commit 120eed0

File tree

7 files changed

+71
-117
lines changed

7 files changed

+71
-117
lines changed

Diff for: src/main/java/org/springframework/data/elasticsearch/core/RequestFactory.java

+8-6
Original file line numberDiff line numberDiff line change
@@ -355,7 +355,8 @@ public BulkRequestBuilder bulkRequestBuilder(Client client, List<?> queries, Bul
355355

356356
// region index management
357357

358-
public CreateIndexRequest createIndexRequest(IndexCoordinates index, @Nullable Document settings, @Nullable Document mapping) {
358+
public CreateIndexRequest createIndexRequest(IndexCoordinates index, @Nullable Document settings,
359+
@Nullable Document mapping) {
359360
CreateIndexRequest request = new CreateIndexRequest(index.getIndexName());
360361

361362
if (settings != null && !settings.isEmpty()) {
@@ -1053,8 +1054,7 @@ private SearchRequest prepareSearchRequest(Query query, @Nullable Class<?> clazz
10531054
sourceBuilder.searchAfter(query.getSearchAfter().toArray());
10541055
}
10551056

1056-
query.getRescorerQueries().forEach(rescorer -> sourceBuilder.addRescorer(
1057-
getQueryRescorerBuilder(rescorer)));
1057+
query.getRescorerQueries().forEach(rescorer -> sourceBuilder.addRescorer(getQueryRescorerBuilder(rescorer)));
10581058

10591059
request.source(sourceBuilder);
10601060
return request;
@@ -1142,8 +1142,7 @@ private SearchRequestBuilder prepareSearchRequestBuilder(Query query, Client cli
11421142
searchRequestBuilder.searchAfter(query.getSearchAfter().toArray());
11431143
}
11441144

1145-
query.getRescorerQueries().forEach(rescorer -> searchRequestBuilder.addRescorer(
1146-
getQueryRescorerBuilder(rescorer)));
1145+
query.getRescorerQueries().forEach(rescorer -> searchRequestBuilder.addRescorer(getQueryRescorerBuilder(rescorer)));
11471146

11481147
return searchRequestBuilder;
11491148
}
@@ -1272,7 +1271,10 @@ private SortBuilder<?> getSortBuilder(Sort.Order order, @Nullable ElasticsearchP
12721271

12731272
private QueryRescorerBuilder getQueryRescorerBuilder(RescorerQuery rescorerQuery) {
12741273

1275-
QueryRescorerBuilder builder = new QueryRescorerBuilder(Objects.requireNonNull(getQuery(rescorerQuery.getQuery())));
1274+
QueryBuilder queryBuilder = getQuery(rescorerQuery.getQuery());
1275+
Assert.notNull("queryBuilder", "Could not build query for rescorerQuery");
1276+
1277+
QueryRescorerBuilder builder = new QueryRescorerBuilder(queryBuilder);
12761278

12771279
if (rescorerQuery.getScoreMode() != ScoreMode.Default) {
12781280
builder.setScoreMode(QueryRescoreMode.valueOf(rescorerQuery.getScoreMode().name()));

Diff for: src/main/java/org/springframework/data/elasticsearch/core/query/AbstractQuery.java

+6
Original file line numberDiff line numberDiff line change
@@ -300,11 +300,17 @@ public List<Object> getSearchAfter() {
300300

301301
@Override
302302
public void addRescorerQuery(RescorerQuery rescorerQuery) {
303+
304+
Assert.notNull(rescorerQuery, "rescorerQuery must not be null");
305+
303306
this.rescorerQueries.add(rescorerQuery);
304307
}
305308

306309
@Override
307310
public void setRescorerQueries(List<RescorerQuery> rescorerQueryList) {
311+
312+
Assert.notNull(rescorerQueries, "rescorerQueries must not be null");
313+
308314
this.rescorerQueries.clear();
309315
this.rescorerQueries.addAll(rescorerQueryList);
310316
}

Diff for: src/main/java/org/springframework/data/elasticsearch/core/query/NativeSearchQueryBuilder.java

+1-4
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,6 @@
2020
import java.util.ArrayList;
2121
import java.util.Collection;
2222
import java.util.List;
23-
import java.util.stream.Collectors;
2423

2524
import org.elasticsearch.action.search.SearchType;
2625
import org.elasticsearch.action.support.IndicesOptions;
@@ -29,7 +28,6 @@
2928
import org.elasticsearch.search.aggregations.AbstractAggregationBuilder;
3029
import org.elasticsearch.search.collapse.CollapseBuilder;
3130
import org.elasticsearch.search.fetch.subphase.highlight.HighlightBuilder;
32-
import org.elasticsearch.search.rescore.QueryRescorerBuilder;
3331
import org.elasticsearch.search.sort.SortBuilder;
3432
import org.springframework.data.domain.Pageable;
3533
import org.springframework.lang.Nullable;
@@ -265,8 +263,7 @@ public NativeSearchQuery build() {
265263
}
266264

267265
if (!isEmpty(rescorerQueries)) {
268-
nativeSearchQuery.setRescorerQueries(
269-
rescorerQueries);
266+
nativeSearchQuery.setRescorerQueries(rescorerQueries);
270267
}
271268

272269
return nativeSearchQuery;

Diff for: src/main/java/org/springframework/data/elasticsearch/core/query/Query.java

+8-3
Original file line numberDiff line numberDiff line change
@@ -314,21 +314,26 @@ default boolean getExplain() {
314314
List<Object> getSearchAfter();
315315

316316
/**
317-
* Sets the {@link RescorerQuery}.
317+
* Adds a {@link RescorerQuery}.
318318
*
319-
* @param rescorerQuery the query to add to the list of rescorer queries
319+
* @param rescorerQuery the query to add to the list of rescorer queries, must not be {@literal null}
320320
* @since 4.2
321321
*/
322322
void addRescorerQuery(RescorerQuery rescorerQuery);
323323

324324
/**
325325
* Sets the {@link RescorerQuery}.
326326
*
327-
* @param rescorerQueryList list of rescorer queries set
327+
* @param rescorerQueryList list of rescorer queries set, must not be {@literal null}.
328328
* @since 4.2
329329
*/
330330
void setRescorerQueries(List<RescorerQuery> rescorerQueryList);
331331

332+
/**
333+
* get the list of {@link RescorerQuery}s
334+
*
335+
* @since 4.2
336+
*/
332337
default List<RescorerQuery> getRescorerQueries() {
333338
return Collections.emptyList();
334339
}

Diff for: src/main/java/org/springframework/data/elasticsearch/core/query/RescorerQuery.java

+9-11
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright 2020-2021 the original author or authors.
2+
* Copyright 2021 the original author or authors.
33
*
44
* Licensed under the Apache License, Version 2.0 (the "License");
55
* you may not use this file except in compliance with the License.
@@ -15,9 +15,8 @@
1515
*/
1616
package org.springframework.data.elasticsearch.core.query;
1717

18-
import org.elasticsearch.index.query.QueryBuilder;
19-
import org.elasticsearch.search.rescore.QueryRescorerBuilder;
2018
import org.springframework.lang.Nullable;
19+
import org.springframework.util.Assert;
2120

2221
/**
2322
* Implementation of RescorerQuery to be used for rescoring filtered search results.
@@ -34,6 +33,9 @@ public class RescorerQuery {
3433
@Nullable private Float rescoreQueryWeight;
3534

3635
public RescorerQuery(Query query) {
36+
37+
Assert.notNull(query, "query must not be null");
38+
3739
this.query = query;
3840
}
3941

@@ -61,6 +63,9 @@ public Float getRescoreQueryWeight() {
6163
}
6264

6365
public RescorerQuery withScoreMode(ScoreMode scoreMode) {
66+
67+
Assert.notNull(scoreMode, "scoreMode must not be null");
68+
6469
this.scoreMode = scoreMode;
6570
return this;
6671
}
@@ -80,15 +85,8 @@ public RescorerQuery withRescoreQueryWeight(float rescoreQueryWeight) {
8085
return this;
8186
}
8287

83-
84-
8588
public enum ScoreMode {
86-
Default,
87-
Avg,
88-
Max,
89-
Min,
90-
Total,
91-
Multiply
89+
Default, Avg, Max, Min, Total, Multiply
9290
}
9391

9492
}

Diff for: src/test/java/org/springframework/data/elasticsearch/core/ElasticsearchTemplateTests.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -3132,7 +3132,7 @@ void shouldReturnHighlightFieldsInSearchHit() {
31323132
assertThat(highlightField.get(1)).contains("<em>message</em>");
31333133
}
31343134

3135-
@Test
3135+
@Test // #1686
31363136
void shouldRunRescoreQueryInSearchQuery() {
31373137
IndexCoordinates index = IndexCoordinates.of("test-index-rescore-entity-template");
31383138

Diff for: src/test/java/org/springframework/data/elasticsearch/core/RequestFactoryTests.java

+38-92
Original file line numberDiff line numberDiff line change
@@ -45,12 +45,10 @@
4545
import org.elasticsearch.common.xcontent.ToXContent;
4646
import org.elasticsearch.common.xcontent.XContentHelper;
4747
import org.elasticsearch.common.xcontent.XContentType;
48-
import org.elasticsearch.index.query.MatchPhraseQueryBuilder;
4948
import org.elasticsearch.index.query.QueryBuilders;
5049
import org.elasticsearch.index.query.functionscore.FunctionScoreQueryBuilder;
5150
import org.elasticsearch.index.query.functionscore.FunctionScoreQueryBuilder.FilterFunctionBuilder;
5251
import org.elasticsearch.index.query.functionscore.GaussDecayFunctionBuilder;
53-
import org.elasticsearch.index.query.functionscore.ScriptScoreQueryBuilder;
5452
import org.json.JSONException;
5553
import org.junit.jupiter.api.BeforeAll;
5654
import org.junit.jupiter.api.DisplayName;
@@ -522,37 +520,24 @@ private String requestToString(ToXContent request) throws IOException {
522520
return XContentHelper.toXContent(request, XContentType.JSON, true).utf8ToString();
523521
}
524522

525-
@Test
523+
@Test // #1686
526524
void shouldBuildSearchWithRescorerQuery() throws JSONException {
527525
CriteriaQuery query = new CriteriaQuery(new Criteria("lastName").is("Smith"));
528-
RescorerQuery rescorerQuery = new RescorerQuery( new NativeSearchQueryBuilder() //
529-
.withQuery(
530-
QueryBuilders.functionScoreQuery(new FunctionScoreQueryBuilder.FilterFunctionBuilder[]{
526+
RescorerQuery rescorerQuery = new RescorerQuery(new NativeSearchQueryBuilder() //
527+
.withQuery(QueryBuilders
528+
.functionScoreQuery(new FunctionScoreQueryBuilder.FilterFunctionBuilder[] {
531529
new FilterFunctionBuilder(QueryBuilders.existsQuery("someField"),
532-
new GaussDecayFunctionBuilder("someField", 0, 100000.0, null, 0.683)
533-
.setWeight(5.022317f)),
530+
new GaussDecayFunctionBuilder("someField", 0, 100000.0, null, 0.683).setWeight(5.022317f)),
534531
new FilterFunctionBuilder(QueryBuilders.existsQuery("anotherField"),
535532
new GaussDecayFunctionBuilder("anotherField", "202102", "31536000s", null, 0.683)
536-
.setWeight(4.170836f))})
537-
.scoreMode(FunctionScoreQuery.ScoreMode.SUM)
538-
.maxBoost(50.0f)
539-
.boostMode(CombineFunction.AVG)
540-
.boost(1.5f))
541-
.build()
542-
)
543-
.withWindowSize(50)
544-
.withQueryWeight(2.0f)
545-
.withRescoreQueryWeight(5.0f)
546-
.withScoreMode(ScoreMode.Multiply);
533+
.setWeight(4.170836f)) })
534+
.scoreMode(FunctionScoreQuery.ScoreMode.SUM).maxBoost(50.0f).boostMode(CombineFunction.AVG).boost(1.5f))
535+
.build()).withWindowSize(50).withQueryWeight(2.0f).withRescoreQueryWeight(5.0f)
536+
.withScoreMode(ScoreMode.Multiply);
547537

548538
RescorerQuery anotherRescorerQuery = new RescorerQuery(new NativeSearchQueryBuilder() //
549-
.withQuery(
550-
QueryBuilders.matchPhraseQuery("message", "the quick brown").slop(2))
551-
.build()
552-
)
553-
.withWindowSize(100)
554-
.withQueryWeight(0.7f)
555-
.withRescoreQueryWeight(1.2f);
539+
.withQuery(QueryBuilders.matchPhraseQuery("message", "the quick brown").slop(2)).build()).withWindowSize(100)
540+
.withQueryWeight(0.7f).withRescoreQueryWeight(1.2f);
556541

557542
query.addRescorerQuery(rescorerQuery);
558543
query.addRescorerQuery(anotherRescorerQuery);
@@ -574,79 +559,40 @@ void shouldBuildSearchWithRescorerQuery() throws JSONException {
574559
" ]" + //
575560
" }" + //
576561
" }," + //
577-
" \"rescore\": [{\n"
578-
+ " \"window_size\" : 100,\n"
579-
+ " \"query\" : {\n"
580-
+ " \"rescore_query\" : {\n"
581-
+ " \"match_phrase\" : {\n"
582-
+ " \"message\" : {\n"
583-
+ " \"query\" : \"the quick brown\",\n"
584-
+ " \"slop\" : 2\n"
585-
+ " }\n"
586-
+ " }\n"
587-
+ " },\n"
588-
+ " \"query_weight\" : 0.7,\n"
589-
+ " \"rescore_query_weight\" : 1.2\n"
590-
+ " }\n"
591-
+ " },"
592-
+ " {\n"
593-
+ " \"window_size\": 50,\n"
594-
+ " \"query\": {\n"
595-
+ " \"rescore_query\": {\n"
596-
+ " \"function_score\": {\n"
597-
+ " \"query\": {\n"
598-
+ " \"match_all\": {\n"
599-
+ " \"boost\": 1.0\n"
600-
+ " }\n"
601-
+ " },\n"
602-
+ " \"functions\": [\n"
603-
+ " {\n"
604-
+ " \"filter\": {\n"
562+
" \"rescore\": [{\n" + " \"window_size\" : 100,\n" + " \"query\" : {\n"
563+
+ " \"rescore_query\" : {\n" + " \"match_phrase\" : {\n" + " \"message\" : {\n"
564+
+ " \"query\" : \"the quick brown\",\n" + " \"slop\" : 2\n"
565+
+ " }\n" + " }\n" + " },\n" + " \"query_weight\" : 0.7,\n"
566+
+ " \"rescore_query_weight\" : 1.2\n" + " }\n" + " }," + " {\n" + " \"window_size\": 50,\n"
567+
+ " \"query\": {\n" + " \"rescore_query\": {\n" + " \"function_score\": {\n"
568+
+ " \"query\": {\n" + " \"match_all\": {\n"
569+
+ " \"boost\": 1.0\n" + " }\n"
570+
+ " },\n" + " \"functions\": [\n"
571+
+ " {\n" + " \"filter\": {\n"
605572
+ " \"exists\": {\n"
606573
+ " \"field\": \"someField\",\n"
607-
+ " \"boost\": 1.0\n"
608-
+ " }\n"
609-
+ " },\n"
610-
+ " \"weight\": 5.022317,\n"
611-
+ " \"gauss\": {\n"
612-
+ " \"someField\": {\n"
574+
+ " \"boost\": 1.0\n" + " }\n"
575+
+ " },\n" + " \"weight\": 5.022317,\n"
576+
+ " \"gauss\": {\n" + " \"someField\": {\n"
613577
+ " \"origin\": 0.0,\n"
614578
+ " \"scale\": 100000.0,\n"
615-
+ " \"decay\": 0.683\n"
616-
+ " },\n"
617-
+ " \"multi_value_mode\": \"MIN\"\n"
618-
+ " }\n"
619-
+ " },\n"
620-
+ " {\n"
621-
+ " \"filter\": {\n"
622-
+ " \"exists\": {\n"
579+
+ " \"decay\": 0.683\n" + " },\n"
580+
+ " \"multi_value_mode\": \"MIN\"\n" + " }\n"
581+
+ " },\n" + " {\n"
582+
+ " \"filter\": {\n" + " \"exists\": {\n"
623583
+ " \"field\": \"anotherField\",\n"
624-
+ " \"boost\": 1.0\n"
625-
+ " }\n"
626-
+ " },\n"
627-
+ " \"weight\": 4.170836,\n"
628-
+ " \"gauss\": {\n"
629-
+ " \"anotherField\": {\n"
584+
+ " \"boost\": 1.0\n" + " }\n"
585+
+ " },\n" + " \"weight\": 4.170836,\n"
586+
+ " \"gauss\": {\n" + " \"anotherField\": {\n"
630587
+ " \"origin\": \"202102\",\n"
631588
+ " \"scale\": \"31536000s\",\n"
632-
+ " \"decay\": 0.683\n"
633-
+ " },\n"
634-
+ " \"multi_value_mode\": \"MIN\"\n"
635-
+ " }\n"
636-
+ " }\n"
637-
+ " ],\n"
638-
+ " \"score_mode\": \"sum\",\n"
639-
+ " \"boost_mode\": \"avg\",\n"
640-
+ " \"max_boost\": 50.0,\n"
641-
+ " \"boost\": 1.5\n"
642-
+ " }\n"
643-
+ " },\n"
644-
+ " \"query_weight\": 2.0,"
645-
+ " \"rescore_query_weight\": 5.0,"
646-
+ " \"score_mode\": \"multiply\""
647-
+ " }\n"
648-
+ " }\n"
649-
+ " ]\n"
589+
+ " \"decay\": 0.683\n" + " },\n"
590+
+ " \"multi_value_mode\": \"MIN\"\n" + " }\n"
591+
+ " }\n" + " ],\n"
592+
+ " \"score_mode\": \"sum\",\n" + " \"boost_mode\": \"avg\",\n"
593+
+ " \"max_boost\": 50.0,\n" + " \"boost\": 1.5\n"
594+
+ " }\n" + " },\n" + " \"query_weight\": 2.0,"
595+
+ " \"rescore_query_weight\": 5.0," + " \"score_mode\": \"multiply\"" + " }\n" + " }\n" + " ]\n"
650596
+ '}';
651597

652598
String searchRequest = requestFactory.searchRequest(query, Person.class, IndexCoordinates.of("persons")).source()

0 commit comments

Comments
 (0)