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.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 @@ public MsearchRequest searchMsearchRequest( 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 @@ public MsearchRequest searchMsearchRequest( 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 @@ private void prepareSearchRequest(Query query, @Nullable String routing, @Nu 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 @@ private void prepareSearchRequest(Query query, @Nullable String routing, @Nu 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 void setRoute(String route) { 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 List getIndicesBoost() { return indicesBoost; } + @Nullable public Query.SearchType getSearchType() { return searchType; } @@ -250,11 +251,11 @@ public SELF withMaxResults(Integer maxResults) { return self(); } - /** - * Set Ids for a multi-get request run with this query. Not used in any other searches. - * - * @param ids list of id values - */ + /** + * Set Ids for a multi-get request run with this query. Not used in any other searches. + * + * @param ids list of id values + */ public SELF withIds(String... ids) { this.ids.clear(); @@ -262,11 +263,11 @@ public SELF withIds(String... ids) { return self(); } - /** - * Set Ids for a multi-get request run with this query. Not used in any other searches. - * - * @param ids list of id values - */ + /** + * Set Ids for a multi-get request run with this query. Not used in any other searches. + * + * @param ids list of id values + */ public SELF withIds(Collection ids) { Assert.notNull(ids, "ids must not be null"); @@ -342,7 +343,7 @@ public SELF withIndicesBoost(IndexBoost... indicesBoost) { return self(); } - public SELF withSearchType(Query.SearchType searchType) { + public SELF withSearchType(@Nullable Query.SearchType searchType) { this.searchType = searchType; return self(); } @@ -382,12 +383,12 @@ public SELF withRequestCache(@Nullable Boolean requestCache) { return self(); } - /** - * Set Ids with routing values for a multi-get request run with this query. Not used in any other searches. - * - * @param idsWithRouting list of id values, must not be {@literal null} - * @since 4.3 - */ + /** + * Set Ids with routing values for a multi-get request run with this query. Not used in any other searches. + * + * @param idsWithRouting list of id values, must not be {@literal null} + * @since 4.3 + */ public SELF withIdsWithRouting(List 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 @@ static Query multiGetQuery(Collection ids) { * * @return */ + @Nullable SearchType getSearchType(); /**