diff --git a/src/main/java/com/meilisearch/sdk/Client.java b/src/main/java/com/meilisearch/sdk/Client.java index e2e5f2eb..ef925c1c 100644 --- a/src/main/java/com/meilisearch/sdk/Client.java +++ b/src/main/java/com/meilisearch/sdk/Client.java @@ -22,6 +22,7 @@ import com.meilisearch.sdk.model.TasksQuery; import com.meilisearch.sdk.model.TasksResults; import java.util.Date; +import java.util.HashMap; import java.util.Map; import java.util.TimeZone; import java.util.UUID; @@ -428,6 +429,18 @@ public void deleteKey(String key) throws MeilisearchException { this.keysHandler.deleteKey(key); } + /* + * Method overloading the multi search method to add federation parameter + */ + public MultiSearchResult multiSearch( + MultiSearchRequest search, MultiSearchFederation federation) + throws MeilisearchException { + Map payload = new HashMap<>(); + payload.put("queries", search.getQueries()); + payload.put("federation", federation); + return this.config.httpClient.post("/multi-search", payload, MultiSearchResult.class); + } + public Results multiSearch(MultiSearchRequest search) throws MeilisearchException { return this.config.httpClient.post( diff --git a/src/main/java/com/meilisearch/sdk/FederationOptions.java b/src/main/java/com/meilisearch/sdk/FederationOptions.java new file mode 100644 index 00000000..d2df5b7d --- /dev/null +++ b/src/main/java/com/meilisearch/sdk/FederationOptions.java @@ -0,0 +1,24 @@ +package com.meilisearch.sdk; + +import org.json.JSONObject; + +public class FederationOptions { + + private Double weight; + + public FederationOptions setWeight(Double weight) { + this.weight = weight; + return this; + } + + /** + * Method that returns the JSON String of the FederationOptions + * + * @return JSON String of the FederationOptions + */ + @Override + public String toString() { + JSONObject jsonObject = new JSONObject().put("weight", this.weight); + return jsonObject.toString(); + } +} diff --git a/src/main/java/com/meilisearch/sdk/IndexSearchRequest.java b/src/main/java/com/meilisearch/sdk/IndexSearchRequest.java index ee276f7a..da46db0e 100644 --- a/src/main/java/com/meilisearch/sdk/IndexSearchRequest.java +++ b/src/main/java/com/meilisearch/sdk/IndexSearchRequest.java @@ -34,6 +34,7 @@ public class IndexSearchRequest { protected Boolean showRankingScore; protected Boolean showRankingScoreDetails; protected Double rankingScoreThreshold; + private FederationOptions federationOptions; /** * Constructor for MultiSearchRequest for building search queries with the default values: @@ -87,6 +88,11 @@ public String toString() { .put("sort", this.sort) .put("page", this.page) .put("hitsPerPage", this.hitsPerPage) + .put( + "federationOptions", + this.federationOptions != null + ? this.federationOptions.toString() + : null) .putOpt("attributesToCrop", this.attributesToCrop) .putOpt("attributesToHighlight", this.attributesToHighlight) .putOpt("filter", this.filter) diff --git a/src/main/java/com/meilisearch/sdk/MultiSearchFederation.java b/src/main/java/com/meilisearch/sdk/MultiSearchFederation.java new file mode 100644 index 00000000..ecaeabc6 --- /dev/null +++ b/src/main/java/com/meilisearch/sdk/MultiSearchFederation.java @@ -0,0 +1,39 @@ +package com.meilisearch.sdk; + +import org.json.JSONObject; + +public class MultiSearchFederation { + + private Integer limit; + private Integer offset; + + public MultiSearchFederation setLimit(Integer limit) { + this.limit = limit; + return this; + } + + public MultiSearchFederation setOffset(Integer offset) { + this.offset = offset; + return this; + } + + public Integer getLimit() { + return this.limit; + } + + public Integer getOffset() { + return this.offset; + } + + /** + * Method that returns the JSON String of the MultiSearchFederation + * + * @return JSON String of the MultiSearchFederation + */ + @Override + public String toString() { + JSONObject jsonObject = + new JSONObject().put("limit", this.limit).put("offset", this.offset); + return jsonObject.toString(); + } +} diff --git a/src/main/java/com/meilisearch/sdk/MultiSearchRequest.java b/src/main/java/com/meilisearch/sdk/MultiSearchRequest.java index e0033512..3ce3ed8f 100644 --- a/src/main/java/com/meilisearch/sdk/MultiSearchRequest.java +++ b/src/main/java/com/meilisearch/sdk/MultiSearchRequest.java @@ -10,6 +10,13 @@ public MultiSearchRequest() { this.queries = new ArrayList(); } + /* + * Method to get Queries as a list + */ + public ArrayList getQueries() { + return this.queries; + } + /** * Method to add new Query * diff --git a/src/test/java/com/meilisearch/integration/SearchTest.java b/src/test/java/com/meilisearch/integration/SearchTest.java index d92117bd..1c7bf4dd 100644 --- a/src/test/java/com/meilisearch/integration/SearchTest.java +++ b/src/test/java/com/meilisearch/integration/SearchTest.java @@ -795,6 +795,42 @@ public void testMultiSearch() throws Exception { } } + /* + * Test the federation parameter in multi search method + */ + @Test + public void testFederation() throws Exception { + HashSet indexUids = new HashSet(); + indexUids.add("MultiSearch1"); + indexUids.add("MultiSearch2"); + for (String indexUid : indexUids) { + Index index = client.index(indexUid); + + TestData testData = this.getTestData(MOVIES_INDEX, Movie.class); + TaskInfo task = index.addDocuments(testData.getRaw()); + + index.waitForTask(task.getTaskUid()); + } + MultiSearchRequest search = new MultiSearchRequest(); + search.addQuery(new IndexSearchRequest("MultiSearch1").setQuery("batman")); + search.addQuery( + new IndexSearchRequest("MultiSearch2") + .setQuery("batman") + .setFederationOptions(new FederationOptions().setWeight(0.9))); + + MultiSearchFederation federation = new MultiSearchFederation(); + federation.setLimit(2); + MultiSearchResult results = client.multiSearch(search, federation); + + assertThat(results.getEstimatedTotalHits(), is(2)); + assertThat(results.getLimit(), is(2)); + ArrayList> hits = results.getHits(); + assertThat(hits, hasSize(2)); + for (HashMap record : hits) { + assertThat(record.containsKey("_federation"), is(true)); + } + } + /** Test multisearch with ranking score threshold */ @Test public void testMultiSearchWithRankingScoreThreshold() throws Exception {