Skip to content

Commit 8eb65c6

Browse files
committed
Deprecate the _knn_search endpoint (#88828)
This change deprecates the kNN search API in favor of the new 'knn' option inside the search API. The 'knn' option is now the preferred way of performing kNN search. Relates to #87625
1 parent a1ff9c3 commit 8eb65c6

File tree

7 files changed

+72
-10
lines changed

7 files changed

+72
-10
lines changed

docs/changelog/88828.yaml

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
pr: 88828
2+
summary: Deprecate the `_knn_search` endpoint
3+
area: Vector Search
4+
type: deprecation
5+
issues: []
6+
deprecation:
7+
title: Deprecate the `_knn_search` endpoint
8+
area: REST API
9+
details: -|
10+
The kNN search API is deprecated in favor of the new 'knn' option
11+
inside the search API. The 'knn' option is now the recommended way of running
12+
ANN search.
13+
impact: Users should switch from `_knn_search` to the search `knn` option.

docs/reference/search.asciidoc

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,6 @@ exception of the <<search-explain,explain API>>.
1515
* <<search-multi-search>>
1616
* <<async-search>>
1717
* <<point-in-time-api>>
18-
* <<knn-search-api>>
1918
* <<search-suggesters>>
2019
* <<search-terms-enum>>
2120
* <<scroll-api>>

docs/reference/search/knn-search.asciidoc

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,8 @@
44
<titleabbrev>kNN search</titleabbrev>
55
++++
66

7+
deprecated::[8.4.0,"The kNN search API has been replaced by the <<<<search-api-knn, `knn` option>> in the search API."]
78
experimental::[]
8-
99
Performs a k-nearest neighbor (kNN) search and returns the matching documents.
1010

1111
////
@@ -46,6 +46,7 @@ GET my-index/_knn_search
4646
}
4747
----
4848
// TEST[continued]
49+
// TEST[warning:The kNN search API has been replaced by the `knn` option in the search API.]
4950

5051
[[knn-search-api-request]]
5152
==== {api-request-title}

rest-api-spec/src/yamlRestTest/resources/rest-api-spec/test/search.vectors/40_knn_search.yml

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -160,7 +160,11 @@ setup:
160160

161161
---
162162
"kNN search in _knn_search endpoint":
163+
- skip:
164+
features: ["allowed_warnings"]
163165
- do:
166+
allowed_warnings:
167+
- "The kNN search API has been replaced by the `knn` option in the search API."
164168
knn_search:
165169
index: test
166170
body:
@@ -182,7 +186,10 @@ setup:
182186
- skip:
183187
version: ' - 8.1.99'
184188
reason: 'kNN with filtering added in 8.2'
189+
features: ["allowed_warnings"]
185190
- do:
191+
allowed_warnings:
192+
- "The kNN search API has been replaced by the `knn` option in the search API."
186193
knn_search:
187194
index: test
188195
body:
@@ -201,6 +208,8 @@ setup:
201208
- match: {hits.hits.0.fields.name.0: "rabbit.jpg"}
202209

203210
- do:
211+
allowed_warnings:
212+
- "The kNN search API has been replaced by the `knn` option in the search API."
204213
knn_search:
205214
index: test
206215
body:

rest-api-spec/src/yamlRestTest/resources/rest-api-spec/test/search.vectors/50_dense_vector_field_usage.yml

Lines changed: 2 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ setup:
2424
- do:
2525
index:
2626
index: futest
27+
id: "1"
2728
body:
2829
name: cow.jpg
2930
vector: [ 230.0, 300.33, -34.8988, 15.555, -200.0 ]
@@ -53,7 +54,7 @@ setup:
5354
version: ' - 8.0.99'
5455
reason: 'dense_vector field usage was added in 8.1'
5556
- do:
56-
knn_search:
57+
search:
5758
index: futest
5859
body:
5960
fields: [ "name" ]
@@ -63,12 +64,6 @@ setup:
6364
k: 2
6465
num_candidates: 3
6566

66-
- match: {hits.hits.0._id: "2"}
67-
- match: {hits.hits.0.fields.name.0: "moose.jpg"}
68-
69-
- match: {hits.hits.1._id: "3"}
70-
- match: {hits.hits.1.fields.name.0: "rabbit.jpg"}
71-
7267
- do:
7368
indices.field_usage_stats: { index: futest }
7469

server/src/main/java/org/elasticsearch/rest/action/search/RestKnnSearchAction.java

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010

1111
import org.elasticsearch.action.search.SearchRequestBuilder;
1212
import org.elasticsearch.client.internal.node.NodeClient;
13+
import org.elasticsearch.core.RestApiVersion;
1314
import org.elasticsearch.rest.BaseRestHandler;
1415
import org.elasticsearch.rest.RestRequest;
1516
import org.elasticsearch.rest.action.RestCancellableNodeClient;
@@ -28,11 +29,16 @@
2829
*/
2930
public class RestKnnSearchAction extends BaseRestHandler {
3031

32+
static final String DEPRECATION_MESSAGE = "The kNN search API has been replaced by the `knn` option in the search API.";
33+
3134
public RestKnnSearchAction() {}
3235

3336
@Override
3437
public List<Route> routes() {
35-
return List.of(new Route(GET, "{index}/_knn_search"), new Route(POST, "{index}/_knn_search"));
38+
return List.of(
39+
Route.builder(GET, "{index}/_knn_search").deprecated(DEPRECATION_MESSAGE, RestApiVersion.V_8).build(),
40+
Route.builder(POST, "{index}/_knn_search").deprecated(DEPRECATION_MESSAGE, RestApiVersion.V_8).build()
41+
);
3642
}
3743

3844
@Override
Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
/*
2+
* Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one
3+
* or more contributor license agreements. Licensed under the Elastic License
4+
* 2.0 and the Server Side Public License, v 1; you may not use this file except
5+
* in compliance with, at your election, the Elastic License 2.0 or the Server
6+
* Side Public License, v 1.
7+
*/
8+
package org.elasticsearch.rest.action.search;
9+
10+
import org.elasticsearch.core.RestApiVersion;
11+
import org.elasticsearch.rest.RestRequest;
12+
import org.elasticsearch.test.rest.FakeRestRequest;
13+
import org.elasticsearch.test.rest.RestActionTestCase;
14+
import org.junit.Before;
15+
16+
import java.util.Collections;
17+
import java.util.List;
18+
import java.util.Map;
19+
20+
public class RestKnnSearchActionTests extends RestActionTestCase {
21+
private List<String> contentTypeHeader;
22+
private RestKnnSearchAction action;
23+
24+
@Before
25+
public void setUpAction() {
26+
action = new RestKnnSearchAction();
27+
controller().registerHandler(action);
28+
contentTypeHeader = Collections.singletonList(randomCompatibleMediaType(RestApiVersion.V_8));
29+
}
30+
31+
public void testDeprecation() {
32+
RestRequest request = new FakeRestRequest.Builder(xContentRegistry()).withHeaders(
33+
Map.of("Content-Type", contentTypeHeader, "Accept", contentTypeHeader)
34+
).withMethod(RestRequest.Method.GET).withPath("/some_index/_knn_search").build();
35+
36+
dispatchRequest(request);
37+
assertCriticalWarnings(RestKnnSearchAction.DEPRECATION_MESSAGE);
38+
}
39+
}

0 commit comments

Comments
 (0)