diff --git a/.code-samples.meilisearch.yaml b/.code-samples.meilisearch.yaml
index 4513bc6674..3bf3d8582b 100644
--- a/.code-samples.meilisearch.yaml
+++ b/.code-samples.meilisearch.yaml
@@ -1444,3 +1444,46 @@ experimental_post_logs_stream_1: |-
experimental_delete_logs_stream_1: |-
curl \
-X DELETE MEILISEARCH_URL/logs/stream
+multi_search_remote_federated_1: |-
+ curl \
+ -X POST 'MEILISEARCH_URL/multi-search' \
+ -H 'Content-Type: application/json' \
+ --data-binary '{
+ "federation": {},
+ "queries": [
+ {
+ "indexUid": "movies",
+ "q": "batman",
+ "federationOptions": {
+ "remote": "ms-00"
+ }
+ },
+ {
+ "indexUid": "movies",
+ "q": "batman",
+ "federationOptions": {
+ "remote": "ms-01"
+ }
+ }
+ ]
+ }'
+get_network_1: |-
+ curl \
+ -X GET 'MEILISEARCH_URL/network'
+update_network_1: |-
+ curl \
+ -X PATCH 'MEILISEARCH_URL/network' \
+ -H 'Content-Type: application/json' \
+ --data-binary '{
+ "self": "ms-00",
+ "remotes": {
+ "ms-00": {
+ "url": "http://INSTANCE_URL",
+ "searchApiKey": "INSTANCE_API_KEY"
+ },
+ "ms-01": {
+ "url": "http://ANOTHER_INSTANCE_URL",
+ "searchApiKey": "ANOTHER_INSTANCE_API_KEY"
+ }
+ }
+ }'
diff --git a/config/sidebar-learn.json b/config/sidebar-learn.json
index d2d7f294bf..c2658eb91d 100644
--- a/config/sidebar-learn.json
+++ b/config/sidebar-learn.json
@@ -267,6 +267,11 @@
"label": "Using multi-search to perform a federated search",
"slug": "performing_federated_search"
},
+ {
+ "source": "learn/multi_search/implement_sharding.mdx",
+ "label": "Implement sharding with remote federated search",
+ "slug": "implement_sharding"
+ },
{
"source": "learn/multi_search/multi_search_vs_federated_search.mdx",
"label": "Differences between multi-search and federated search",
diff --git a/config/sidebar-reference.json b/config/sidebar-reference.json
index 26c07e1180..8d8bd85872 100644
--- a/config/sidebar-reference.json
+++ b/config/sidebar-reference.json
@@ -28,6 +28,11 @@
"label": "Multi-search",
"slug": "multi_search"
},
+ {
+ "source": "reference/api/network.mdx",
+ "label": "Network",
+ "slug": "network"
+ },
{
"source": "reference/api/similar.mdx",
"label": "Similar documents",
diff --git a/learn/multi_search/implement_sharding.mdx b/learn/multi_search/implement_sharding.mdx
new file mode 100644
index 0000000000..db4c33c6c2
--- /dev/null
+++ b/learn/multi_search/implement_sharding.mdx
@@ -0,0 +1,129 @@
+---
+title: Implement sharding with remote federated search — Meilisearch documentation
+description: This guide walks you through implementing a sharding strategy by activating the `/network` route, configuring the network object, and performing remote federated searches.
+---
+
+# Implement sharding with remote federated search
+
+Sharding is the process of splitting an index containing many documents into multiple smaller indexes, often called shards. This horizontal scaling technique is useful when handling large databases. In Meilisearch, the best way to implement a sharding strategy is to use remote federated search.
+
+This guide walks you through activating the `/network` route, configuring the network object, and performing remote federated searches.
+
+
+To minimize issues and limit unexpected behavior, instance, network, and index configuration should be identical for all shards. This guide describes the individual steps you must take on a single instance and assumes you will replicate them across all instances.
+
+
+## Prerequisites
+
+- Multiple Meilisearch projects (instances) running Meilisearch >=v1.13
+
+## Activate the `/network` endpoint
+
+### Meilisearch Cloud
+
+If you are using Meilisearch Cloud, contact support to enable this feature in your projects.
+
+### Self-hosting
+
+Use the `/experimental-features` route to enable `network`:
+
+```sh
+curl \
+ -X PATCH 'MEILISEARCH_URL/experimental-features/' \
+ -H 'Content-Type: application/json' \
+ --data-binary '{
+ "network": true
+ }'
+```
+
+Meilisearch should respond immediately, confirming the route is now accessible. Repeat this process for all instances.
+
+## Configuring the network object
+
+Next, you must configure the network object. It consists of the following fields:
+
+- `remotes`: defines a list with the required information to access each remote instance
+- `self`: specifies which of the configured `remotes` corresponds to the current instance
+
+### Setting up the list of remotes
+
+Use the `/network` route to configure the `remotes` field of the network object. `remotes` should be an object containing one or more objects. Each one of the nested objects should consist of the name of each instance, associated with its URL and an API key with search permission:
+
+```sh
+curl \
+ -X PATCH 'MEILISEARCH_URL/network' \
+ -H 'Content-Type: application/json' \
+ --data-binary '{
+ "remotes": {
+ "REMOTE_NAME_1": {
+ "url": "INSTANCE_URL_1",
+ "searchApiKey": "SEARCH_API_KEY_1"
+ },
+ "REMOTE_NAME_2": {
+ "url": "INSTANCE_URL_2",
+ "searchApiKey": "SEARCH_API_KEY_2"
+ },
+ "REMOTE_NAME_3": {
+ "url": "INSTANCE_URL_3",
+ "searchApiKey": "SEARCH_API_KEY_3"
+ },
+ …
+ }
+ }'
+```
+
+Configure the entire set of remote instances in your sharded database, making sure to send the same remotes to each instance.
+
+### Specify the name of the current instance
+
+Now all instances share the same list of remotes, set the `self` field to specify which of the remotes corresponds to the current instance:
+
+```sh
+curl \
+ -X PATCH 'MEILISEARCH_URL/network' \
+ -H 'Content-Type: application/json' \
+ --data-binary '{
+ "self": "REMOTE_NAME_1"
+ }'
+```
+
+Meilisearch processes searches on the remote that corresponds to `self` locally instead of making a remote request.
+
+### Adding or removing an instance
+
+Changing the topology of the network involves moving some documents from an instance to another, depending on your hashing scheme.
+
+As Meilisearch does not provide atomicity across multiple instances, you will need to either:
+
+1. accept search downtime while migrating documents
+2. accept some documents will not appear in search results during the migration
+3. accept some duplicate documents may appear in search results during the migration
+
+#### Reducing downtime
+
+If your disk space allows, you can reduce the downtime by applying the following algorithm:
+
+1. Create a new temporary index in each remote instance
+2. Compute the new instance for each document
+3. Send the documents to the temporary index of their new instance
+4. Once Meilisearch has copied all documents to their instance of destination, swap the new index with the previously used index
+5. Delete the temporary index after the swap
+6. Update network configuration and search queries across all instances
+
+## Create indexes and add documents
+
+Create the same empty indexes with the same settings on all instances. Keeping the settings and indexes in sync is important to avoid errors and unexpected behavior, though not strictly required.
+
+Distribute your documents across all instances. Do not send the same document to multiple instances as this may lead to duplicate search results. Similarly, you should ensure all future versions of a document are sent to the same instance. Meilisearch recommends you hash their primary key using [rendezvous hashing](https://en.wikipedia.org/wiki/Rendezvous_hashing).
+
+### Updating index settings
+
+Changing settings in a sharded database is not fundamentally different from changing settings on a single Meilisearch instance. If the update enables a feature, such as setting filterable attributes, wait until all changes have been processed before using the `filter` search parameter in a query. Likewise, if an update disables a feature, first remove it from your search requests, then update your settings.
+
+## Perform a search
+
+Send your federated search request containing one query per instance:
+
+
+
+If all instances share the same network configuration, you can send the search request to any instance. Having `"remote": "ms-00"` appear in the list of queries on the instance of that name will not cause an actual proxy search thanks to `network.self`.
diff --git a/learn/resources/experimental_features_overview.mdx b/learn/resources/experimental_features_overview.mdx
index f800a1d1f4..74dc280efd 100644
--- a/learn/resources/experimental_features_overview.mdx
+++ b/learn/resources/experimental_features_overview.mdx
@@ -42,13 +42,15 @@ Activating or deactivating experimental features this way does not require you t
## Current experimental features
-| Name | Description | How to configure |
-|----------------------------------------------------------------------------------|------------------------------------------------------------|---------------------------------------------------|
-| [Limit task batch size](/learn/self_hosted/configure_meilisearch_at_launch) | Limits number of tasks processed in a single batch | At launch with a CLI flag or environment variable |
-| [Log customization](/reference/api/logs) | Customize log output and set up log streams | At launch with a CLI flag or environment variable, during runtime with the API route |
-| [Metrics API](/reference/api/metrics) | Exposes Prometheus-compatible analytics data | At launch with a CLI flag or environment variable, during runtime with the API route |
-| [Reduce indexing memory usage](/learn/self_hosted/configure_meilisearch_at_launch) | Optimizes indexing performance | At launch with a CLI flag or environment variable |
-| [Replication parameters](/learn/self_hosted/configure_meilisearch_at_launch) | Alters task processing for clustering compatibility | At launch with a CLI flag or environment variable |
-| [Search queue size](/learn/self_hosted/configure_meilisearch_at_launch) | Configure maximum number of concurrent search requests | At launch with a CLI flag or environment variable |
-| [`CONTAINS` filter operator](/learn/filtering_and_sorting/filter_expression_reference#contains) | Enables usage of `CONTAINS` with the `filter` search parameter | During runtime with the API route |
-| [Edit documents with function](/reference/api/documents#update-documents-with-function) | Use a RHAI function to edit documents directly in the Meilisearch database | During runtime with the API route |
+| Name | Description | How to configure |
+| ----------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------- | ------------------------------------------- |
+| [Limit task batch size](/learn/self_hosted/configure_meilisearch_at_launch) | Limits number of tasks processed in a single batch | CLI flag or environment variable |
+| [Log customization](/reference/api/logs) | Customize log output and set up log streams | CLI flag or environment variable, API route |
+| [Metrics API](/reference/api/metrics) | Exposes Prometheus-compatible analytics data | CLI flag or environment variable, API route |
+| [Reduce indexing memory usage](/learn/self_hosted/configure_meilisearch_at_launch) | Optimizes indexing performance | CLI flag or environment variable |
+| [Replication parameters](/learn/self_hosted/configure_meilisearch_at_launch) | Alters task processing for clustering compatibility | CLI flag or environment variable |
+| [Search queue size](/learn/self_hosted/configure_meilisearch_at_launch) | Configure maximum number of concurrent search requests | CLI flag or environment variable |
+| [`CONTAINS` filter operator](/learn/filtering_and_sorting/filter_expression_reference#contains) | Enables usage of `CONTAINS` with the `filter` search parameter | API route |
+| [Edit documents with function](/reference/api/documents#update-documents-with-function) | Use a RHAI function to edit documents directly in the Meilisearch database | API route |
+| [`/network` route](/reference/api/network) | Enable `/network` route | API route |
+| [Dumpless upgrade](/learn/self_hosted/configure_meilisearch_at_launch#dumpless-upgrade) | Upgrade Meilisearch without generating a dump | API route |
diff --git a/reference/api/experimental_features.mdx b/reference/api/experimental_features.mdx
index ceb787a893..7233b28319 100644
--- a/reference/api/experimental_features.mdx
+++ b/reference/api/experimental_features.mdx
@@ -20,16 +20,18 @@ The experimental API route is not compatible with all experimental features. Con
"metrics": false,
"logsRoute": true,
"containsFilter": false,
- "editDocumentsByFunction": false
+ "editDocumentsByFunction": false,
+ "network": false
}
```
-| Name | Type | Description |
+| Name | Type | Description |
| :---------------------------- | :------ | :--------------------------------------------- |
| **`metrics`** | Boolean | `true` if feature is active, `false` otherwise |
| **`logsRoute`** | Boolean | `true` if feature is active, `false` otherwise |
| **`containsFilter`** | Boolean | `true` if feature is active, `false` otherwise |
| **`editDocumentsByFunction`** | Boolean | `true` if feature is active, `false` otherwise |
+| **`network`** | Boolean | `true` if feature is active, `false` otherwise |
## Get all experimental features
@@ -48,7 +50,8 @@ Get a list of all experimental features that can be activated via the `/experime
"metrics": false,
"logsRoute": true,
"containsFilter": false,
- "editDocumentsByFunction": false
+ "editDocumentsByFunction": false,
+ "network": false
}
```
@@ -75,6 +78,7 @@ Setting a field to `null` leaves its value unchanged.
"metrics": false,
"logsRoute": true,
"containsFilter": false,
- "editDocumentsByFunction": false
+ "editDocumentsByFunction": false,
+ "network": false
}
```
diff --git a/reference/api/keys.mdx b/reference/api/keys.mdx
index 019042bf09..432699252d 100644
--- a/reference/api/keys.mdx
+++ b/reference/api/keys.mdx
@@ -101,6 +101,8 @@ For security reasons, we do not recommend creating keys that can perform all act
| **`keys.create`** | Provides access to the [create key](#create-a-key) endpoint |
| **`keys.update`** | Provides access to the [update key](#update-a-key) endpoint |
| **`keys.delete`** | Provides access to the [delete key](#delete-a-key) endpoint |
+| **`network.get`** | Provides access to the [get the network object](/reference/api/network#get-the-network-object) endpoint |
+| **`network.update`** | Provides access to the [update the network object](/reference/api/network#update-the-network-object) endpoint |
### `indexes`
diff --git a/reference/api/multi_search.mdx b/reference/api/multi_search.mdx
index a0877a0e1b..ded0200bb0 100644
--- a/reference/api/multi_search.mdx
+++ b/reference/api/multi_search.mdx
@@ -139,14 +139,14 @@ There is no way to specify that two documents should be treated as the same acro
| Search parameter | Type | Default value | Description |
| :--------------------------------------------------------------------------- | :--------------- | :------------ | :-------------------------------------------------- |
-| **[`federationOptions`](#federationoptions)** | Object | `null` | Configure federation settings for a specific query |
-| **[`indexUid`](/learn/getting_started/indexes#index-uid)** | String | N/A | `uid` of the requested index |
+| **[`federationOptions`](#federationoptions)** | Object | `null` | Configure federation settings for a specific query |
+| **[`indexUid`](/learn/getting_started/indexes#index-uid)** | String | N/A | `uid` of the requested index |
| **[`q`](/reference/api/search#query-q)** | String | `""` | Query string |
| **[`offset`](/reference/api/search#offset)** | Integer | `0` | Number of documents to skip |
| **[`limit`](/reference/api/search#limit)** | Integer | `20` | Maximum number of documents returned |
| **[`hitsPerPage`](/reference/api/search#number-of-results-per-page)** | Integer | `1` | Maximum number of documents returned for a page |
| **[`page`](/reference/api/search#page)** | Integer | `1` | Request a specific page of results |
-| **[`filter`](/reference/api/search#filter)** | [String](/learn/filtering_and_sorting/filter_expression_reference) | `null` | Filter queries by an attribute's value |
+| **[`filter`](/reference/api/search#filter)** | String | `null` | Filter queries by an attribute's value |
| **[`facets`](/reference/api/search#facets)** | Array of strings | `null` | Display the count of matches per facet |
| **[`attributesToRetrieve`](/reference/api/search#attributes-to-retrieve)** | Array of strings | `["*"]` | Attributes to display in the returned documents |
| **[`attributesToCrop`](/reference/api/search#attributes-to-crop)** | Array of strings | `null` | Attributes whose values have to be cropped |
@@ -172,10 +172,11 @@ These options are not compatible with federated searches.
`federationOptions` must be an object. It accepts the following parameters:
- `weight`: serves as a multiplicative factor to ranking scores of search results in this specific query. If < `1.0`, the hits from this query are less likely to appear in the final results list. If > `1.0`, the hits from this query are more likely to appear in the final results list. Must be a positive floating-point number. Defaults to `1.0`
+- `remote` : indicates the remote instance where Meilisearch will perform the query. Must be a string corresponding to a [remote object](/reference/api/network). Defaults to `null`
### Response
-The response to `/multi-search` queries may take two shapes: federated and non-federated.
+The response to `/multi-search` queries may take different shapes depending on the type of query you're making.
#### Non-federated multi-search requests
@@ -187,7 +188,7 @@ Each search result object is composed of the following fields:
| Name | Type | Description |
| :----------------------- | :--------------- | :------------------------------------------------------------------------------- |
-| **`indexUid`** | String | [`uid`](/learn/getting_started/indexes#index-uid) of the requested index |
+| **`indexUid`** | String | [`uid`](/learn/getting_started/indexes#index-uid) of the requested index |
| **`hits`** | Array of objects | Results of the query |
| **`offset`** | Number | Number of documents skipped |
| **`limit`** | Number | Number of documents to take |
@@ -212,16 +213,19 @@ Federated search requests return a single object and the following fields:
| **`limit`** | Number | Number of documents to take |
| **`estimatedTotalHits`** | Number | Estimated total number of matches |
| **`processingTimeMs`** | Number | Processing time of the query |
-| **`facetsByIndex`** | Object | [Data for facets present in the search results](#facetsbyindex) |
-| **`facetDistribution`** | Object | [Distribution of the given facets](#mergefacets) |
-| **`facetStats`** | Object | [The numeric `min` and `max` values per facet](#mergefacets) |
+| **`facetsByIndex`** | Object | [Data for facets present in the search results](#facetsbyindex) |
+| **`facetDistribution`** | Object | [Distribution of the given facets](#mergefacets) |
+| **`facetStats`** | Object | [The numeric `min` and `max` values per facet](#mergefacets) |
+| **`remoteErrors`** | Object | Indicates which remote requests failed and why |
Each result in the `hits` array contains an additional `_federation` field with the following fields:
-| Name | Type | Description |
-| :----------------------- | :--------------- | :------------------------------------------------------------------------------- |
-| **`indexUid`** | String | Index of origin for this document |
-| **`queriesPosition`** | Number | Array index number of the query in the request's `queries` array |
+| Name | Type | Description |
+| :-------------------------- | :--------------- | :--------------------------------------------------------------------------------- |
+| **`indexUid`** | String | Index of origin for this document |
+| **`queriesPosition`** | Number | Array index number of the query in the request's `queries` array |
+| **`remote`** | String | Remote instance of origin for this document
+| **`weightedRankingScore`** | Number | The product of the _rankingScore of the hit and the weight of the query of origin. |
### Example
@@ -229,7 +233,7 @@ Each result in the `hits` array contains an additional `_federation` field with
-#### Response: `200 Ok`
+##### Response: `200 Ok`
```json
{
@@ -289,7 +293,7 @@ Each result in the `hits` array contains an additional `_federation` field with
-#### Response: `200 Ok`
+##### Response: `200 Ok`
```json
{
@@ -321,3 +325,51 @@ Each result in the `hits` array contains an additional `_federation` field with
"semanticHitCount": 0
}
```
+
+#### Remote federated multi-search
+
+
+
+##### Response: `200 Ok`
+
+```json
+{
+ "hits": [
+ {
+ "id": 42,
+ "title": "Batman returns",
+ "overview": …,
+ "_federation": {
+ "indexUid": "movies",
+ "queriesPosition": 0,
+ "weightedRankingScore": 1.0,
+ "remote": "ms-01"
+ }
+ },
+ {
+ "id": 87,
+ "description": …,
+ "title": "Batman: the killing joke",
+ "_federation": {
+ "indexUid": "movies",
+ "queriesPosition": 1,
+ "weightedRankingScore": 0.9848484848484849,
+ "remote": "ms-00"
+ }
+ },
+ …
+ ],
+ "processingTimeMs": 35,
+ "limit": 5,
+ "offset": 0,
+ "estimatedTotalHits": 111,
+ "remoteErrors": {
+ "ms-02": {
+ "message": "error sending request",
+ "code": "proxy_could_not_send_request",
+ "type": "system",
+ "link": "https://docs.meilisearch.com/errors#proxy_could_not_make_request"
+ }
+ }
+}
+```
diff --git a/reference/api/network.mdx b/reference/api/network.mdx
new file mode 100644
index 0000000000..494d3c75e2
--- /dev/null
+++ b/reference/api/network.mdx
@@ -0,0 +1,150 @@
+---
+title: Network — Meilisearch API reference
+description: Use the `/network` route to create a network of Meilisearch instances.
+---
+
+# Network
+
+Use the `/network` route to create a network of Meilisearch instances. This is particularly useful when used together with federated search to implement horizontal database partition strategies such as sharding.
+
+
+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 '{
+ "network": true
+ }'
+```
+
+
+
+If an attribute is both:
+
+- not on the `displayedAttributes` list
+- present on the `sortableAttributes`
+
+It is possible its value becomes publicly accessible via the `/network` endpoint.
+
+Do not enable the `network` feature if you rely on the value of attributes not present in `displayedAttributes` to remain hidden at all times.
+
+
+## The network object
+
+```json
+{
+ "self": "ms-00",
+ "remotes": {
+ "ms-00": {
+ "url": "http://ms-1235.example.meilisearch.io",
+ "searchApiKey": "Ecd1SDDi4pqdJD6qYLxD3y7VZAEb4d9j6LJgt4d6xas"
+ },
+ "ms-01": {
+ "url": "http://ms-4242.example.meilisearch.io",
+ "searchApiKey": "hrVu-OMcjPGElK7692K7bwriBoGyHXTMvB5NmZkMKqQ"
+ }
+ }
+}
+```
+
+### `self`
+
+**Type**: String
+**Default value**: `null`
+**Description**: A string indicating the name of the current instance
+
+### `remotes`
+
+**Type**: Object
+**Default value**: `{}`
+**Description**: An object containing [remote objects](#the-remote-object). The key of each remote object indicates the name of the remote instance
+
+#### The remote object
+
+```json
+"ms-00": {
+ "url": "http://ms-1235.example.meilisearch.io",
+ "searchApiKey": "Ecd1SDDi4pqdJD6qYLxD3y7VZAEb4d9j6LJgt4d6xas"
+}
+```
+
+##### `url`
+
+**Type**: String
+**Default value**: `null`
+**Description**: URL indicating the address of a Meilisearch instance. This URL does not need to be public, but must be accessible to all instances in the network. Required
+
+##### `searchApiKey`
+
+**Type**: String
+**Default value**: `null`
+**Description**: An API key with search permissions
+
+## Get the network object
+
+
+
+Returns the current value of the instance's network object.
+
+### Example
+
+
+
+#### Response: `200 Ok`
+
+```json
+{
+ "self": "ms-00",
+ "remotes": {
+ "ms-00": {
+ "url": "http://ms-1235.example.meilisearch.io",
+ "searchApiKey": "Ecd1SDDi4pqdJD6qYLxD3y7VZAEb4d9j6LJgt4d6xas"
+ },
+ "ms-01": {
+ "url": "http://ms-4242.example.meilisearch.io",
+ "searchApiKey": "hrVu-OMcjPGElK7692K7bwriBoGyHXTMvB5NmZkMKqQ"
+ }
+ }
+}
+```
+
+## Update the network object
+
+
+
+Update the `self` and `remotes` fields of the network object.
+
+Updates to the network object are **partial**. Only provide the fields you intend to update. Fields not present in the payload will remain unchanged.
+
+To reset `self` and `remotes` to their original value, set them to `null`. To remove a single `remote` from your network, set the value of its name to `null`.
+
+### Body
+
+| Name | Type | Default value | Description |
+| :-------------------------------- | :----- | :------------ | :---------------------------------- |
+| **[`self`](#self)** | String | `null` | The name of the current instance |
+| **[`remotes`](#remotes)** | String | `null` | A list of remote objects describing accessible Meilisearch instances |
+
+### Example
+
+
+
+#### Response: `200 Ok`
+
+```json
+{
+ "self": "ms-00",
+ "remotes": {
+ "ms-00": {
+ "url": "http://INSTANCE_URL",
+ "searchApiKey": "INSTANCE_API_KEY"
+ },
+ "ms-01": {
+ "url": "http://ANOTHER_INSTANCE_URL",
+ "searchApiKey": "ANOTHER_INSTANCE_API_KEY"
+ }
+ }
+}
+```
diff --git a/reference/errors/error_codes.mdx b/reference/errors/error_codes.mdx
index 8afb1b11c7..e21a48b6ef 100644
--- a/reference/errors/error_codes.mdx
+++ b/reference/errors/error_codes.mdx
@@ -43,6 +43,10 @@ An error occurred during the dump creation process. The task was aborted.
The [`/facet-search`](/reference/api/facet_search) route has been queried while [the `facetSearch` index setting](/reference/api/settings#facet-search) is set to `false`.
+## `feature_not_enabled`
+
+You have tried using an [experimental feature](/learn/resources/experimental_features_overview) without activating it.
+
## `immutable_api_key_actions`
The [`actions`](/reference/api/keys#actions) field of an API key cannot be modified.
@@ -213,6 +217,10 @@ A multi-search query includes `federationOptions` but the top-level `federation`
A multi-search query contains `page`, `hitsPerPage`, `limit` or `offset`, but the top-level federation object is not `null`.
+## `invalid_multi_search_query_position`
+
+`federationOptions.queryPosition` is not a positive integer.
+
## `invalid_multi_search_weight`
A multi-search query contains a negative value for `federated.weight`.
@@ -249,6 +257,26 @@ Two or more indexes have a different `faceting.sortFacetValuesBy` for the same r
`facetsByIndex` is not an object or contains unknown fields.
+## `invalid_multi_search_remote`
+
+`federationOptions.remote` is not `network.self` and is not a key in `network.remotes`.
+
+## `invalid_network_self`
+
+The [network object](/reference/api/network#the-network-object) contains a `self` that is not a string or `null`.
+
+## `invalid_network_remotes`
+
+The [network object](/reference/api/network#the-network-object) contains a `remotes` that is not an object or `null`.
+
+## `invalid_network_url`
+
+One of the remotes in the [network object](/reference/api/network#the-network-object) contains a `url` that is not a string.
+
+## `invalid_network_search_api_key`
+
+One of the remotes in the [network object](/reference/api/network#the-network-object) contains a `searchApiKey` that is not a string or `null`.
+
## `invalid_search_attributes_to_crop`
The [`attributesToCrop`](/reference/api/search#attributes-to-crop) parameter is invalid. It should be an array of strings, a string, or set to `null`.
@@ -419,15 +447,15 @@ This error occurs if:
- The [`minWordSizeForTypos`](/reference/api/settings#typo-tolerance-object) field is invalid. It should either be an integer or set to `null`
- The value of either [`oneTypo`](/reference/api/settings#typo-tolerance-object) or [`twoTypos`](/reference/api/settings#typo-tolerance-object) is invalid. It should either be an integer or set to `null`
-### `invalid_similar_id`
+## `invalid_similar_id`
The provided target document identifier is invalid. A document identifier can be of type integer or string, only composed of alphanumeric characters (a-z A-Z 0-9), hyphens (-) and underscores (_).
-### `not_found_similar_id`
+## `not_found_similar_id`
Meilisearch could not find the target document. Make sure your target document identifier corresponds to a document in your index.
-### `invalid_similar_attributes_to_retrieve`
+## `invalid_similar_attributes_to_retrieve`
[`attributesToRetrieve`](/reference/api/search#attributes-to-retrieve) is invalid. It should be an array of strings, a string, or set to null.
@@ -435,25 +463,25 @@ Meilisearch could not find the target document. Make sure your target document i
[`embedder`](/reference/api/similar#body) is invalid. It should be a string corresponding to the name of a configured embedder.
-### `invalid_similar_filter`
+## `invalid_similar_filter`
[`filter`](/reference/api/search#filter) is invalid or contains a filter expression with a missing or invalid operator. Filter expressions must be a string, array of strings, or array of array of strings for the POST endpoint. It must be a string for the GET endpoint.
Meilisearch also throws this error if the attribute used for filtering is not defined in the `filterableAttributes` list.
-### `invalid_similar_limit`
+## `invalid_similar_limit`
[`limit`](/reference/api/search#limit) is invalid. It should be an integer.
-### `invalid_similar_offset`
+## `invalid_similar_offset`
[`offset`](/reference/api/search#offset) is invalid. It should be an integer.
-### `invalid_similar_show_ranking_score`
+## `invalid_similar_show_ranking_score`
[`ranking_score`](/reference/api/search#ranking-score) is invalid. It should be a boolean.
-### `invalid_similar_show_ranking_score_details`
+## `invalid_similar_show_ranking_score_details`
[`ranking_score_details`](/reference/api/search#ranking-score-details) is invalid. It should be a boolean.
@@ -583,6 +611,10 @@ The [`facetName`](/reference/api/facet_search#body) parameter is required.
You need to set a master key before you can access the `/keys` route. Read more about setting a master key at launch in our [security tutorial](/learn/security/basic_security).
+## `missing_network_url`
+
+One of the remotes in the [network object](/reference/api/network#the-network-object) does not contain the `url` field.
+
## `missing_payload`
The Content-Type header was specified, but no request body was sent to the server or the request body is empty.
@@ -626,6 +658,32 @@ You have reached the limit of concurrent search requests. You may configure it b
The document exists in store, but there was an error retrieving it. This probably comes from an inconsistent state in the database.
-### `vector_embedding_error`
+## `vector_embedding_error`
Error while generating embeddings.
+
+## Remote federated search errors
+
+### `remote_bad_response`
+
+The remote instance answered with a response that this instance could not use as a federated search response.
+
+### `remote_bad_request`
+
+The remote instance answered with `400 BAD REQUEST`.
+
+### `remote_could_not_send_request`
+
+There was an error while sending the remote federated search request.
+
+### `remote_invalid_api_key`
+
+The remote instance answered with `403 FORBIDDEN` or `401 UNAUTHORIZED` to this instance’s request. The configured search API key is either missing, invalid, or lacks the required search permission.
+
+### `remote_remote_error`
+
+The remote instance answered with `500 INTERNAL ERROR`.
+
+### `remote_timeout`
+
+The proxy did not answer in the allocated time.