diff --git a/.code-samples.meilisearch.yaml b/.code-samples.meilisearch.yaml
index 87007b7a4..54b66addb 100644
--- a/.code-samples.meilisearch.yaml
+++ b/.code-samples.meilisearch.yaml
@@ -1533,3 +1533,19 @@ update_network_1: |-
}
}
}'
+search_parameter_reference_media_1: |-
+ curl \
+ -X POST 'MEILISEARCH_URL/indexes/INDEX_NAME/search' \
+ -H 'Content-Type: application/json' \
+ --data-binary '{
+ "hybrid": {
+ "embedder": "EMBEDDER_NAME"
+ },
+ "media": {
+ "FIELD_A": "VALUE_A",
+ "FIELD_B" : {
+ "FIELD_C": "VALUE_B"
+ "FIELD_D": "VALUE_C"
+ }
+ }
+ }'
diff --git a/learn/resources/experimental_features_overview.mdx b/learn/resources/experimental_features_overview.mdx
index c245ee2aa..c8cfa79db 100644
--- a/learn/resources/experimental_features_overview.mdx
+++ b/learn/resources/experimental_features_overview.mdx
@@ -59,3 +59,4 @@ Activating or deactivating experimental features this way does not require you t
| [Search query embedding cache](/learn/self_hosted/configure_meilisearch_at_launch#search-query-embedding-cache) | Enable a cache for search query embeddings | CLI flag or environment variable |
| [Uncompressed snapshots](/learn/self_hosted/configure_meilisearch_at_launch#uncompressed-snapshots) | Disable snapshot compaction | CLI flag or environment variable |
| [Maximum batch payload size](/learn/self_hosted/configure_meilisearch_at_launch#maximum-batch-payload-size) | Limit batch payload size | CLI flag or environment variable |
+| [Multimodal search](/reference/api/settings) | Enable multimodal search | API route |
diff --git a/reference/api/experimental_features.mdx b/reference/api/experimental_features.mdx
index 3393ceed9..b03cd95b6 100644
--- a/reference/api/experimental_features.mdx
+++ b/reference/api/experimental_features.mdx
@@ -26,7 +26,8 @@ The experimental API route is not compatible with all experimental features. Con
"containsFilter": false,
"editDocumentsByFunction": false,
"network": false,
- "chatCompletions": false
+ "chatCompletions": false,
+ "multimodal": false
}
```
@@ -38,6 +39,7 @@ The experimental API route is not compatible with all experimental features. Con
| **`editDocumentsByFunction`** | Boolean | `true` if feature is active, `false` otherwise |
| **`network`** | Boolean | `true` if feature is active, `false` otherwise |
| **`chatCompletions`** | Boolean | `true` if feature is active, `false` otherwise |
+| **`multimodal`** | Boolean | `true` if feature is active, `false` otherwise |
## Get all experimental features
@@ -58,7 +60,8 @@ Get a list of all experimental features that can be activated via the `/experime
"containsFilter": false,
"editDocumentsByFunction": false,
"network": false,
- "chatCompletions": false
+ "chatCompletions": false,
+ "multimodal": false
}
```
@@ -87,6 +90,7 @@ Setting a field to `null` leaves its value unchanged.
"containsFilter": false,
"editDocumentsByFunction": false,
"network": false,
- "chatCompletions": false
+ "chatCompletions": false,
+ "multimodal": false
}
```
diff --git a/reference/api/search.mdx b/reference/api/search.mdx
index c5aeafa0b..4c84aeb61 100644
--- a/reference/api/search.mdx
+++ b/reference/api/search.mdx
@@ -97,6 +97,7 @@ By default, [this endpoint returns a maximum of 1000 results](/learn/resources/k
| **[`vector`](#vector)** | Array of numbers | `null` | Search using a custom query vector |
| **[`retrieveVectors`](#display-_vectors-in-response)** | Boolean | `false` | Return document vector data |
| **[`locales`](#query-locales)** | Array of strings | `null` | Explicitly specify languages used in a query |
+| **[`media`](#media)** | Object | `null` | Perform AI-powered search queries with multimodal content |
### Response
@@ -1283,3 +1284,46 @@ For full control over the way Meilisearch detects languages during indexing and
…
}
```
+
+### Media
+
+**Parameter**: `media`
+**Expected value**: Object
+**Default value**: `null`
+
+
+This is an experimental feature. Use the Meilisearch Cloud UI or the experimental features endpoint to activate it:
+
+```sh
+curl \
+ -X PATCH 'MEILISEARCH_URL/experimental-features/' \
+ -H 'Content-Type: application/json' \
+ --data-binary '{
+ "multimodal": true
+ }'
+```
+
+
+Specifies data to populate search fragments when performing multimodal searches.
+
+`media` must be an object whose fields must correspond to the data required by one [search fragment](/reference/api/settings#searchfragments). `media` must match a single search fragment. If `media` matches more than one fragment or no search fragments at all, Meilisearch will return an error.
+
+It is mandatory to specify an embedder when using `media`. `media` is incompatible with `vector`.
+
+#### Example
+
+
+
+```json
+{
+ "hits": [
+ {
+ "id": 0,
+ "title": "DOCUMENT NAME",
+ …
+ }
+ …
+ ],
+ …
+}
+```
diff --git a/reference/api/settings.mdx b/reference/api/settings.mdx
index 47476cebf..b89b6611e 100644
--- a/reference/api/settings.mdx
+++ b/reference/api/settings.mdx
@@ -2512,7 +2512,9 @@ These embedder objects may contain the following fields:
| **`binaryQuantized`** | Boolean | Empty | Once set to `true`, irreversibly converts all vector dimensions to 1-bit values |
| **`indexingEmbedder`** | Object | Empty | Configures embedder to vectorize documents during indexing |
| **`searchEmbedder`** | Object | Empty | Configures embedder to vectorize search queries |
-| **`pooling`** | String | `"useModel"` | Pooling method for Hugging Face embedders |
+| **`pooling`** | String | `"useModel"` | Pooling method for Hugging Face embedders |
+| **`indexingFragments`** | Object | Empty | Configures multimodal embedding generation at indexing time |
+| **`searchFragments`** | Object | Empty | Configures data handling during multimodal search |
### Get embedder settings
@@ -2875,6 +2877,118 @@ Both fields must be an object and accept the same fields as a regular embedder,
`indexingEmbedder` and `searchEmbedder` are incompatible with all other embedder sources.
+##### `indexingFragments`
+
+
+This is an experimental feature. Use the Meilisearch Cloud UI or the experimental features endpoint to activate it:
+
+```sh
+curl \
+ -X PATCH 'MEILISEARCH_URL/experimental-features/' \
+ -H 'Content-Type: application/json' \
+ --data-binary '{
+ "multimodal": true
+ }'
+```
+
+
+`indexingFragments` specifies which fields in your documents should be used to generate multimodal embeddings. It must be an object with the following structure:
+
+```json
+ "FRAGMENT_NAME": {
+ "value": {
+ …
+ }
+ }
+```
+
+`FRAGMENT_NAME` can be any valid string. It must contain a single field, `value`. `value` must then follow your chosen model's specifications.
+
+For example, for Voyage AI's text and image embedder, `value` must be an array containing a single object with a `type` field. Depending on `type`'s value, you must include either `text`, `image_url`, or `image_base64`:
+
+```json
+{
+ "VOYAGE_FRAGMENT_NAME_A": {
+ "value": {
+ "content": [
+ {
+ "type": "text",
+ "text": "A document called {{doc.title}} that can be described as {{doc.description}}"
+ }
+ ]
+ }
+ },
+ "VOYAGE_FRAGMENT_NAME_B": {
+ "value": {
+ "content": [
+ {
+ "type": "image_url",
+ "image_url": "{{doc.image_url}}"
+ }
+ ]
+ }
+ },
+}
+```
+
+Use Liquid templates to interpolate document data into the fragment fields, where `doc` gives you access to all fields within a document.
+
+`indexingFragments` is optional when using the `rest` source.
+
+`indexingFragments` is incompatible with all other embedder sources.
+
+Specifying a `documentTemplate` in an embedder using `indexingFragments` will result in an error.
+
+You must specify at least one valid fragment in `searchFragments` when using `indexingFragments`.
+
+##### `searchFragments`
+
+
+This is an experimental feature. Use the Meilisearch Cloud UI or the experimental features endpoint to activate it:
+
+```sh
+curl \
+ -X PATCH 'MEILISEARCH_URL/experimental-features/' \
+ -H 'Content-Type: application/json' \
+ --data-binary '{
+ "multimodal": true
+ }'
+```
+
+
+`searchFragments` instructs Meilisearch how to parse fields present in a query's [`media` search parameter](/reference/api/search#media). It must be an object following the same structure as the [`indexingFragments`](/reference/api/settings#indexingfragments) object:
+
+```json
+ "FRAGMENT_NAME": {
+ "value": {
+ …
+ }
+ }
+```
+
+As with `indexingFragments`, the content of `value` should follow your model's specification.
+
+Use Liquid templates to interpolate search query data into the fragment fields, where `media` gives you access to all multimodal data received with a query:
+
+```json
+"SEARCH_FRAGMENT_A": {
+ "value": {
+ "content": [
+ {
+ "type": "image_base64",
+ "image_base64": "data:{{media.image.mime}};base64,{{media.image.data}}"
+ }
+ ]
+ }
+},
+```
+
+`searchFragments` is optional when using the `rest` source.
+
+`searchFragments` is incompatible with all other embedder sources.
+
+You must specify at least one valid fragment in `indexingFragments` when using `searchFragments`.
+
#### Example
diff --git a/reference/errors/error_codes.mdx b/reference/errors/error_codes.mdx
index ddd649862..399b9a1d6 100644
--- a/reference/errors/error_codes.mdx
+++ b/reference/errors/error_codes.mdx
@@ -146,6 +146,14 @@ The given [`uid`](/reference/api/keys#uid) is invalid. The `uid` must follow the
The value passed to [`attributesToSearchOn`](/reference/api/search#customize-attributes-to-search-on-at-search-time) is invalid. `attributesToSearchOn` accepts an array of strings indicating document attributes. Attributes given to `attributesToSearchOn` must be present in the [`searchableAttributes` list](/learn/relevancy/displayed_searchable_attributes#the-searchableattributes-list).
+## `invalid_search_media`
+
+The value passed to [`media`](/reference/api/search#media) is not a valid JSON object.
+
+## `invalid_search_media_and_vector`
+
+The search query contains non-`null` values for both [`media`](/reference/api/search#media) and [`vector`](/reference/api/search#media). These two parameters are mutually exclusive, since `media` generates vector embeddings via the embedder configured in `hybrid`.
+
## `invalid_content_type`
The [Content-Type header](/reference/api/overview#content-type) is not supported by Meilisearch. Currently, Meilisearch only supports JSON, CSV, and NDJSON.
diff --git a/snippets/samples/code_samples_add_movies_json_1.mdx b/snippets/samples/code_samples_add_movies_json_1.mdx
index 414246df0..068206c70 100644
--- a/snippets/samples/code_samples_add_movies_json_1.mdx
+++ b/snippets/samples/code_samples_add_movies_json_1.mdx
@@ -59,7 +59,7 @@ file, _ := os.ReadFile("movies.json")
var movies interface{}
json.Unmarshal([]byte(file), &movies)
-client.Index("movies").AddDocuments(&movies)
+client.Index("movies").AddDocuments(&movies, nil)
```
```csharp C#
diff --git a/snippets/samples/code_samples_add_or_replace_documents_1.mdx b/snippets/samples/code_samples_add_or_replace_documents_1.mdx
index 13ae38b9d..7d9fb5a7f 100644
--- a/snippets/samples/code_samples_add_or_replace_documents_1.mdx
+++ b/snippets/samples/code_samples_add_or_replace_documents_1.mdx
@@ -80,7 +80,7 @@ documents := []map[string]interface{}{
"release_date": "2019-03-23",
},
}
-client.Index("movies").AddDocuments(documents)
+client.Index("movies").AddDocuments(documents, nil)
```
```csharp C#
diff --git a/snippets/samples/code_samples_add_or_update_documents_1.mdx b/snippets/samples/code_samples_add_or_update_documents_1.mdx
index a3c1cd3dd..53a1dd526 100644
--- a/snippets/samples/code_samples_add_or_update_documents_1.mdx
+++ b/snippets/samples/code_samples_add_or_update_documents_1.mdx
@@ -66,7 +66,7 @@ documents := []map[string]interface{}{
"genres": "comedy",
},
}
-client.Index("movies").UpdateDocuments(documents)
+client.Index("movies").UpdateDocuments(documents, nil)
```
```csharp C#
diff --git a/snippets/samples/code_samples_async_guide_filter_by_statuses_1.mdx b/snippets/samples/code_samples_async_guide_filter_by_statuses_1.mdx
index 5f67d39c0..609fe90cb 100644
--- a/snippets/samples/code_samples_async_guide_filter_by_statuses_1.mdx
+++ b/snippets/samples/code_samples_async_guide_filter_by_statuses_1.mdx
@@ -42,7 +42,7 @@ await client.GetTasksAsync(new TasksQuery { Statuses = new List
```rust Rust
let mut query = TasksQuery::new(&client);
let tasks = query
- .with_statuses(["failed", "canceled"])
+ .with_statuses(["failed"])
.execute()
.await
.unwrap();
diff --git a/snippets/samples/code_samples_async_guide_filter_by_statuses_2.mdx b/snippets/samples/code_samples_async_guide_filter_by_statuses_2.mdx
index 53e8fd2b4..985a91b0b 100644
--- a/snippets/samples/code_samples_async_guide_filter_by_statuses_2.mdx
+++ b/snippets/samples/code_samples_async_guide_filter_by_statuses_2.mdx
@@ -4,4 +4,13 @@
curl \
-X GET 'MEILISEARCH_URL/tasks?statuses=failed,canceled'
```
+
+```rust Rust
+let mut query = TasksQuery::new(&client);
+let tasks = query
+ .with_statuses(["failed", "canceled"])
+ .execute()
+ .await
+ .unwrap();
+```
\ No newline at end of file
diff --git a/snippets/samples/code_samples_basic_security_tutorial_admin_1.mdx b/snippets/samples/code_samples_basic_security_tutorial_admin_1.mdx
index ea0c45fb6..e0c803c2b 100644
--- a/snippets/samples/code_samples_basic_security_tutorial_admin_1.mdx
+++ b/snippets/samples/code_samples_basic_security_tutorial_admin_1.mdx
@@ -10,4 +10,12 @@ curl \
"primaryKey": "id"
}'
```
+
+```rust Rust
+let client = Client::new("http://localhost:7700", Some("DEFAULT_ADMIN_API_KEY"));
+let task = client
+ .create_index("medical_records", Some("id"))
+ .await
+ .unwrap();
+```
\ No newline at end of file
diff --git a/snippets/samples/code_samples_basic_security_tutorial_listing_1.mdx b/snippets/samples/code_samples_basic_security_tutorial_listing_1.mdx
index 549088f02..a9d2c5be0 100644
--- a/snippets/samples/code_samples_basic_security_tutorial_listing_1.mdx
+++ b/snippets/samples/code_samples_basic_security_tutorial_listing_1.mdx
@@ -4,4 +4,12 @@
curl -X GET 'MEILISEARCH_URL/keys' \
-H 'Authorization: Bearer MASTER_KEY'
```
+
+```rust Rust
+let client = Client::new("http://localhost:7700", Some("MASTER_KEY"));
+client
+ .get_keys()
+ .await
+ .unwrap();
+```
\ No newline at end of file
diff --git a/snippets/samples/code_samples_basic_security_tutorial_search_1.mdx b/snippets/samples/code_samples_basic_security_tutorial_search_1.mdx
index dbdade30f..edbef1caf 100644
--- a/snippets/samples/code_samples_basic_security_tutorial_search_1.mdx
+++ b/snippets/samples/code_samples_basic_security_tutorial_search_1.mdx
@@ -7,4 +7,15 @@ curl \
-H 'Authorization: Bearer DEFAULT_SEARCH_API_KEY' \
--data-binary '{ "q": "appointments" }'
```
+
+```rust Rust
+let client = Client::new("http://localhost:7700", Some("DEFAULT_SEARCH_API_KEY"));
+let index = client.index("medical_records");
+index
+ .search()
+ .with_query("appointments")
+ .execute::()
+ .await
+ .unwrap();
+```
\ No newline at end of file
diff --git a/snippets/samples/code_samples_date_guide_filterable_attributes_1.mdx b/snippets/samples/code_samples_date_guide_filterable_attributes_1.mdx
index 2fe51dc2b..98595a358 100644
--- a/snippets/samples/code_samples_date_guide_filterable_attributes_1.mdx
+++ b/snippets/samples/code_samples_date_guide_filterable_attributes_1.mdx
@@ -30,7 +30,7 @@ client.index('games').update_filterable_attributes(['release_timestamp'])
```
```go Go
-filterableAttributes := []string{"release_timestamp"}
+filterableAttributes := []interface{}{"release_timestamp"}
client.Index("games").UpdateFilterableAttributes(&filterableAttributes)
```
diff --git a/snippets/samples/code_samples_date_guide_index_1.mdx b/snippets/samples/code_samples_date_guide_index_1.mdx
index 1f22bd3bd..4f89b156e 100644
--- a/snippets/samples/code_samples_date_guide_index_1.mdx
+++ b/snippets/samples/code_samples_date_guide_index_1.mdx
@@ -54,7 +54,7 @@ byteValue, _ := io.ReadAll(jsonFile)
var games []map[string]interface{}
json.Unmarshal(byteValue, &games)
-client.Index("games").AddDocuments(games)
+client.Index("games").AddDocuments(games, nil)
```
```csharp C#
diff --git a/snippets/samples/code_samples_distinct_attribute_guide_filterable_1.mdx b/snippets/samples/code_samples_distinct_attribute_guide_filterable_1.mdx
index 60e30700b..7412dfadb 100644
--- a/snippets/samples/code_samples_distinct_attribute_guide_filterable_1.mdx
+++ b/snippets/samples/code_samples_distinct_attribute_guide_filterable_1.mdx
@@ -38,7 +38,7 @@ client.index('products').update_filterable_attributes([
```
```go Go
-filterableAttributes := []string{
+filterableAttributes := []interface{}{
"product_id",
"sku",
"url",
diff --git a/snippets/samples/code_samples_facet_search_1.mdx b/snippets/samples/code_samples_facet_search_1.mdx
index dd2e10724..da8b4b9c9 100644
--- a/snippets/samples/code_samples_facet_search_1.mdx
+++ b/snippets/samples/code_samples_facet_search_1.mdx
@@ -60,6 +60,16 @@ var query = new SearchFacetsQuery()
await client.Index("books").FacetSearchAsync("genres", query);
```
+```rust Rust
+let res = client.index("books")
+ .facet_search("genres")
+ .with_facet_query("fiction")
+ .with_filter("rating > 3")
+ .execute()
+ .await
+ .unwrap();
+```
+
```dart Dart
await client.index('books').facetSearch(
FacetSearchQuery(
diff --git a/snippets/samples/code_samples_facet_search_2.mdx b/snippets/samples/code_samples_facet_search_2.mdx
index a5380a0ae..6f56f8435 100644
--- a/snippets/samples/code_samples_facet_search_2.mdx
+++ b/snippets/samples/code_samples_facet_search_2.mdx
@@ -62,6 +62,20 @@ var newFaceting = new Faceting
await client.Index("books").UpdateFacetingAsync(newFaceting);
```
+```rust Rust
+let mut facet_sort_setting = BTreeMap::new();
+facet_sort_setting.insert("genres".to_string(), FacetSortValue::Count);
+let faceting = FacetingSettings {
+ max_values_per_facet: 100,
+ sort_facet_values_by: Some(facet_sort_setting),
+};
+
+let res = client.index("books")
+ .set_faceting(&faceting)
+ .await
+ .unwrap();
+```
+
```dart Dart
await client.index('books').updateFaceting(
Faceting(
diff --git a/snippets/samples/code_samples_facet_search_3.mdx b/snippets/samples/code_samples_facet_search_3.mdx
index e6fbb1894..70c2bcdc9 100644
--- a/snippets/samples/code_samples_facet_search_3.mdx
+++ b/snippets/samples/code_samples_facet_search_3.mdx
@@ -42,6 +42,7 @@ client.index('books').facet_search('genres', 'c')
client.Index("books").FacetSearch(&meilisearch.FacetSearchRequest{
FacetQuery: "c",
FacetName: "genres",
+ ExhaustiveFacetCount: true
})
```
@@ -53,6 +54,15 @@ var query = new SearchFacetsQuery()
await client.Index("books").FacetSearchAsync("genres", query);
```
+```rust Rust
+let res = client.index("books")
+ .facet_search("genres")
+ .with_facet_query("c")
+ .execute()
+ .await
+ .unwrap();
+```
+
```dart Dart
await client.index('books').facetSearch(
FacetSearchQuery(
diff --git a/snippets/samples/code_samples_faceted_search_update_settings_1.mdx b/snippets/samples/code_samples_faceted_search_update_settings_1.mdx
index 9c7b7d243..7b5255a44 100644
--- a/snippets/samples/code_samples_faceted_search_update_settings_1.mdx
+++ b/snippets/samples/code_samples_faceted_search_update_settings_1.mdx
@@ -34,7 +34,7 @@ client.index('movie_ratings').update_filterable_attributes(['genres', 'rating',
```
```go Go
-filterableAttributes := []string{
+filterableAttributes := []interface{}{
"genres",
"rating",
"language",
diff --git a/snippets/samples/code_samples_filtering_update_settings_1.mdx b/snippets/samples/code_samples_filtering_update_settings_1.mdx
index b73c1095b..9ecaed4cf 100644
--- a/snippets/samples/code_samples_filtering_update_settings_1.mdx
+++ b/snippets/samples/code_samples_filtering_update_settings_1.mdx
@@ -47,7 +47,7 @@ client.index('movies').update_filterable_attributes([
```
```go Go
-resp, err := client.Index("movies").UpdateFilterableAttributes(&[]string{
+resp, err := client.Index("movies").UpdateFilterableAttributes(&[]interface{}{
"director",
"genres",
})
diff --git a/snippets/samples/code_samples_geosearch_guide_filter_settings_1.mdx b/snippets/samples/code_samples_geosearch_guide_filter_settings_1.mdx
index 79aa98f98..32732e600 100644
--- a/snippets/samples/code_samples_geosearch_guide_filter_settings_1.mdx
+++ b/snippets/samples/code_samples_geosearch_guide_filter_settings_1.mdx
@@ -37,7 +37,7 @@ client.index('restaurants').update_filterable_attributes(['_geo'])
```
```go Go
-filterableAttributes := []string{
+filterableAttributes := []interface{}{
"_geo",
}
client.Index("restaurants").UpdateFilterableAttributes(&filterableAttributes)
diff --git a/snippets/samples/code_samples_get_all_batches_1.mdx b/snippets/samples/code_samples_get_all_batches_1.mdx
index bce94d986..403117765 100644
--- a/snippets/samples/code_samples_get_all_batches_1.mdx
+++ b/snippets/samples/code_samples_get_all_batches_1.mdx
@@ -20,4 +20,8 @@ $client->getBatches();
```ruby Ruby
client.batches
```
+
+```go Go
+client.GetBatches();
+```
\ No newline at end of file
diff --git a/snippets/samples/code_samples_get_batch_1.mdx b/snippets/samples/code_samples_get_batch_1.mdx
index 7b9a8a94c..a7bc333b1 100644
--- a/snippets/samples/code_samples_get_batch_1.mdx
+++ b/snippets/samples/code_samples_get_batch_1.mdx
@@ -20,4 +20,8 @@ $client->getBatch(BATCH_UID);
```ruby Ruby
client.batch(BATCH_UID)
```
+
+```go Go
+client.GetBatch(BATCH_UID);
+```
\ No newline at end of file
diff --git a/snippets/samples/code_samples_get_embedders_1.mdx b/snippets/samples/code_samples_get_embedders_1.mdx
index d7deff5fc..96325ca5d 100644
--- a/snippets/samples/code_samples_get_embedders_1.mdx
+++ b/snippets/samples/code_samples_get_embedders_1.mdx
@@ -8,4 +8,8 @@ curl \
```ruby Ruby
client.index('INDEX_NAME').embedders
```
+
+```rust Rust
+let embedders = index.get_embedders().await.unwrap();
+```
\ No newline at end of file
diff --git a/snippets/samples/code_samples_get_facet_search_settings_1.mdx b/snippets/samples/code_samples_get_facet_search_settings_1.mdx
index 8b2b15b7c..bfb04ecd9 100644
--- a/snippets/samples/code_samples_get_facet_search_settings_1.mdx
+++ b/snippets/samples/code_samples_get_facet_search_settings_1.mdx
@@ -24,4 +24,12 @@ client.index('INDEX_UID').facet_search_setting
```go Go
client.Index("books").GetFacetSearch()
```
+
+```rust Rust
+let facet_search: bool = client
+ .index(INDEX_UID)
+ .get_facet_search()
+ .await
+ .unwrap();
+```
\ No newline at end of file
diff --git a/snippets/samples/code_samples_get_prefix_search_settings_1.mdx b/snippets/samples/code_samples_get_prefix_search_settings_1.mdx
index 19b518df4..155d4eddb 100644
--- a/snippets/samples/code_samples_get_prefix_search_settings_1.mdx
+++ b/snippets/samples/code_samples_get_prefix_search_settings_1.mdx
@@ -24,4 +24,12 @@ client.index('INDEX_UID').prefix_search
```go Go
client.Index("books").GetPrefixSearch()
```
+
+```rust Rust
+let prefix_search: PrefixSearchSettings = client
+ .index(INDEX_UID)
+ .get_prefix_search()
+ .await
+ .unwrap();
+```
\ No newline at end of file
diff --git a/snippets/samples/code_samples_get_similar_post_1.mdx b/snippets/samples/code_samples_get_similar_post_1.mdx
index a84416895..534a02785 100644
--- a/snippets/samples/code_samples_get_similar_post_1.mdx
+++ b/snippets/samples/code_samples_get_similar_post_1.mdx
@@ -39,4 +39,12 @@ client.Index("INDEX_NAME").SearchSimilarDocuments(&meilisearch.SimilarDocumentQu
Embedder: "default",
}, resp)
```
+
+```rust Rust
+let results = index
+ .similar_search("TARGET_DOCUMENT_ID", "EMBEDDER_NAME")
+ .execute()
+ .await
+ .unwrap();
+```
\ No newline at end of file
diff --git a/snippets/samples/code_samples_getting_started_add_documents.mdx b/snippets/samples/code_samples_getting_started_add_documents.mdx
index 9d1256878..9a2a53b20 100644
--- a/snippets/samples/code_samples_getting_started_add_documents.mdx
+++ b/snippets/samples/code_samples_getting_started_add_documents.mdx
@@ -140,7 +140,7 @@ func main() {
var movies []map[string]interface{}
json.Unmarshal(byteValue, &movies)
- _, err := client.Index("movies").AddDocuments(movies)
+ _, err := client.Index("movies").AddDocuments(movies, nil)
if err != nil {
panic(err)
}
@@ -192,7 +192,7 @@ namespace Meilisearch_demo
```text Rust
// In your .toml file:
[dependencies]
- meilisearch-sdk = "0.28.0"
+ meilisearch-sdk = "0.29.1"
# futures: because we want to block on futures
futures = "0.3"
# serde: required if you are going to use documents
diff --git a/snippets/samples/code_samples_getting_started_add_meteorites.mdx b/snippets/samples/code_samples_getting_started_add_meteorites.mdx
index 90a4cf556..77373581e 100644
--- a/snippets/samples/code_samples_getting_started_add_meteorites.mdx
+++ b/snippets/samples/code_samples_getting_started_add_meteorites.mdx
@@ -60,7 +60,7 @@ byteValue, _ := io.ReadAll(jsonFile)
var meteorites []map[string]interface{}
json.Unmarshal(byteValue, &meteorites)
-client.Index("meteorites").AddDocuments(meteorites)
+client.Index("meteorites").AddDocuments(meteorites, nil)
```
```csharp C#
diff --git a/snippets/samples/code_samples_getting_started_faceting.mdx b/snippets/samples/code_samples_getting_started_faceting.mdx
index ccc590264..2461cbd02 100644
--- a/snippets/samples/code_samples_getting_started_faceting.mdx
+++ b/snippets/samples/code_samples_getting_started_faceting.mdx
@@ -78,8 +78,11 @@ await client.Index("movies").UpdateFacetingAsync(faceting);
```
```rust Rust
+let mut facet_sort_setting = BTreeMap::new();
+facet_sort_setting.insert("*".to_string(), FacetSortValue::Count);
let mut faceting = FacetingSettings {
max_values_per_facet: 2,
+ sort_facet_values_by: Some(facet_sort_setting),
};
let task: TaskInfo = client
diff --git a/snippets/samples/code_samples_index_settings_tutorial_api_get_setting_1.mdx b/snippets/samples/code_samples_index_settings_tutorial_api_get_setting_1.mdx
index 897990733..b971e33ec 100644
--- a/snippets/samples/code_samples_index_settings_tutorial_api_get_setting_1.mdx
+++ b/snippets/samples/code_samples_index_settings_tutorial_api_get_setting_1.mdx
@@ -4,4 +4,11 @@
curl \
-X GET 'MEILISEARCH_URL/indexes/INDEX_NAME/settings/searchable-attributes'
```
+
+```rust Rust
+let searchable_attributes: Vec = index
+ .get_searchable_attributes()
+ .await
+ .unwrap();
+```
\ No newline at end of file
diff --git a/snippets/samples/code_samples_index_settings_tutorial_api_put_setting_1.mdx b/snippets/samples/code_samples_index_settings_tutorial_api_put_setting_1.mdx
index 66b6ffee9..f82116ae0 100644
--- a/snippets/samples/code_samples_index_settings_tutorial_api_put_setting_1.mdx
+++ b/snippets/samples/code_samples_index_settings_tutorial_api_put_setting_1.mdx
@@ -9,4 +9,11 @@ curl \
"overview"
]'
```
+
+```rust Rust
+let task = index
+ .set_searchable_attributes(["title", "overview"])
+ .await
+ .unwrap();
+```
\ No newline at end of file
diff --git a/snippets/samples/code_samples_index_settings_tutorial_api_task_1.mdx b/snippets/samples/code_samples_index_settings_tutorial_api_task_1.mdx
index 84c80314e..2242766f4 100644
--- a/snippets/samples/code_samples_index_settings_tutorial_api_task_1.mdx
+++ b/snippets/samples/code_samples_index_settings_tutorial_api_task_1.mdx
@@ -4,4 +4,8 @@
curl \
-X GET 'MEILISEARCH_URL/tasks/TASK_UID'
```
+
+```rust Rust
+let task_status = index.get_task(&task).await.unwrap();
+```
\ No newline at end of file
diff --git a/snippets/samples/code_samples_landing_getting_started_1.mdx b/snippets/samples/code_samples_landing_getting_started_1.mdx
index 49d15df9e..b353fed74 100644
--- a/snippets/samples/code_samples_landing_getting_started_1.mdx
+++ b/snippets/samples/code_samples_landing_getting_started_1.mdx
@@ -81,7 +81,7 @@ documents := []map[string]interface{}{
{ "id": 5, "title": "Moana" },
{ "id": 6, "title": "Philadelphia" },
}
-client.Index("movies").AddDocuments(documents)
+client.Index("movies").AddDocuments(documents, nil)
```
```csharp C#
diff --git a/snippets/samples/code_samples_negative_search_1.mdx b/snippets/samples/code_samples_negative_search_1.mdx
index 213db2da5..d55e30b10 100644
--- a/snippets/samples/code_samples_negative_search_1.mdx
+++ b/snippets/samples/code_samples_negative_search_1.mdx
@@ -14,4 +14,12 @@ client.index('movies').search('-escape')
```php PHP
$client->index('movies')->search('-escape');
```
+
+```rust Rust
+let results = index.search()
+ .with_query("-escape")
+ .execute()
+ .await
+ .unwrap();
+```
\ No newline at end of file
diff --git a/snippets/samples/code_samples_negative_search_2.mdx b/snippets/samples/code_samples_negative_search_2.mdx
index bd3146b38..f25dc2bba 100644
--- a/snippets/samples/code_samples_negative_search_2.mdx
+++ b/snippets/samples/code_samples_negative_search_2.mdx
@@ -14,4 +14,12 @@ client.index('movies').search('-"escape"')
```php PHP
$client->index('movies')->search('-"escape"');
```
+
+```rust Rust
+let results = index.search()
+ .with_query("-\"escape room\"")
+ .execute()
+ .await
+ .unwrap();
+```
\ No newline at end of file
diff --git a/snippets/samples/code_samples_primary_field_guide_add_document_primary_key.mdx b/snippets/samples/code_samples_primary_field_guide_add_document_primary_key.mdx
index 1c30ac801..6d8ecc627 100644
--- a/snippets/samples/code_samples_primary_field_guide_add_document_primary_key.mdx
+++ b/snippets/samples/code_samples_primary_field_guide_add_document_primary_key.mdx
@@ -85,7 +85,8 @@ documents := []map[string]interface{}{
"price": 5.00,
},
}
-client.Index("books").AddDocuments(documents, "reference_number")
+refrenceNumber := "reference_number"
+client.Index("books").AddDocuments(documents, &refrenceNumber)
```
```csharp C#
diff --git a/snippets/samples/code_samples_related_results_embedder_1.mdx b/snippets/samples/code_samples_related_results_embedder_1.mdx
index 5a66c2737..1f285b42d 100644
--- a/snippets/samples/code_samples_related_results_embedder_1.mdx
+++ b/snippets/samples/code_samples_related_results_embedder_1.mdx
@@ -15,4 +15,20 @@ curl -X PATCH 'MEILISEARCH_URL/indexes/movies/settings'
}
}'
```
+
+```rust Rust
+let embedders = HashMap::from([(
+ String::from("movies-text"),
+ Embedder {
+ source: EmbedderSource::OpenAi,
+ api_key: Some(String::from("OPENAI_API_KEY")),
+ model: Some(String::from("text-embedding-3-small")),
+ document_template: Some(String::from("A movie titled '{{doc.title}}' released in {{ doc.release_date }}. The movie genres are: {{doc.genres}}. The story is about: {{doc.overview|truncatewords: 20}}")),
+ ..Embedder::default()
+ }
+)]);
+movies.set_embedders(&embedders)
+ .await
+ .unwrap();
+```
\ No newline at end of file
diff --git a/snippets/samples/code_samples_related_results_search_1.mdx b/snippets/samples/code_samples_related_results_search_1.mdx
index c2ae498ed..38bb44ab5 100644
--- a/snippets/samples/code_samples_related_results_search_1.mdx
+++ b/snippets/samples/code_samples_related_results_search_1.mdx
@@ -11,4 +11,13 @@ curl -X POST 'MEILISEARCH_URL/indexes/INDEX_NAME/search' \
}
}'
```
+
+```rust Rust
+let results = movies.search()
+ .with_query("batman")
+ .with_hybrid("EMBEDDER_NAME", 0.5)
+ .execute()
+ .await
+ .unwrap();
+```
\ No newline at end of file
diff --git a/snippets/samples/code_samples_related_results_similar_1.mdx b/snippets/samples/code_samples_related_results_similar_1.mdx
index 8e263858a..24fbdbf35 100644
--- a/snippets/samples/code_samples_related_results_similar_1.mdx
+++ b/snippets/samples/code_samples_related_results_similar_1.mdx
@@ -10,4 +10,11 @@ curl \
"embedder": "EMBEDDER_NAME"
}'
```
+
+```rust Rust
+let results = movies.similar_search("192", "EMBEDDER_NAME")
+ .execute()
+ .await
+ .unwrap();
+```
\ No newline at end of file
diff --git a/snippets/samples/code_samples_reset_embedders_1.mdx b/snippets/samples/code_samples_reset_embedders_1.mdx
index 77e8a2ff8..b9eaee801 100644
--- a/snippets/samples/code_samples_reset_embedders_1.mdx
+++ b/snippets/samples/code_samples_reset_embedders_1.mdx
@@ -8,4 +8,8 @@ curl \
```ruby Ruby
client.index('INDEX_NAME').reset_embedders
```
+
+```rust Rust
+index.reset_embedders().await.unwrap();
+```
\ No newline at end of file
diff --git a/snippets/samples/code_samples_reset_facet_search_settings_1.mdx b/snippets/samples/code_samples_reset_facet_search_settings_1.mdx
index 6b939a3d3..9591211ce 100644
--- a/snippets/samples/code_samples_reset_facet_search_settings_1.mdx
+++ b/snippets/samples/code_samples_reset_facet_search_settings_1.mdx
@@ -24,4 +24,12 @@ client.index('INDEX_UID').reset_facet_search_setting
```go Go
client.Index("books").ResetFacetSearch()
```
+
+```rust Rust
+let task: TaskInfo = client
+ .index(INDEX_UID)
+ .reset_facet_search()
+ .await
+ .unwrap();
+```
\ No newline at end of file
diff --git a/snippets/samples/code_samples_reset_prefix_search_settings_1.mdx b/snippets/samples/code_samples_reset_prefix_search_settings_1.mdx
index a4670ca9c..b161e68b3 100644
--- a/snippets/samples/code_samples_reset_prefix_search_settings_1.mdx
+++ b/snippets/samples/code_samples_reset_prefix_search_settings_1.mdx
@@ -24,4 +24,12 @@ client.index('INDEX_UID').reset_prefix_search
```go Go
client.Index("books").ResetPrefixSearch()
```
+
+```rust Rust
+let task: TaskInfo = client
+ .index(INDEX_UID)
+ .reset_prefix_search()
+ .await
+ .unwrap();
+```
\ No newline at end of file
diff --git a/snippets/samples/code_samples_search_parameter_guide_hybrid_1.mdx b/snippets/samples/code_samples_search_parameter_guide_hybrid_1.mdx
index eb830e921..e61487848 100644
--- a/snippets/samples/code_samples_search_parameter_guide_hybrid_1.mdx
+++ b/snippets/samples/code_samples_search_parameter_guide_hybrid_1.mdx
@@ -29,4 +29,14 @@ $client->index('INDEX_NAME')->search('kitchen utensils', [
]
]);
```
+
+```rust Rust
+let results = index
+ .search()
+ .with_query("kitchen utensils")
+ .with_hybrid("EMBEDDER_NAME", 0.9)
+ .execute()
+ .await
+ .unwrap();
+```
\ No newline at end of file
diff --git a/snippets/samples/code_samples_search_parameter_guide_vector_1.mdx b/snippets/samples/code_samples_search_parameter_guide_vector_1.mdx
index 3c1c97152..ad8a2c35a 100644
--- a/snippets/samples/code_samples_search_parameter_guide_vector_1.mdx
+++ b/snippets/samples/code_samples_search_parameter_guide_vector_1.mdx
@@ -10,4 +10,14 @@ curl -X POST 'MEILISEARCH_URL/indexes/INDEX_NAME/search' \
}
}'
```
+
+```rust Rust
+let results = index
+ .search()
+ .with_vector(&[0.0, 1.0, 2.0])
+ .with_hybrid("EMBEDDER_NAME", 1.0)
+ .execute()
+ .await
+ .unwrap();
+```
\ No newline at end of file
diff --git a/snippets/samples/code_samples_search_parameter_reference_retrieve_vectors_1.mdx b/snippets/samples/code_samples_search_parameter_reference_retrieve_vectors_1.mdx
index bb19be7a1..3aa36ee05 100644
--- a/snippets/samples/code_samples_search_parameter_reference_retrieve_vectors_1.mdx
+++ b/snippets/samples/code_samples_search_parameter_reference_retrieve_vectors_1.mdx
@@ -29,4 +29,15 @@ $client->index('INDEX_NAME')->search('kitchen utensils', [
]
]);
```
+
+```rust Rust
+let results = index
+ .search()
+ .with_query("kitchen utensils")
+ .with_retrieve_vectors(true)
+ .with_hybrid("EMBEDDER_NAME", 0.5)
+ .execute()
+ .await
+ .unwrap();
+```
\ No newline at end of file
diff --git a/snippets/samples/code_samples_search_post_1.mdx b/snippets/samples/code_samples_search_post_1.mdx
index 3057177f4..dfb4452cb 100644
--- a/snippets/samples/code_samples_search_post_1.mdx
+++ b/snippets/samples/code_samples_search_post_1.mdx
@@ -39,7 +39,7 @@ await client.Index("movies").SearchAsync("American ninja");
let results: SearchResults = client
.index("movies")
.search()
- .with_query("American ninja")
+ .with_query("american ninja")
.execute()
.await
.unwrap();
diff --git a/snippets/samples/code_samples_typo_tolerance_guide_5.mdx b/snippets/samples/code_samples_typo_tolerance_guide_5.mdx
index 6733ece79..55582c22b 100644
--- a/snippets/samples/code_samples_typo_tolerance_guide_5.mdx
+++ b/snippets/samples/code_samples_typo_tolerance_guide_5.mdx
@@ -26,4 +26,10 @@ $client->index('movies')->updateTypoTolerance([
'disableOnNumbers' => true
]);
```
+
+```go Go
+client.Index("movies").UpdateTypoTolerance(&meilisearch.TypoTolerance{
+ DisableOnNumbers: true
+})
+```
\ No newline at end of file
diff --git a/snippets/samples/code_samples_update_embedders_1.mdx b/snippets/samples/code_samples_update_embedders_1.mdx
index f8fb461ee..89c1458e1 100644
--- a/snippets/samples/code_samples_update_embedders_1.mdx
+++ b/snippets/samples/code_samples_update_embedders_1.mdx
@@ -46,4 +46,21 @@ client.index('INDEX_NAME').update_embedders(
}
)
```
+
+```rust Rust
+let embedders = HashMap::from([(
+ String::from("default"),
+ Embedder {
+ source: EmbedderSource::OpenAi,
+ api_key: Some(String::from("OPEN_AI_API_KEY")),
+ model: Some(String::from("text-embedding-3-small")),
+ document_template: Some(String::from("A document titled '{{doc.title}}' whose description starts with {{doc.overview|truncatewords: 20}}")),
+ ..Embedder::default()
+ }
+)]);
+let task = index
+ .set_embedders(&embedders)
+ .await
+ .unwrap();
+```
\ No newline at end of file
diff --git a/snippets/samples/code_samples_update_facet_search_settings_1.mdx b/snippets/samples/code_samples_update_facet_search_settings_1.mdx
index bb7a7ac19..bbcbe5a39 100644
--- a/snippets/samples/code_samples_update_facet_search_settings_1.mdx
+++ b/snippets/samples/code_samples_update_facet_search_settings_1.mdx
@@ -26,4 +26,12 @@ client.index('INDEX_UID').update_facet_search_setting(false)
```go Go
client.Index("books").UpdateFacetSearch(false)
```
+
+```rust Rust
+let task: TaskInfo = client
+ .index(INDEX_UID)
+ .set_facet_search(false)
+ .await
+ .unwrap();
+```
\ No newline at end of file
diff --git a/snippets/samples/code_samples_update_faceting_settings_1.mdx b/snippets/samples/code_samples_update_faceting_settings_1.mdx
index b56548fe9..5c1ce28ef 100644
--- a/snippets/samples/code_samples_update_faceting_settings_1.mdx
+++ b/snippets/samples/code_samples_update_faceting_settings_1.mdx
@@ -85,8 +85,12 @@ await client.Index("books").UpdateFacetingAsync(faceting);
```
```rust Rust
+let mut facet_sort_setting = BTreeMap::new();
+facet_sort_setting.insert(String::from("*"), FacetSortValue::Alpha);
+facet_sort_setting.insert(String::from("genres"), FacetSortValue::Count);
let mut faceting = FacetingSettings {
max_values_per_facet: 2,
+ sort_facet_values_by: Some(facet_sort_setting),
};
let task: TaskInfo = client
diff --git a/snippets/samples/code_samples_update_filterable_attributes_1.mdx b/snippets/samples/code_samples_update_filterable_attributes_1.mdx
index e5319e8fe..280180ef9 100644
--- a/snippets/samples/code_samples_update_filterable_attributes_1.mdx
+++ b/snippets/samples/code_samples_update_filterable_attributes_1.mdx
@@ -71,9 +71,29 @@ client.index('movies').update_filterable_attributes([
```
```go Go
-filterableAttributes := []string{
+filterableAttributes := []interface{}{
"genres",
"director",
+ AttributeRule{
+ AttributePatterns: []string{"tag"}
+ Features: AttributeFeatures{
+ FacetSearch: false,
+ Filter: FilterFeatures{
+ Equality: true,
+ Comparison: false,
+ }
+ }
+ },
+ map[string]interface{}{
+ "attributePatterns": []interface{}{"year"}
+ "features": map[string]interface{}{
+ "facetSearch": false,
+ "filter": map[string]interface{}{
+ "equality": true,
+ "comparison": true,
+ }
+ }
+ }
}
client.Index("movies").UpdateFilterableAttributes(&filterableAttributes)
```
diff --git a/snippets/samples/code_samples_update_prefix_search_settings_1.mdx b/snippets/samples/code_samples_update_prefix_search_settings_1.mdx
index 2f7f00d6a..4e4dcd1f6 100644
--- a/snippets/samples/code_samples_update_prefix_search_settings_1.mdx
+++ b/snippets/samples/code_samples_update_prefix_search_settings_1.mdx
@@ -26,4 +26,12 @@ client.index('INDEX_UID').update_prefix_search('disabled')
```go Go
client.Index("books").UpdatePrefixSearch("disabled")
```
+
+```rust Rust
+let task: TaskInfo = client
+ .index(INDEX_UID)
+ .set_prefix_search(PrefixSearchSettings::Disabled)
+ .await
+ .unwrap();
+```
\ No newline at end of file