From 36e3b93ea93b7549df7378f248c0a6f908da8e52 Mon Sep 17 00:00:00 2001 From: Peter-Josef Meisch Date: Sat, 20 May 2023 17:31:30 +0200 Subject: [PATCH] Make SearchType in query nullable, set to null in NativeQuery with knnQuery. Original Pull Request #2570 Closes #2569 --- .../client/elc/RequestConverter.java | 19 +++++++--- .../elasticsearch/core/query/BaseQuery.java | 5 ++- .../core/query/BaseQueryBuilder.java | 37 ++++++++++--------- .../data/elasticsearch/core/query/Query.java | 1 + 4 files changed, 36 insertions(+), 26 deletions(-) diff --git a/src/main/java/org/springframework/data/elasticsearch/client/elc/RequestConverter.java b/src/main/java/org/springframework/data/elasticsearch/client/elc/RequestConverter.java index 02c75f02a..bb077c693 100644 --- a/src/main/java/org/springframework/data/elasticsearch/client/elc/RequestConverter.java +++ b/src/main/java/org/springframework/data/elasticsearch/client/elc/RequestConverter.java @@ -22,6 +22,7 @@ import co.elastic.clients.elasticsearch._types.Conflicts; import co.elastic.clients.elasticsearch._types.FieldValue; import co.elastic.clients.elasticsearch._types.InlineScript; import co.elastic.clients.elasticsearch._types.OpType; +import co.elastic.clients.elasticsearch._types.SearchType; import co.elastic.clients.elasticsearch._types.SortOptions; import co.elastic.clients.elasticsearch._types.SortOrder; import co.elastic.clients.elasticsearch._types.VersionType; @@ -1153,9 +1154,12 @@ class RequestConverter { var query = param.query(); mrb.searches(sb -> sb // .header(h -> { + var searchType = (query instanceof NativeQuery nativeQuery && nativeQuery.getKnnQuery() != null) ? null + : searchType(query.getSearchType()); + h // .index(Arrays.asList(param.index().getIndexNames())) // - .searchType(searchType(query.getSearchType())) // + .searchType(searchType) // .requestCache(query.getRequestCache()) // ; @@ -1256,8 +1260,8 @@ class RequestConverter { query.getScriptedFields().forEach(scriptedField -> bb.scriptFields(scriptedField.getFieldName(), sf -> sf.script(getScript(scriptedField.getScriptData())))); - if (query instanceof NativeQuery) { - prepareNativeSearch((NativeQuery) query, bb); + if (query instanceof NativeQuery nativeQuery) { + prepareNativeSearch(nativeQuery, bb); } return bb; } // @@ -1279,12 +1283,15 @@ class RequestConverter { ElasticsearchPersistentEntity persistentEntity = getPersistentEntity(clazz); + var searchType = (query instanceof NativeQuery nativeQuery && nativeQuery.getKnnQuery() != null) ? null + : searchType(query.getSearchType()); + builder // .version(true) // .trackScores(query.getTrackScores()) // .allowNoIndices(query.getAllowNoIndices()) // .source(getSourceConfig(query)) // - .searchType(searchType(query.getSearchType())) // + .searchType(searchType) // .timeout(timeStringMs(query.getTimeout())) // .requestCache(query.getRequestCache()) // ; @@ -1361,8 +1368,8 @@ class RequestConverter { query.getScriptedFields().forEach(scriptedField -> builder.scriptFields(scriptedField.getFieldName(), sf -> sf.script(getScript(scriptedField.getScriptData())))); - if (query instanceof NativeQuery) { - prepareNativeSearch((NativeQuery) query, builder); + if (query instanceof NativeQuery nativeQuery) { + prepareNativeSearch(nativeQuery, builder); } if (query.getTrackTotalHits() != null) { diff --git a/src/main/java/org/springframework/data/elasticsearch/core/query/BaseQuery.java b/src/main/java/org/springframework/data/elasticsearch/core/query/BaseQuery.java index a86413cff..bb25e1303 100755 --- a/src/main/java/org/springframework/data/elasticsearch/core/query/BaseQuery.java +++ b/src/main/java/org/springframework/data/elasticsearch/core/query/BaseQuery.java @@ -58,7 +58,7 @@ public class BaseQuery implements Query { protected float minScore; @Nullable protected Collection ids; @Nullable protected String route; - protected SearchType searchType = SearchType.QUERY_THEN_FETCH; + @Nullable protected SearchType searchType = SearchType.QUERY_THEN_FETCH; @Nullable protected IndicesOptions indicesOptions; protected boolean trackScores; @Nullable protected String preference; @@ -278,10 +278,11 @@ public class BaseQuery implements Query { this.route = route; } - public void setSearchType(SearchType searchType) { + public void setSearchType(@Nullable SearchType searchType) { this.searchType = searchType; } + @Nullable @Override public SearchType getSearchType() { return searchType; diff --git a/src/main/java/org/springframework/data/elasticsearch/core/query/BaseQueryBuilder.java b/src/main/java/org/springframework/data/elasticsearch/core/query/BaseQueryBuilder.java index c6b0e8d02..5490f2b36 100644 --- a/src/main/java/org/springframework/data/elasticsearch/core/query/BaseQueryBuilder.java +++ b/src/main/java/org/springframework/data/elasticsearch/core/query/BaseQueryBuilder.java @@ -46,7 +46,7 @@ public abstract class BaseQueryBuilder ids = new ArrayList<>(); @Nullable private String route; - private Query.SearchType searchType = Query.SearchType.QUERY_THEN_FETCH; + @Nullable private Query.SearchType searchType = Query.SearchType.QUERY_THEN_FETCH; @Nullable private IndicesOptions indicesOptions; private boolean trackScores; @Nullable private String preference; @@ -140,6 +140,7 @@ public abstract class BaseQueryBuilder ids) { Assert.notNull(ids, "ids must not be null"); @@ -342,7 +343,7 @@ public abstract class BaseQueryBuilder idsWithRouting) { Assert.notNull(idsWithRouting, "idsWithRouting must not be null"); diff --git a/src/main/java/org/springframework/data/elasticsearch/core/query/Query.java b/src/main/java/org/springframework/data/elasticsearch/core/query/Query.java index d2fec076d..39ac66076 100644 --- a/src/main/java/org/springframework/data/elasticsearch/core/query/Query.java +++ b/src/main/java/org/springframework/data/elasticsearch/core/query/Query.java @@ -221,6 +221,7 @@ public interface Query { * * @return */ + @Nullable SearchType getSearchType(); /**