Skip to content

Commit 4f10ba8

Browse files
authored
Merge branch 'main' into create-snapshot-501
2 parents c443ae2 + 34885f6 commit 4f10ba8

File tree

6 files changed

+162
-34
lines changed

6 files changed

+162
-34
lines changed

.code-samples.meilisearch.yaml

Lines changed: 54 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,13 @@
44
# You can read more on https://github.com/meilisearch/documentation/tree/master/.vuepress/code-samples
55
---
66
getting_started_faceting: |-
7-
var faceting = new Faceting {
8-
MaxValuesPerFacet = 2
7+
var faceting = new Faceting
8+
{
9+
MaxValuesPerFacet = 2,
10+
SortFacetValuesBy = new Dictionary<string, SortFacetValuesByType>
11+
{
12+
["*"] = SortFacetValuesByType.Count
13+
}
914
};
1015
await client.Index("movies").UpdateFacetingAsync(faceting);
1116
getting_started_pagination: |-
@@ -29,15 +34,15 @@ date_guide_filterable_attributes_1: |-
2934
await client.Index("games").UpdateFilterableAttributesAsync(new string[] { "release_timestamp" });
3035
date_guide_filter_1: |-
3136
var filters = new SearchQuery() { Filter = "release_timestamp >= 1514761200 AND release_timestamp < 1672527600" };
32-
SearchResult<Game> games = await client.Index("games").SearchAsync<Game>("", filters);
37+
var games = await client.Index("games").SearchAsync<Game>("", filters);
3338
date_guide_sortable_attributes_1: |-
3439
await client.Index("games").UpdateSortableAttributesAsync(new string[] { "release_timestamp" });
3540
date_guide_sort_1: |-
3641
SearchQuery sort = new SearchQuery() { Sort = new string[] { "release_timestamp:desc" }};
3742
await client.Index("games").SearchAsync<Game>("", sort);
3843
filtering_guide_nested_1: |-
3944
var filters = new SearchQuery() { Filter = "rating.users >= 90" };
40-
SearchResult<MovieRating> movies = await client.Index("movie_ratings").SearchAsync<MovieRating>("thriller", filters);
45+
var movies = await client.Index("movie_ratings").SearchAsync<MovieRating>("thriller", filters);
4146
sorting_guide_sort_nested_1: |-
4247
SearchQuery sort = new SearchQuery() { Sort = new string[] { "rating.users:asc" }};
4348
await client.Index("books").SearchAsync<Book>("science fiction", sort);
@@ -64,9 +69,15 @@ async_guide_canceled_by_1: |-
6469
swap_indexes_1: |-
6570
await client.SwapIndexesAsync(new List<IndexSwap> { new IndexSwap("indexA", "indexB"), new IndexSwap("indexX", "indexY") } });
6671
search_parameter_guide_hitsperpage_1: |-
67-
await client.Index("movies").SearchAsync<Movie>("", new SearchQuery { HitsPerPage = 15 });
72+
var result = await client.Index("movies").SearchAsync<Movie>("", new SearchQuery { HitsPerPage = 15 });
73+
if(result is PaginatedSearchResult<Movie> pagedResults)
74+
{
75+
}
6876
search_parameter_guide_page_1: |-
69-
await client.Index("movies").SearchAsync<Movie>("", new SearchQuery { Page = 2 });
77+
var result = await client.Index("movies").SearchAsync<Movie>("", new SearchQuery { Page = 2 });
78+
if(result is PaginatedSearchResult<Movie> pagedResults)
79+
{
80+
}
7081
get_one_index_1: |-
7182
await client.GetIndexAsync("movies");
7283
list_all_indexes_1: |-
@@ -264,28 +275,34 @@ field_properties_guide_displayed_1: |-
264275
});
265276
filtering_guide_1: |-
266277
SearchQuery filters = new SearchQuery() { Filter = "release_date > \"795484800\"" };
267-
SearchResult<Movie> movies = await client.Index("movie_ratings").SearchAsync<Movie>("Avengers", filters);
278+
var movies = await client.Index("movie_ratings").SearchAsync<Movie>("Avengers", filters);
268279
filtering_guide_2: |-
269280
SearchQuery filters = new SearchQuery() { Filter = "release_date > 795484800 AND (director =
270281
\"Tim Burton\" OR director = \"Christopher Nolan\")" };
271-
SearchResult<Movie> movies = await client.Index("movie_ratings").SearchAsync<Movie>("Batman", filters);
282+
var movies = await client.Index("movie_ratings").SearchAsync<Movie>("Batman", filters);
272283
filtering_guide_3: |-
273284
SearchQuery filters = new SearchQuery() { Filter = "release_date > 1577884550 AND (NOT director = \"Tim Burton\")" };
274-
SearchResult<Movie> movies = await client.Index("movie_ratings").SearchAsync<Movie>("Planet of the Apes", filters);
285+
var movies = await client.Index("movie_ratings").SearchAsync<Movie>("Planet of the Apes", filters);
275286
search_parameter_guide_query_1: |-
276287
await client.Index("movies").SearchAsync<Movie>("shifu");
277288
search_parameter_guide_offset_1: |-
278289
var sq = new SearchQuery
279290
{
280291
Offset = 1
281292
};
282-
await client.Index("movies").SearchAsync<Movie>("shifu", sq);
293+
var result = await client.Index("movies").SearchAsync<Movie>("shifu", sq);
294+
if(result is SearchResult<Movie> pagedResults)
295+
{
296+
}
283297
search_parameter_guide_limit_1: |-
284298
var sq = new SearchQuery
285299
{
286300
Limit = 2
287301
};
288-
await client.Index("movies").SearchAsync<Movie>("shifu", sq);
302+
var result = await client.Index("movies").SearchAsync<Movie>("shifu", sq);
303+
if(result is SearchResult<Movie> pagedResults)
304+
{
305+
}
289306
search_parameter_guide_retrieve_1: |-
290307
var sq = new SearchQuery
291308
{
@@ -389,7 +406,7 @@ getting_started_search_md: |-
389406
MeilisearchClient client = new MeilisearchClient("http://localhost:7700", "masterKey");
390407
var index = client.Index("movies");
391408
392-
SearchResult<Movie> movies = await index.SearchAsync<Movie>("botman");
409+
var movies = await index.SearchAsync<Movie>("botman");
393410
foreach (var movie in movies.Hits)
394411
{
395412
Console.WriteLine(movie.Title);
@@ -543,14 +560,14 @@ geosearch_guide_filter_settings_1: |-
543560
TaskInfo result = await client.Index("movies").UpdateFilterableAttributesAsync(attributes);
544561
geosearch_guide_filter_usage_1: |-
545562
SearchQuery filters = new SearchQuery() { Filter = "_geoRadius(45.472735, 9.184019, 2000)" };
546-
SearchResult<Restaurant> restaurants = await client.Index("restaurants").SearchAsync<Restaurant>("", filters);
563+
var restaurants = await client.Index("restaurants").SearchAsync<Restaurant>("", filters);
547564
geosearch_guide_filter_usage_2: |-
548565
SearchQuery filters = new SearchQuery()
549566
{
550567
Filter = new string[] { "_geoRadius(45.472735, 9.184019, 2000) AND type = pizza" }
551568
};
552569
553-
SearchResult<Restaurant> restaurants = await client.Index("restaurants").SearchAsync<Restaurant>("restaurants", filters);
570+
var restaurants = await client.Index("restaurants").SearchAsync<Restaurant>("restaurants", filters);
554571
geosearch_guide_sort_settings_1: |-
555572
List<string> attributes = new() { "_geo" };
556573
TaskInfo result = await client.Index("restaurants").UpdateSortableAttributesAsync(attributes);
@@ -560,7 +577,7 @@ geosearch_guide_sort_usage_1: |-
560577
Sort = new string[] { "_geoPoint(48.8561446,2.2978204):asc" }
561578
};
562579
563-
SearchResult<Restaurant> restaurants = await client.Index("restaurants").SearchAsync<Restaurant>("", filters);
580+
var restaurants = await client.Index("restaurants").SearchAsync<Restaurant>("", filters);
564581
geosearch_guide_sort_usage_2: |-
565582
SearchQuery filters = new SearchQuery()
566583
{
@@ -570,13 +587,13 @@ geosearch_guide_sort_usage_2: |-
570587
}
571588
};
572589
573-
SearchResult<Restaurant> restaurants = await client.Index("restaurants").SearchAsync<Restaurant>("restaurants", filters);
590+
var restaurants = await client.Index("restaurants").SearchAsync<Restaurant>("restaurants", filters);
574591
geosearch_guide_filter_usage_3: |-
575592
SearchQuery filters = new SearchQuery()
576593
{
577594
Filter = "_geoBoundingBox([45.494181, 9.214024], [45.449484, 9.179175])"
578595
};
579-
SearchResult<Restaurant> restaurants = await client.Index("restaurants").SearchAsync<Restaurant>("restaurants", filters);
596+
var restaurants = await client.Index("restaurants").SearchAsync<Restaurant>("restaurants", filters);
580597
primary_field_guide_create_index_primary_key: |-
581598
TaskInfo task = await client.CreateIndexAsync("books", "reference_number");
582599
primary_field_guide_update_document_primary_key: |-
@@ -619,7 +636,7 @@ delete_a_key_1: |-
619636
client.DeleteKeyAsync("6062abda-a5aa-4414-ac91-ecd7944c0f8d")
620637
security_guide_search_key_1: |-
621638
MeilisearchClient client = new MeilisearchClient("http://localhost:7700", "apiKey");
622-
SearchResult<Patient> searchResult = await client.Index("patient_medical_records").SearchAsync<Patient>();
639+
var searchResult = await client.Index("patient_medical_records").SearchAsync<Patient>();
623640
security_guide_update_key_1: |-
624641
MeilisearchClient client = new MeilisearchClient("http://localhost:7700", "masterKey");
625642
await client.UpdateKeyAsync("74c9c733-3368-4738-bbe5-1d18a5fecb37", description: "Default Search API Key");
@@ -654,7 +671,7 @@ tenant_token_guide_generate_sdk_1: |-
654671
);
655672
tenant_token_guide_search_sdk_1: |-
656673
frontEndClient = new MeilisearchClient("http://localhost:7700", token);
657-
SearchResult<Patient> searchResult = await frontEndClient.Index("patient_medical_records").SearchAsync<Patient>("blood test");
674+
var searchResult = await frontEndClient.Index("patient_medical_records").SearchAsync<Patient>("blood test");
658675
getting_started_typo_tolerance: |-
659676
var typoTolerance = new TypoTolerance {
660677
MinWordSizeTypos = new TypoTolerance.TypoSize {
@@ -716,10 +733,16 @@ reset_pagination_settings_1: |-
716733
get_faceting_settings_1: |-
717734
await client.Index("movies").GetFacetingAsync();
718735
update_faceting_settings_1: |-
719-
var faceting = new Faceting {
720-
MaxValuesPerFacet = 2
736+
var faceting = new Faceting
737+
{
738+
MaxValuesPerFacet = 2,
739+
SortFacetValuesBy = new Dictionary<string, SortFacetValuesByType>
740+
{
741+
["*"] = SortFacetValuesByType.Alpha,
742+
["genres"] = SortFacetValuesByType.Count
743+
}
721744
};
722-
await client.Index("movies").UpdateFacetingAsync(faceting);
745+
await client.Index("books").UpdateFacetingAsync(faceting);
723746
reset_faceting_settings_1: |-
724747
await client.Index("movies").ResetFacetingAsync();
725748
multi_search_1: |-
@@ -782,12 +805,6 @@ distinct_attribute_guide_distinct_parameter_1: |-
782805
Distinct = "sku"
783806
};
784807
await client.Index("products").SearchAsync<Product>("white shirt", params);
785-
search_parameter_reference_ranking_score_threshold_1: |-
786-
var params = new SearchQuery()
787-
{
788-
RankingScoreThreshold = 0.2M
789-
};
790-
await client.Index("INDEX_NAME").SearchAsync<T>("badman", params);
791808
get_dictionary_1: |-
792809
var indexDictionary = await client.Index("books").GetDictionaryAsync();
793810
update_dictionary_1: |-
@@ -797,6 +814,15 @@ reset_dictionary_1: |-
797814
await client.Index("books").ResetDictionaryAsync();
798815
create_snapshot_1: |-
799816
await client.CreateSnapshotAsync();
817+
facet_search_2: |-
818+
var newFaceting = new Faceting
819+
{
820+
SortFacetValuesBy = new Dictionary<string, SortFacetValuesByType>
821+
{
822+
["genres"] = SortFacetValuesByType.Count
823+
}
824+
};
825+
await client.Index("books").UpdateFacetingAsync(newFaceting);
800826
facet_search_1: |-
801827
var query = new SearchFacetsQuery()
802828
{

README.md

Lines changed: 37 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -146,7 +146,7 @@ JSON Output:
146146
All the supported options are described in the [search parameters](https://www.meilisearch.com/docs/reference/api/search#search-parameters) section of the documentation.
147147

148148
```c#
149-
SearchResult<Movie> movies = await index.SearchAsync<Movie>(
149+
var movies = await index.SearchAsync<Movie>(
150150
"car",
151151
new SearchQuery
152152
{
@@ -197,7 +197,7 @@ Note that MeiliSearch will rebuild your index whenever you update `FilterableAtt
197197
Then, you can perform the search:
198198

199199
```c#
200-
SearchResult<Movie> movies = await index.SearchAsync<Movie>(
200+
var movies = await index.SearchAsync<Movie>(
201201
"wonder",
202202
new SearchQuery
203203
{
@@ -225,6 +225,41 @@ JSON Output:
225225
}
226226
```
227227

228+
#### Search with Limit and Offset
229+
230+
You can paginate search results by making queries combining both [offset](https://www.meilisearch.com/docs/reference/api/search#offset) and [limit](https://www.meilisearch.com/docs/reference/api/search#limit).
231+
232+
```c#
233+
var results = await index.SearchAsync<T>(query, new SearchQuery()
234+
{
235+
Limit = 5,
236+
Offset = 0
237+
});
238+
239+
if (results is SearchResult<T> limitedResults)
240+
{
241+
var estimatedTotalHits = limitedResults.EstimatedTotalHits;
242+
}
243+
```
244+
245+
#### Search with defined number of results per page
246+
247+
To get paginated results with page numbers, the [HitsPerPage](https://www.meilisearch.com/docs/reference/api/search#number-of-results-per-page) and [Page](https://www.meilisearch.com/docs/reference/api/search#page) properties must be defined.
248+
249+
```c#
250+
var results = await index.SearchAsync<T>(query, new SearchQuery()
251+
{
252+
HitsPerPage = pageSize,
253+
Page = pageNumber,
254+
});
255+
256+
if (results is PaginatedSearchResult<T> paginatedResults)
257+
{
258+
var totalHits = paginatedResults.TotalHits;
259+
var totalPages = paginatedResults.TotalPages;
260+
}
261+
```
262+
228263
## 🤖 Compatibility with Meilisearch
229264

230265
This package guarantees compatibility with [version v1.x of Meilisearch](https://github.com/meilisearch/meilisearch/releases/latest), but some features may not be present. Please check the [issues](https://github.com/meilisearch/meilisearch-dotnet/issues?q=is%3Aissue+is%3Aopen+label%3A%22good+first+issue%22+label%3Aenhancement) for more info.
Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
using System;
2+
using System.Text.Json;
3+
using System.Text.Json.Serialization;
4+
5+
namespace Meilisearch.Converters
6+
{
7+
public class SortFacetValuesConverter : JsonConverter<SortFacetValuesByType>
8+
{
9+
public override SortFacetValuesByType Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
10+
{
11+
if (reader.TokenType == JsonTokenType.String)
12+
{
13+
var enumValue = reader.GetString();
14+
if (Enum.TryParse<SortFacetValuesByType>(enumValue, true, out var sortFacetValues))
15+
{
16+
return sortFacetValues;
17+
}
18+
}
19+
20+
// If we reach here, it means we encountered an unknown value, so we'll use meilisearch default of Alpha
21+
return SortFacetValuesByType.Alpha;
22+
}
23+
24+
public override void Write(Utf8JsonWriter writer, SortFacetValuesByType value, JsonSerializerOptions options)
25+
{
26+
writer.WriteStringValue(value.ToString().ToLower());
27+
}
28+
}
29+
}

src/Meilisearch/Faceting.cs

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,39 @@
1+
using System.Collections.Generic;
12
using System.Text.Json.Serialization;
23

4+
using Meilisearch.Converters;
5+
36
namespace Meilisearch
47
{
58
/// <summary>
69
/// Faceting configuration.
710
/// </summary>
811
public class Faceting
912
{
13+
/// <summary>
14+
/// Gets or sets maxValuesPerFacet.
15+
/// </summary>
1016
[JsonPropertyName("maxValuesPerFacet")]
1117
public int MaxValuesPerFacet { get; set; }
18+
19+
/// <summary>
20+
/// Gets or sets sortFacetValuesBy.
21+
/// </summary>
22+
[JsonPropertyName("sortFacetValuesBy")]
23+
public Dictionary<string, SortFacetValuesByType> SortFacetValuesBy { get; set; }
24+
}
25+
26+
[JsonConverter(typeof(SortFacetValuesConverter))]
27+
public enum SortFacetValuesByType
28+
{
29+
/// <summary>
30+
/// Sort by alphanumerical value.
31+
/// </summary>
32+
Alpha,
33+
34+
/// <summary>
35+
/// Sort by count value.
36+
/// </summary>
37+
Count
1238
}
1339
}

src/Meilisearch/Meilisearch.csproj

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
<TargetFramework>netstandard2.0</TargetFramework>
55
<OutputType>Library</OutputType>
66
<PackageId>MeiliSearch</PackageId>
7-
<Version>0.15.5</Version>
7+
<Version>0.16.0</Version>
88
<Description>.NET wrapper for Meilisearch, an open-source search engine</Description>
99
<RepositoryUrl>https://github.com/meilisearch/meilisearch-dotnet</RepositoryUrl>
1010
<PackageTags>meilisearch;dotnet;sdk;search-engine;search;instant-search</PackageTags>

tests/Meilisearch.Tests/SettingsTests.cs

Lines changed: 15 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -55,7 +55,11 @@ public SettingsTests(TFixture fixture)
5555
},
5656
Faceting = new Faceting
5757
{
58-
MaxValuesPerFacet = 100
58+
MaxValuesPerFacet = 100,
59+
SortFacetValuesBy = new Dictionary<string, SortFacetValuesByType>()
60+
{
61+
["*"] = SortFacetValuesByType.Alpha
62+
}
5963
},
6064
Pagination = new Pagination
6165
{
@@ -517,7 +521,11 @@ public async Task UpdateFaceting()
517521
{
518522
var newFaceting = new Faceting
519523
{
520-
MaxValuesPerFacet = 20
524+
MaxValuesPerFacet = 20,
525+
SortFacetValuesBy = new Dictionary<string, SortFacetValuesByType>
526+
{
527+
["*"] = SortFacetValuesByType.Count
528+
}
521529
};
522530

523531
await AssertUpdateSuccess(_index.UpdateFacetingAsync, newFaceting);
@@ -529,7 +537,11 @@ public async Task ResetFaceting()
529537
{
530538
var newFaceting = new Faceting
531539
{
532-
MaxValuesPerFacet = 30
540+
MaxValuesPerFacet = 30,
541+
SortFacetValuesBy = new Dictionary<string, SortFacetValuesByType>
542+
{
543+
["*"] = SortFacetValuesByType.Count
544+
}
533545
};
534546

535547
await AssertUpdateSuccess(_index.UpdateFacetingAsync, newFaceting);

0 commit comments

Comments
 (0)