Skip to content

Commit 5275cec

Browse files
committed
Updates the SearchRequest class to be non-final and adds a MilvusSearchRequest subclass that includes Milvus-specific fields for native expressions and search parameters.
- Updated `SearchRequest.java` to make the class non-final. - Added `MilvusSearchRequest` with specific Milvus parameters such as `nativeExpression` and `searchParamsJson`. - Modified `doSimilaritySearch` method in `MilvusVectorStore` to handle these new fields from `MilvusSearchRequest`. Signed-off-by: waileong <[email protected]>
1 parent ce8e8b9 commit 5275cec

File tree

3 files changed

+190
-4
lines changed

3 files changed

+190
-4
lines changed

spring-ai-core/src/main/java/org/springframework/ai/vectorstore/SearchRequest.java

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@
3333
* @author Thomas Vitale
3434
* @author Ilayaperumal Gopinathan
3535
*/
36-
public final class SearchRequest {
36+
public class SearchRequest {
3737

3838
/**
3939
* Similarity threshold that accepts all search scores. A threshold value of 0.0 means
@@ -71,6 +71,16 @@ public static Builder from(SearchRequest originalSearchRequest) {
7171
.filterExpression(originalSearchRequest.getFilterExpression());
7272
}
7373

74+
public SearchRequest() {
75+
}
76+
77+
protected SearchRequest(SearchRequest original) {
78+
this.query = original.query;
79+
this.topK = original.topK;
80+
this.similarityThreshold = original.similarityThreshold;
81+
this.filterExpression = original.filterExpression;
82+
}
83+
7484
public String getQuery() {
7585
return this.query;
7686
}
Lines changed: 162 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,162 @@
1+
package org.springframework.ai.vectorstore.milvus;
2+
3+
import org.springframework.ai.vectorstore.SearchRequest;
4+
import org.springframework.ai.vectorstore.filter.Filter;
5+
import org.springframework.lang.Nullable;
6+
7+
/**
8+
* A specialized {@link SearchRequest} for Milvus vector search, extending the base request
9+
* with Milvus-specific parameters.
10+
* <p>
11+
* This class introduces two additional fields:
12+
* <ul>
13+
* <li>{@code nativeExpression} - A native Milvus filter expression (e.g., "city LIKE 'New%'").</li>
14+
* <li>{@code searchParamsJson} - A JSON string containing search parameters (e.g., "{\"nprobe\":128}").</li>
15+
* </ul>
16+
* <p>
17+
* Use the {@link MilvusBuilder} to construct instances of this class.
18+
*
19+
* @author waileong
20+
*/
21+
public final class MilvusSearchRequest extends SearchRequest {
22+
23+
@Nullable
24+
private final String nativeExpression;
25+
26+
@Nullable
27+
private final String searchParamsJson;
28+
29+
/**
30+
* Private constructor to initialize a MilvusSearchRequest using the base request and builder.
31+
*
32+
* @param baseRequest The base {@link SearchRequest} containing standard search fields.
33+
* @param builder The {@link MilvusBuilder} containing Milvus-specific parameters.
34+
*/
35+
private MilvusSearchRequest(SearchRequest baseRequest, MilvusBuilder builder) {
36+
super(baseRequest); // Copy all standard fields
37+
this.nativeExpression = builder.nativeExpression;
38+
this.searchParamsJson = builder.searchParamsJson;
39+
}
40+
41+
/**
42+
* Retrieves the native Milvus filter expression.
43+
*
44+
* @return A string representing the native Milvus expression, or {@code null} if not set.
45+
*/
46+
@Nullable
47+
public String getNativeExpression() {
48+
return this.nativeExpression;
49+
}
50+
51+
/**
52+
* Retrieves the JSON-encoded search parameters.
53+
*
54+
* @return A JSON string containing search parameters, or {@code null} if not set.
55+
*/
56+
@Nullable
57+
public String getSearchParamsJson() {
58+
return this.searchParamsJson;
59+
}
60+
61+
/**
62+
* Creates a new {@link MilvusBuilder} for constructing a {@link MilvusSearchRequest}.
63+
*
64+
* @return A new {@link MilvusBuilder} instance.
65+
*/
66+
public static MilvusBuilder milvusBuilder() {
67+
return new MilvusBuilder();
68+
}
69+
70+
/**
71+
* Builder class for constructing instances of {@link MilvusSearchRequest}.
72+
*/
73+
public static class MilvusBuilder {
74+
75+
private final SearchRequest.Builder baseBuilder = SearchRequest.builder();
76+
77+
@Nullable
78+
private String nativeExpression;
79+
@Nullable
80+
private String searchParamsJson;
81+
82+
/**
83+
* {@link Builder#query(java.lang.String)}
84+
*/
85+
public MilvusBuilder query(String query) {
86+
this.baseBuilder.query(query);
87+
return this;
88+
}
89+
90+
/**
91+
* {@link Builder#topK(int)}
92+
*/
93+
public MilvusBuilder topK(int topK) {
94+
this.baseBuilder.topK(topK);
95+
return this;
96+
}
97+
98+
/**
99+
* {@link Builder#similarityThreshold(double)}
100+
*/
101+
public MilvusBuilder similarityThreshold(double threshold) {
102+
this.baseBuilder.similarityThreshold(threshold);
103+
return this;
104+
}
105+
106+
/**
107+
* {@link Builder#similarityThresholdAll()}
108+
*/
109+
public MilvusBuilder similarityThresholdAll() {
110+
this.baseBuilder.similarityThresholdAll();
111+
return this;
112+
}
113+
114+
/**
115+
* {@link Builder#filterExpression(String)}
116+
*/
117+
public MilvusBuilder filterExpression(String textExpression) {
118+
this.baseBuilder.filterExpression(textExpression);
119+
return this;
120+
}
121+
122+
/**
123+
* {@link Builder#filterExpression(Filter.Expression)}
124+
*/
125+
public MilvusBuilder filterExpression(Filter.Expression expression) {
126+
this.baseBuilder.filterExpression(expression);
127+
return this;
128+
}
129+
130+
/**
131+
* Sets the native Milvus filter expression.
132+
*
133+
* @param nativeExpression The native Milvus expression string.
134+
* @return This builder instance.
135+
*/
136+
public MilvusBuilder nativeExpression(String nativeExpression) {
137+
this.nativeExpression = nativeExpression;
138+
return this;
139+
}
140+
141+
/**
142+
* Sets the JSON-encoded search parameters.
143+
*
144+
* @param searchParamsJson A JSON string containing search parameters.
145+
* @return This builder instance.
146+
*/
147+
public MilvusBuilder searchParamsJson(String searchParamsJson) {
148+
this.searchParamsJson = searchParamsJson;
149+
return this;
150+
}
151+
152+
/**
153+
* Builds and returns a {@link MilvusSearchRequest} instance.
154+
*
155+
* @return A new {@link MilvusSearchRequest} object with the specified parameters.
156+
*/
157+
public MilvusSearchRequest build() {
158+
SearchRequest parentRequest = this.baseBuilder.build();
159+
return new MilvusSearchRequest(parentRequest, this);
160+
}
161+
}
162+
}

vector-stores/spring-ai-milvus-store/src/main/java/org/springframework/ai/vectorstore/milvus/MilvusVectorStore.java

Lines changed: 17 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -318,9 +318,19 @@ protected void doDelete(Filter.Expression filterExpression) {
318318

319319
@Override
320320
public List<Document> doSimilaritySearch(SearchRequest request) {
321-
322-
String nativeFilterExpressions = (request.getFilterExpression() != null)
323-
? this.filterExpressionConverter.convertExpression(request.getFilterExpression()) : "";
321+
String nativeFilterExpressions = "";
322+
String searchParamsJson = null;
323+
if (request instanceof MilvusSearchRequest milvusReq){
324+
if(milvusReq.getNativeExpression() != null && !milvusReq.getNativeExpression().isEmpty()) {
325+
nativeFilterExpressions = milvusReq.getNativeExpression();
326+
}
327+
if (milvusReq.getSearchParamsJson() != null && !milvusReq.getSearchParamsJson().isEmpty()) {
328+
searchParamsJson = milvusReq.getSearchParamsJson();
329+
}
330+
} else {
331+
nativeFilterExpressions = (request.getFilterExpression() != null)
332+
? this.filterExpressionConverter.convertExpression(request.getFilterExpression()) : "";
333+
}
324334

325335
Assert.notNull(request.getQuery(), "Query string must not be null");
326336
List<String> outFieldNames = new ArrayList<>();
@@ -343,6 +353,10 @@ public List<Document> doSimilaritySearch(SearchRequest request) {
343353
searchParamBuilder.withExpr(nativeFilterExpressions);
344354
}
345355

356+
if (StringUtils.hasText(searchParamsJson)) {
357+
searchParamBuilder.withParams(searchParamsJson);
358+
}
359+
346360
R<SearchResults> respSearch = this.milvusClient.search(searchParamBuilder.build());
347361

348362
if (respSearch.getException() != null) {

0 commit comments

Comments
 (0)