From 7433bbb7caa75f48b2b8267d2e6d29b9e58d5f4d Mon Sep 17 00:00:00 2001 From: Balazs Barabas Date: Fri, 25 Oct 2024 20:24:06 +0300 Subject: [PATCH 1/8] added the search parameter and wrote test for it --- .../com/meilisearch/sdk/SearchRequest.java | 4 ++- .../meilisearch/integration/SearchTest.java | 27 +++++++++++++++++++ 2 files changed, 30 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/meilisearch/sdk/SearchRequest.java b/src/main/java/com/meilisearch/sdk/SearchRequest.java index 25be1b3c..556e38cc 100644 --- a/src/main/java/com/meilisearch/sdk/SearchRequest.java +++ b/src/main/java/com/meilisearch/sdk/SearchRequest.java @@ -40,6 +40,7 @@ public class SearchRequest { protected Boolean showRankingScore; protected Boolean showRankingScoreDetails; protected Double rankingScoreThreshold; + protected String distinct; /** * Constructor for SearchRequest for building search queries with the default values: offset: 0, @@ -100,7 +101,8 @@ public String toString() { .putOpt("filter", this.filterArray) .putOpt("showRankingScore", this.showRankingScore) .putOpt("showRankingScoreDetails", this.showRankingScoreDetails) - .putOpt("rankingScoreThreshold", this.rankingScoreThreshold); + .putOpt("rankingScoreThreshold", this.rankingScoreThreshold) + .putOpt("distinct", this.distinct); return jsonObject.toString(); } diff --git a/src/test/java/com/meilisearch/integration/SearchTest.java b/src/test/java/com/meilisearch/integration/SearchTest.java index 1c7bf4dd..16f2e872 100644 --- a/src/test/java/com/meilisearch/integration/SearchTest.java +++ b/src/test/java/com/meilisearch/integration/SearchTest.java @@ -410,6 +410,33 @@ public void testSearchWithRankingScoreThreshold() throws Exception { assertThat(resGson.hits[0].getRankingScore(), is(greaterThanOrEqualTo(0.9))); } + /**Test with show distinct */ + @Test + public void testSearchWithDistinct() throws Exception { + String indexUid = "SearchDistinct"; + Index index = client.index(indexUid); + GsonJsonHandler jsonGson = new GsonJsonHandler(); + + TestData testData = this.getTestData(MOVIES_INDEX, Movie.class); + TaskInfo task = index.addDocuments(testData.getRaw()); + + index.waitForTask(task.getTaskUid()); + + Settings settings = index.getSettings(); + + settings.setFilterableAttributes(new String[] {"language"}); + index.waitForTask(index.updateSettings(settings).getTaskUid()); + + SearchRequest searchRequest = + SearchRequest.builder() + .q("") + .distinct("language") + .build(); + + Results resGson = jsonGson.decode(index.rawSearch(searchRequest), Results.class); + assertThat(resGson.hits, is(arrayWithSize(4))); + } + /** Test search with phrase */ @Test public void testSearchPhrase() throws Exception { From b45e8f6f4c1373f4ea713545767367a2a8a6f31e Mon Sep 17 00:00:00 2001 From: Balazs Barabas Date: Fri, 25 Oct 2024 21:12:44 +0300 Subject: [PATCH 2/8] updated code samples --- .code-samples.meilisearch.yaml | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/.code-samples.meilisearch.yaml b/.code-samples.meilisearch.yaml index 8bc5668f..aece0ac2 100644 --- a/.code-samples.meilisearch.yaml +++ b/.code-samples.meilisearch.yaml @@ -423,6 +423,16 @@ search_parameter_guide_show_ranking_score_details_1: |- search_parameter_reference_ranking_score_threshold_1: |- SearchRequest searchRequest = SearchRequest.builder().q("badman").rankingScoreThreshold(0.2).build(); client.index("INDEX_NAME").search(searchRequest); +search_parameter_reference_distinct_1: |- + SearchRequest searchRequest = SearchRequest.builder().q("QUERY TERMS").distinct("ATTRIBUTE_A").build(); + client.index("INDEX_NAME").search(searchRequest); +distinct_attribute_guide_filterable_1: |- + Settings settings = new Settings(); + settings.setFilterableAttributes(new String[] {"language", "title"}); + client.index("movies").updateSettings(settings); +distinct_attribute_guide_distinct_parameter_1: |- + SearchRequest searchRequest = SearchRequest.builder().q("and").distinct("language").build(); + client.index("movies").search(searchRequest); synonyms_guide_1: |- HashMap synonyms = new HashMap(); synonyms.put("great", new String[] {"fantastic"}); From 99dec651355a219a74027f864c50b86178aa6aa4 Mon Sep 17 00:00:00 2001 From: Balazs Barabas Date: Fri, 25 Oct 2024 21:42:48 +0300 Subject: [PATCH 3/8] added distinct to multisearch as well --- .../meilisearch/sdk/IndexSearchRequest.java | 5 ++- .../meilisearch/integration/SearchTest.java | 40 +++++++++++++++++++ 2 files changed, 44 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/meilisearch/sdk/IndexSearchRequest.java b/src/main/java/com/meilisearch/sdk/IndexSearchRequest.java index b4671fae..f13d81d8 100644 --- a/src/main/java/com/meilisearch/sdk/IndexSearchRequest.java +++ b/src/main/java/com/meilisearch/sdk/IndexSearchRequest.java @@ -36,12 +36,14 @@ public class IndexSearchRequest { protected Double rankingScoreThreshold; private String[] attributesToSearchOn; private FederationOptions federationOptions; + protected String distinct; /** * Constructor for MultiSearchRequest for building search queries with the default values: * offset: 0, limit: 20, attributesToRetrieve: ["*"], attributesToCrop: null, cropLength: 200, * attributesToHighlight: null, filter: null, showMatchesPosition: false, facets: null, sort: * null, showRankingScore: false, showRankingScoreDetails: false, rankingScoreThreshold: null + * distinct: null * * @param indexUid uid of the requested index String */ @@ -101,7 +103,8 @@ public String toString() { .putOpt("showRankingScore", this.showRankingScore) .putOpt("showRankingScoreDetails", this.showRankingScoreDetails) .putOpt("rankingScoreThreshold", this.rankingScoreThreshold) - .putOpt("attributesToSearchOn", this.attributesToSearchOn); + .putOpt("attributesToSearchOn", this.attributesToSearchOn) + .putOpt("distinct", this.distinct); return jsonObject.toString(); } diff --git a/src/test/java/com/meilisearch/integration/SearchTest.java b/src/test/java/com/meilisearch/integration/SearchTest.java index 16f2e872..0b68574f 100644 --- a/src/test/java/com/meilisearch/integration/SearchTest.java +++ b/src/test/java/com/meilisearch/integration/SearchTest.java @@ -898,6 +898,46 @@ public void testMultiSearchWithRankingScoreThreshold() throws Exception { } } + /** Test multisearch with distinct */ + @Test + public void testMultiSearchWithDistinct() 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()); + + Settings settings = new Settings(); + settings.setFilterableAttributes(new String[] {"language", "title"}); + + index.waitForTask(index.updateSettings(settings).getTaskUid()); + + index.waitForTask(task.getTaskUid()); + } + + MultiSearchRequest search = new MultiSearchRequest(); + + for (String indexUid : indexUids) { + search.addQuery( + new IndexSearchRequest(indexUid) + .setQuery("") + .setDistinct("language")); + } + + MultiSearchResult[] results = client.multiSearch(search).getResults(); + + assertThat(results.length, is(2)); + + for (MultiSearchResult searchResult : results) { + assertThat(indexUids.contains(searchResult.getIndexUid()), is(true)); + assertThat(searchResult.getHits().size(), is(4)); + } + } + @Test public void testSimilarDocuments() throws Exception { HashMap features = new HashMap(); From 8969e8d4a9ca52ace642dcdd27a67adc65c39ca1 Mon Sep 17 00:00:00 2001 From: Balazs Barabas Date: Fri, 25 Oct 2024 21:59:16 +0300 Subject: [PATCH 4/8] updated to string requests --- .../meilisearch/sdk/SearchRequestTest.java | 20 ++++++++++++++----- 1 file changed, 15 insertions(+), 5 deletions(-) diff --git a/src/test/java/com/meilisearch/sdk/SearchRequestTest.java b/src/test/java/com/meilisearch/sdk/SearchRequestTest.java index fc1b648c..7578596b 100644 --- a/src/test/java/com/meilisearch/sdk/SearchRequestTest.java +++ b/src/test/java/com/meilisearch/sdk/SearchRequestTest.java @@ -133,7 +133,8 @@ void toStringEveryParameters() { .setFacets(new String[] {"facets"}) .setSort(new String[] {"sort"}) .setPage(10) - .setHitsPerPage(2); + .setHitsPerPage(2) + .setDistinct("distinct"); assertThat(classToTest.getQ(), is(equalTo("This is a Test"))); assertThat(classToTest.getOffset(), is(equalTo(200))); @@ -153,6 +154,7 @@ void toStringEveryParameters() { assertThat(classToTest.getCropLength(), is(equalTo(900))); assertThat(classToTest.getPage(), is(equalTo(10))); assertThat(classToTest.getHitsPerPage(), is(equalTo(2))); + assertThat(classToTest.getDistinct(), is(equalTo("distinct"))); } @Test @@ -172,6 +174,7 @@ void toStringEveryParametersWithBuilder() { .sort(new String[] {"sort"}) .page(10) .hitsPerPage(2) + .distinct("distinct") .build(); assertThat(classToTest.getQ(), is(equalTo("This is a Test"))); @@ -192,6 +195,7 @@ void toStringEveryParametersWithBuilder() { assertThat(classToTest.getCropLength(), is(equalTo(900))); assertThat(classToTest.getPage(), is(equalTo(10))); assertThat(classToTest.getHitsPerPage(), is(equalTo(2))); + assertThat(classToTest.getDistinct(), is(equalTo("distinct"))); } @Test @@ -217,9 +221,10 @@ void toStringEveryParametersWithArray() { .setFacets(new String[] {"facets"}) .setSort(new String[] {"sort"}) .setPage(0) - .setHitsPerPage(0); + .setHitsPerPage(0) + .setDistinct("distinct"); String expectedToString = - "{\"attributesToRetrieve\":[\"bubble\"],\"offset\":200,\"cropMarker\":\"123\",\"hitsPerPage\":0,\"attributesToSearchOn\":[\"searchOn\"],\"sort\":[\"sort\"],\"highlightPreTag\":\"abc\",\"facets\":[\"facets\"],\"filter\":[[\"test='test'\"],[\"test1='test1'\"]],\"q\":\"This is a Test\",\"matchingStrategy\":\"all\",\"showMatchesPosition\":true,\"limit\":900,\"cropLength\":900,\"highlightPostTag\":\"zyx\",\"attributesToHighlight\":[\"highlight\"],\"page\":0,\"attributesToCrop\":[\"crop\"]}"; + "{\"attributesToRetrieve\":[\"bubble\"],\"offset\":200,\"cropMarker\":\"123\",\"hitsPerPage\":0,\"attributesToSearchOn\":[\"searchOn\"],\"distinct\":\"distinct\",\"sort\":[\"sort\"],\"highlightPreTag\":\"abc\",\"facets\":[\"facets\"],\"filter\":[[\"test='test'\"],[\"test1='test1'\"]],\"q\":\"This is a Test\",\"matchingStrategy\":\"all\",\"showMatchesPosition\":true,\"limit\":900,\"cropLength\":900,\"highlightPostTag\":\"zyx\",\"attributesToHighlight\":[\"highlight\"],\"page\":0,\"attributesToCrop\":[\"crop\"]}"; assertThat(classToTest.getQ(), is(equalTo("This is a Test"))); assertThat(classToTest.getOffset(), is(equalTo(200))); @@ -241,6 +246,7 @@ void toStringEveryParametersWithArray() { assertThat(classToTest.getCropLength(), is(equalTo(900))); assertThat(classToTest.getPage(), is(equalTo(0))); assertThat(classToTest.getHitsPerPage(), is(equalTo(0))); + assertThat(classToTest.getDistinct(), is(equalTo("distinct"))); assertThat(classToTest.toString(), is(equalTo(expectedToString))); } @@ -269,9 +275,10 @@ void toStringEveryParametersWithArrayWithBuilder() { .sort(new String[] {"sort"}) .page(0) .hitsPerPage(0) + .distinct("distinct") .build(); String expectedToString = - "{\"attributesToRetrieve\":[\"bubble\"],\"offset\":200,\"cropMarker\":\"123\",\"hitsPerPage\":0,\"attributesToSearchOn\":[\"searchOn\"],\"sort\":[\"sort\"],\"highlightPreTag\":\"abc\",\"facets\":[\"facets\"],\"filter\":[[\"test='test'\"],[\"test1='test1'\"]],\"q\":\"This is a Test\",\"matchingStrategy\":\"all\",\"showMatchesPosition\":true,\"limit\":900,\"cropLength\":900,\"highlightPostTag\":\"zyx\",\"attributesToHighlight\":[\"highlight\"],\"page\":0,\"attributesToCrop\":[\"crop\"]}"; + "{\"attributesToRetrieve\":[\"bubble\"],\"offset\":200,\"cropMarker\":\"123\",\"hitsPerPage\":0,\"attributesToSearchOn\":[\"searchOn\"],\"distinct\":\"distinct\",\"sort\":[\"sort\"],\"highlightPreTag\":\"abc\",\"facets\":[\"facets\"],\"filter\":[[\"test='test'\"],[\"test1='test1'\"]],\"q\":\"This is a Test\",\"matchingStrategy\":\"all\",\"showMatchesPosition\":true,\"limit\":900,\"cropLength\":900,\"highlightPostTag\":\"zyx\",\"attributesToHighlight\":[\"highlight\"],\"page\":0,\"attributesToCrop\":[\"crop\"]}"; assertThat(classToTest.getQ(), is(equalTo("This is a Test"))); assertThat(classToTest.getOffset(), is(equalTo(200))); @@ -293,6 +300,7 @@ void toStringEveryParametersWithArrayWithBuilder() { assertThat(classToTest.getCropLength(), is(equalTo(900))); assertThat(classToTest.getPage(), is(equalTo(0))); assertThat(classToTest.getHitsPerPage(), is(equalTo(0))); + assertThat(classToTest.getDistinct(), is(equalTo("distinct"))); assertThat(classToTest.toString(), is(equalTo(expectedToString))); } @@ -321,9 +329,10 @@ void toStringEveryParametersWithArrayMatchingStrategyNull() { .sort(new String[] {"sort"}) .page(0) .hitsPerPage(0) + .distinct("distinct") .build(); String expectedToString = - "{\"attributesToRetrieve\":[\"bubble\"],\"offset\":200,\"cropMarker\":\"123\",\"hitsPerPage\":0,\"attributesToSearchOn\":[\"searchOn\"],\"sort\":[\"sort\"],\"highlightPreTag\":\"abc\",\"facets\":[\"facets\"],\"filter\":[[\"test='test'\"],[\"test1='test1'\"]],\"q\":\"This is a Test\",\"showMatchesPosition\":true,\"limit\":900,\"cropLength\":900,\"highlightPostTag\":\"zyx\",\"attributesToHighlight\":[\"highlight\"],\"page\":0,\"attributesToCrop\":[\"crop\"]}"; + "{\"attributesToRetrieve\":[\"bubble\"],\"offset\":200,\"cropMarker\":\"123\",\"hitsPerPage\":0,\"attributesToSearchOn\":[\"searchOn\"],\"distinct\":\"distinct\",\"sort\":[\"sort\"],\"highlightPreTag\":\"abc\",\"facets\":[\"facets\"],\"filter\":[[\"test='test'\"],[\"test1='test1'\"]],\"q\":\"This is a Test\",\"showMatchesPosition\":true,\"limit\":900,\"cropLength\":900,\"highlightPostTag\":\"zyx\",\"attributesToHighlight\":[\"highlight\"],\"page\":0,\"attributesToCrop\":[\"crop\"]}"; assertThat(classToTest.getQ(), is(equalTo("This is a Test"))); assertThat(classToTest.getOffset(), is(equalTo(200))); @@ -343,6 +352,7 @@ void toStringEveryParametersWithArrayMatchingStrategyNull() { assertThat(classToTest.getFacets()[0], is(equalTo("facets"))); assertThat(classToTest.getSort()[0], is(equalTo("sort"))); assertThat(classToTest.getCropLength(), is(equalTo(900))); + assertThat(classToTest.getDistinct(), is(equalTo("distinct"))); assertThat(classToTest.toString(), is(equalTo(expectedToString))); } } From 74a45ca529312755ae5559308a6dc219dcca88f9 Mon Sep 17 00:00:00 2001 From: Balazs Barabas Date: Fri, 25 Oct 2024 22:06:17 +0300 Subject: [PATCH 5/8] ran linter --- .../meilisearch/integration/SearchTest.java | 23 +++++++------------ 1 file changed, 8 insertions(+), 15 deletions(-) diff --git a/src/test/java/com/meilisearch/integration/SearchTest.java b/src/test/java/com/meilisearch/integration/SearchTest.java index 0b68574f..e4d8adaa 100644 --- a/src/test/java/com/meilisearch/integration/SearchTest.java +++ b/src/test/java/com/meilisearch/integration/SearchTest.java @@ -410,9 +410,9 @@ public void testSearchWithRankingScoreThreshold() throws Exception { assertThat(resGson.hits[0].getRankingScore(), is(greaterThanOrEqualTo(0.9))); } - /**Test with show distinct */ - @Test - public void testSearchWithDistinct() throws Exception { + /** Test with show distinct */ + @Test + public void testSearchWithDistinct() throws Exception { String indexUid = "SearchDistinct"; Index index = client.index(indexUid); GsonJsonHandler jsonGson = new GsonJsonHandler(); @@ -427,14 +427,10 @@ public void testSearchWithDistinct() throws Exception { settings.setFilterableAttributes(new String[] {"language"}); index.waitForTask(index.updateSettings(settings).getTaskUid()); - SearchRequest searchRequest = - SearchRequest.builder() - .q("") - .distinct("language") - .build(); + SearchRequest searchRequest = SearchRequest.builder().q("").distinct("language").build(); Results resGson = jsonGson.decode(index.rawSearch(searchRequest), Results.class); - assertThat(resGson.hits, is(arrayWithSize(4))); + assertThat(resGson.hits, is(arrayWithSize(4))); } /** Test search with phrase */ @@ -922,10 +918,7 @@ public void testMultiSearchWithDistinct() throws Exception { MultiSearchRequest search = new MultiSearchRequest(); for (String indexUid : indexUids) { - search.addQuery( - new IndexSearchRequest(indexUid) - .setQuery("") - .setDistinct("language")); + search.addQuery(new IndexSearchRequest(indexUid).setQuery("").setDistinct("language")); } MultiSearchResult[] results = client.multiSearch(search).getResults(); @@ -933,8 +926,8 @@ public void testMultiSearchWithDistinct() throws Exception { assertThat(results.length, is(2)); for (MultiSearchResult searchResult : results) { - assertThat(indexUids.contains(searchResult.getIndexUid()), is(true)); - assertThat(searchResult.getHits().size(), is(4)); + assertThat(indexUids.contains(searchResult.getIndexUid()), is(true)); + assertThat(searchResult.getHits().size(), is(4)); } } From 58f6ea01c2d09abd6a4e12d0da839e50fdf51acc Mon Sep 17 00:00:00 2001 From: Balazs Barabas Date: Thu, 31 Oct 2024 16:19:50 +0200 Subject: [PATCH 6/8] added the docs to the end --- .code-samples.meilisearch.yaml | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/.code-samples.meilisearch.yaml b/.code-samples.meilisearch.yaml index aece0ac2..3da424a4 100644 --- a/.code-samples.meilisearch.yaml +++ b/.code-samples.meilisearch.yaml @@ -423,16 +423,6 @@ search_parameter_guide_show_ranking_score_details_1: |- search_parameter_reference_ranking_score_threshold_1: |- SearchRequest searchRequest = SearchRequest.builder().q("badman").rankingScoreThreshold(0.2).build(); client.index("INDEX_NAME").search(searchRequest); -search_parameter_reference_distinct_1: |- - SearchRequest searchRequest = SearchRequest.builder().q("QUERY TERMS").distinct("ATTRIBUTE_A").build(); - client.index("INDEX_NAME").search(searchRequest); -distinct_attribute_guide_filterable_1: |- - Settings settings = new Settings(); - settings.setFilterableAttributes(new String[] {"language", "title"}); - client.index("movies").updateSettings(settings); -distinct_attribute_guide_distinct_parameter_1: |- - SearchRequest searchRequest = SearchRequest.builder().q("and").distinct("language").build(); - client.index("movies").search(searchRequest); synonyms_guide_1: |- HashMap synonyms = new HashMap(); synonyms.put("great", new String[] {"fantastic"}); @@ -837,3 +827,13 @@ get_similar_post_1: .setId("143") .setEmbedder("manual"); client.index("movies").searchSimilarDocuments(query) +search_parameter_reference_distinct_1: |- + SearchRequest searchRequest = SearchRequest.builder().q("QUERY TERMS").distinct("ATTRIBUTE_A").build(); + client.index("INDEX_NAME").search(searchRequest); +distinct_attribute_guide_filterable_1: |- + Settings settings = new Settings(); + settings.setFilterableAttributes(new String[] {"language", "title"}); + client.index("movies").updateSettings(settings); +distinct_attribute_guide_distinct_parameter_1: |- + SearchRequest searchRequest = SearchRequest.builder().q("and").distinct("language").build(); + client.index("movies").search(searchRequest); \ No newline at end of file From a83481e1c3e4656404a4c0a7124bab28381c529e Mon Sep 17 00:00:00 2001 From: Balazs Barabas Date: Wed, 6 Nov 2024 17:54:39 +0200 Subject: [PATCH 7/8] fixed yaml linting error --- .code-samples.meilisearch.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.code-samples.meilisearch.yaml b/.code-samples.meilisearch.yaml index 3da424a4..5239be1f 100644 --- a/.code-samples.meilisearch.yaml +++ b/.code-samples.meilisearch.yaml @@ -836,4 +836,4 @@ distinct_attribute_guide_filterable_1: |- client.index("movies").updateSettings(settings); distinct_attribute_guide_distinct_parameter_1: |- SearchRequest searchRequest = SearchRequest.builder().q("and").distinct("language").build(); - client.index("movies").search(searchRequest); \ No newline at end of file + client.index("movies").search(searchRequest); From 3cbd1f68e925e018cd9e42bd9a52ea16ca7a44fa Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cl=C3=A9mentine?= Date: Wed, 6 Nov 2024 17:09:44 +0100 Subject: [PATCH 8/8] Apply suggestions from code review --- .code-samples.meilisearch.yaml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/.code-samples.meilisearch.yaml b/.code-samples.meilisearch.yaml index 5239be1f..e6fd5dae 100644 --- a/.code-samples.meilisearch.yaml +++ b/.code-samples.meilisearch.yaml @@ -832,8 +832,8 @@ search_parameter_reference_distinct_1: |- client.index("INDEX_NAME").search(searchRequest); distinct_attribute_guide_filterable_1: |- Settings settings = new Settings(); - settings.setFilterableAttributes(new String[] {"language", "title"}); - client.index("movies").updateSettings(settings); + settings.setFilterableAttributes(new String[] {"product_id", "SKU", "url"}); + client.index("products").updateSettings(settings); distinct_attribute_guide_distinct_parameter_1: |- - SearchRequest searchRequest = SearchRequest.builder().q("and").distinct("language").build(); - client.index("movies").search(searchRequest); + SearchRequest searchRequest = SearchRequest.builder().q("white shirt").distinct("sku").build(); + client.index("products").search(searchRequest);