Skip to content

Commit 875c95b

Browse files
committed
Add hybrid parameter
1 parent 6204a82 commit 875c95b

File tree

3 files changed

+117
-0
lines changed

3 files changed

+117
-0
lines changed

src/main/java/com/meilisearch/sdk/SearchRequest.java

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package com.meilisearch.sdk;
22

3+
import com.meilisearch.sdk.model.Hybrid;
34
import com.meilisearch.sdk.model.MatchingStrategy;
45
import lombok.AccessLevel;
56
import lombok.AllArgsConstructor;
@@ -42,6 +43,7 @@ public class SearchRequest {
4243
protected Double rankingScoreThreshold;
4344
protected String[] locales;
4445
protected String distinct;
46+
protected Hybrid hybrid;
4547

4648
/**
4749
* Constructor for SearchRequest for building search queries with the default values: offset: 0,
@@ -106,6 +108,11 @@ public String toString() {
106108
.putOpt("locales", this.locales)
107109
.putOpt("distinct", this.distinct);
108110

111+
// Add hybrid parameter if it exists
112+
if (this.hybrid != null) {
113+
jsonObject.put("hybrid", this.hybrid.toJSONObject());
114+
}
115+
109116
return jsonObject.toString();
110117
}
111118
}
Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
package com.meilisearch.sdk.model;
2+
3+
import com.fasterxml.jackson.annotation.JsonInclude;
4+
import lombok.AccessLevel;
5+
import lombok.AllArgsConstructor;
6+
import lombok.Builder;
7+
import lombok.Getter;
8+
import lombok.NoArgsConstructor;
9+
import lombok.Setter;
10+
import lombok.experimental.Accessors;
11+
import org.json.JSONObject;
12+
13+
/** Hybrid search configuration */
14+
@Builder
15+
@AllArgsConstructor(access = AccessLevel.PACKAGE)
16+
@NoArgsConstructor(access = AccessLevel.PACKAGE)
17+
@Getter
18+
@Setter
19+
@Accessors(chain = true)
20+
@JsonInclude(JsonInclude.Include.NON_NULL)
21+
public class Hybrid {
22+
/** Semantic ratio for hybrid search (between 0 and 1) */
23+
private Double semanticRatio;
24+
25+
/** Embedder to use for hybrid search (mandatory if hybrid is set) */
26+
private String embedder;
27+
28+
/**
29+
* Method that returns the JSON representation of the Hybrid object
30+
*
31+
* @return JSONObject representation of the Hybrid object
32+
*/
33+
public JSONObject toJSONObject() {
34+
return new JSONObject()
35+
.putOpt("semanticRatio", this.semanticRatio)
36+
.putOpt("embedder", this.embedder);
37+
}
38+
39+
/**
40+
* Method that returns the JSON String of the Hybrid object
41+
*
42+
* @return JSON String of the Hybrid object
43+
*/
44+
@Override
45+
public String toString() {
46+
return toJSONObject().toString();
47+
}
48+
}

src/test/java/com/meilisearch/sdk/SearchRequestTest.java

Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
import static org.hamcrest.Matchers.is;
66
import static org.hamcrest.Matchers.nullValue;
77

8+
import com.meilisearch.sdk.model.Hybrid;
89
import com.meilisearch.sdk.model.MatchingStrategy;
910
import org.junit.jupiter.api.Test;
1011

@@ -363,4 +364,65 @@ void toStringEveryParametersWithArrayMatchingStrategyNull() {
363364
assertThat(classToTest.getDistinct(), is(equalTo("distinct")));
364365
assertThat(classToTest.toString(), is(equalTo(expectedToString)));
365366
}
367+
368+
@Test
369+
void toStringWithHybrid() {
370+
Hybrid hybrid = Hybrid.builder().semanticRatio(0.5).embedder("default").build();
371+
372+
SearchRequest classToTest = new SearchRequest("This is a Test").setHybrid(hybrid);
373+
374+
String expected =
375+
"{\"q\":\"This is a Test\",\"hybrid\":{\"semanticRatio\":0.5,\"embedder\":\"default\"}}";
376+
assertThat(classToTest.toString(), is(equalTo(expected)));
377+
378+
// Verify getters
379+
assertThat(classToTest.getHybrid().getSemanticRatio(), is(equalTo(0.5)));
380+
assertThat(classToTest.getHybrid().getEmbedder(), is(equalTo("default")));
381+
}
382+
383+
@Test
384+
void toStringWithHybridUsingBuilder() {
385+
SearchRequest classToTest =
386+
SearchRequest.builder()
387+
.q("This is a Test")
388+
.hybrid(Hybrid.builder().semanticRatio(0.5).embedder("default").build())
389+
.build();
390+
391+
String expected =
392+
"{\"q\":\"This is a Test\",\"hybrid\":{\"semanticRatio\":0.5,\"embedder\":\"default\"}}";
393+
assertThat(classToTest.toString(), is(equalTo(expected)));
394+
395+
// Verify getters
396+
assertThat(classToTest.getHybrid().getSemanticRatio(), is(equalTo(0.5)));
397+
assertThat(classToTest.getHybrid().getEmbedder(), is(equalTo("default")));
398+
}
399+
400+
@Test
401+
void toStringWithHybridAndOtherParameters() {
402+
SearchRequest classToTest =
403+
SearchRequest.builder()
404+
.q("This is a Test")
405+
.offset(200)
406+
.limit(900)
407+
.hybrid(
408+
Hybrid.builder()
409+
.semanticRatio(0.7)
410+
.embedder("custom-embedder")
411+
.build())
412+
.build();
413+
414+
String expected =
415+
"{\"q\":\"This is a Test\",\"hybrid\":{\"semanticRatio\":0.7,\"embedder\":\"custom-embedder\"},\"offset\":200,\"limit\":900}";
416+
assertThat(classToTest.toString(), is(equalTo(expected)));
417+
}
418+
419+
@Test
420+
void toStringWithHybridOnlyEmbedder() {
421+
SearchRequest classToTest =
422+
new SearchRequest("This is a Test")
423+
.setHybrid(Hybrid.builder().embedder("default").build());
424+
425+
String expected = "{\"q\":\"This is a Test\",\"hybrid\":{\"embedder\":\"default\"}}";
426+
assertThat(classToTest.toString(), is(equalTo(expected)));
427+
}
366428
}

0 commit comments

Comments
 (0)