Changelog History
Page 3
-
v1.39.0 Changes
March 16, 2026What's Changed
β¨ Enhancement
π¬ Cross-index document hydration
β Add a new
ForeignKeyssetting allowing to hydrate documents with documents coming from other indexes.π > π Note: This implementation doesn't support a remote sharding environment
foreignKeysexperimental featureA new experimental feature,
foreignKeys, has been added to the/experimental-featureroute that must be set to true to activate the hydration.curl -X PATCH 'http://127.0.0.1:7700/experimental-features' \ -H 'Content-Type: application/json' \ --data-binary '{"foreignKeys": true}'foreignKeysindex settingA new index setting,
foreignKeys, has been added to the/indexes/{index_uid}/settings:// new setting, an array of foreign keys that allows multiple foreign relationships between indexes"foreignKeys": [ {// the path in the JSON document containing foreign document ids"fieldName":"actors",// the UID of the foreign index containing the documents to fetch during hydration"foreignIndexUid":"actors"} ]Example
With this new feature, a document shaped as follows:
{"id":1,"title":"Forrest Gump",// Document IDs in foreign index"actors": [1] }Will be hydrated as follows in a search response:
{"id":1,"title":"Forrest Gump","actors": [ {"id":1,"name":"Tom","familyName":"Hanks","birthDate":"1956-07-09"} ] }By @ManyTheFish in #6047
Disable proxy response buffering on Server-Sent Events (SSE)
β Add
X-Accel-Buffering: noonPOST /chats/{workspace_uid}/chat/completionswhen the streaming mode is activated.
By @YoEight in #6228π πͺ² Bug fixes
Fix a memory leak in the indexation pipeline by @Kerollmops in #6212
Avoid losing tasks by applying deltas on the wtxn view by @Kerollmops in #6222
π© Miscellaneous
- Ignore flaky test on windows by @dureuill in #6226
- Fix small documentation mistakes by @ManyTheFish in #6205
- Improve messaging when field is missing in the settings indexing pipeline by @Kerollmops in #6213
Full Changelog : v1.38.0...v1.39.0
-
v1.38.2 Changes
March 11, 2026π Meilisearch v1.38.2 fixes a regression introduced in Meilisearch v1.38.0 where Meilisearch could sometimes stop processing tasks after an automatic task queue cleanup performed while more tasks where being added.
We recommend that all users in v1.38.0 and v1.38.1 migrate to v1.38.2.
β¬οΈ Note that the dumpless upgrade process can take up to one minute before the HTTP server becomes available when migrating from a previous v1.38 version.
Full Changelog : v1.38.1...v1.38.2
-
v1.38.1 Changes
March 11, 2026π Meilisearch v1.38.1 fixes a regression we have seen in task processing, which caused the engine to stop processing tasks.
π πͺ² Bug fixes
- β‘οΈ Revert, optimize, and fix task deletion. By @Kerollmops in #6219
Full Changelog : v1.38.0...v1.38.1
-
v1.38.0 Changes
March 09, 2026π Meilisearch v1.38 drastically improves indexing performance for embeddings, cleans up the task queue of orphan tasks and batches, ensures they are correctly deleted now, fixes issues users may encounter with OpenAI or VoyageAI when generating embeddings, and improves the tooling for generating routes in the documentation.
β¨ Enhancement
- π Embeddings: Use the latest version of hannoy with improved performances by @Kerollmops in #6184
We drastically reduced embedding indexing time by eliminating full database scans. It is more efficient to add a couple of embeddings to a large database now. - β‘οΈ Tasks: Optimize and fix task deletion by @Mubelotix and @Kerollmops in #5828
π πͺ² Bug fixes
- Embedders: Fix the intermittent
connection reset by peererrors when embedding documents or search queries using a remote embedder. By @dureuill in #6191
π© Miscellaneous
- π Enforce that routes appear in the reference documentation by @dureuill and @ManyTheFish in #6200
π The reference API is now generated from the source code, but it used to miss some actix-declared routes. It is now mandatory to attach a route when using the newly-providedroutes::routesandroutes::pathmacros, which ensures the route is added to the reference. Please refer to the documentation of the individual macros and the many examples throughout the codebase for more details. - π Chore: remove verbose debug log on list documents by @StephaneRob in #6198
- β Add guide to CONTRIBUTING.md to test doc locally by @curquiza in #6180
- π Docs: capitalize LangChain and MCP in README by @24f1000637 in #6183
- π Docs: improve documentation of the parameters of the search route by @curquiza in #6194
π New Contributors
- @StephaneRob made their first contribution in #6198
- @24f1000637 made their first contribution in #6183
- π Embeddings: Use the latest version of hannoy with improved performances by @Kerollmops in #6184
-
v1.37.0 Changes
March 02, 2026Important
π₯ This release contains breaking changes for users of the
networkexperimental feature.π Meilisearch v1.37 introduces replicated sharding, removes the
vectorStoreSettingexperimental feature, stabilizes our new vector store for best performance, adds a security fix and miscellaneous improvements.β¨ Improvements
Β§ Replicated sharding
Note
Replicated sharding requires Meilisearch Enterprise Edition (EE).
- π Users of Meilisearch Cloud, please contact support if you need replicated sharding.
- π Users of the Community Edition, please contact the sales if you want to use replicated sharding in production.
Β§ Breaking changes
networkobjects sent to thePATCH /networkroute must now contain at least oneshardobject containing at least one remote whenleaderis notnull.
β¬οΈ Existing databases will be migrated automatically when upgraded with
--experimental-dumpless-upgradewhenleaderis notnull, such that for each remote:- A shard with the same name as the remote is created
- This shard has exactly one remote in its
remoteslist: the remote with the same name as the shard.
This change will not cause any document to be resharded.
β¬οΈ To be able to upgrade without resharding, the migration uses the same name for remotes and for shards. However, in new configurations, we recommend using different names for shards and remotes.
Example of migration
For instance, the following network object:
{"leader":"ms-00","self":"ms-01","remotes": {"ms-00": {/\* .. \*/},"ms-01": {/\* .. \*/} } }is converted to:
{"leader":"ms-00","self":"ms-01","remotes": {"ms-00": {/\* .. \*/},"ms-01": {/\* .. \*/} },"shards": {// β¨ NEW"ms-00": {// shard named like the remote"remotes": ["ms-00"]// is owned by the remote},"ms-01": {"remotes": ["ms-01"] } } }β Addition of
network.shardsThe
networkobject for routesPATCH /networkandGET /networknow contains the new fieldshards, which is an object whose values areshardobjects, and keys the name of each shard.Each
shardobject contains a single fieldremotes, which is an array of strings, each string representing the name of an existing remote.Convenience fields
π The
shardobjects inPATCH /networkcontain the additional fieldsaddRemotesandremoveRemotesmeant for convenience:- pass an array of remote names to
shard.addRemotesto add these remotes to the list of remotes of a shard. - π pass an array of remote names to
shard.removeRemotesto remove these remotes from the list of remotes of a shard. - if present and non-
null,shard.remoteswill completely override the existing list of remotes for a shard. - π if several of these options are present and non-
null, then the order of application isshard.remotes, thenshard.addRemotes, thenshard.removeShards.
β Adding a new shard with some remotes
// PATCH /network{// assuming that remotes `ms-0`, `ms-1`, `ms-2` where sent in a previous call to PATCH /network"shards": {"s-a": {// new shard"remotes": ["ms-0","ms-1"] } } }Remotes
ms-0andms-1own the new shards-a.Fully overriding the list of remotes owning a shard
// PATCH /network{// assuming remotes `ms-0`, `ms-1`, `ms-2`// assuming shard `s-a`, owned by `ms-0` and `ms-1`"shards": {"s-a": {"remotes": ["ms-2"] } } }ms-2is now the sole owner ofs-a, replacingms-0andms-1.β Adding a remote without overriding the list of remotes owning a shard
// PATCH /network{// assuming remotes `ms-0`, `ms-1`, `ms-2`// assuming shard `s-a`, owned by `ms-2`"shards": {"s-a": {"addRemotes": ["ms-0"] } } }ms-0andms-2are now the owners ofs-a.Removing a remote without overriding the list of remotes owning a shard
// PATCH /network{// assuming remotes `ms-0`, `ms-1`, `ms-2`// assuming shard `s-a`, owned by `ms-0` and `ms-2`"shards": {"s-a": {"removeRemotes": ["ms-2"] } } }ms-0is now the sole owner ofs-a.Entirely removing a shard from the list of shards
Set the shard to
null:// PATCH /network{"shards": {"s-a":null} }Or set its
remoteslist to the empty list:// PATCH /network{"shards": {"s-a": {"remotes": [] } } }network.shardsvalidityWhen
network.leaderis notnull, eachshardobject innetwork.shardsmust:- Only contain
remotesthat exist in the list ofremotes. - Contain at least one remote.
β Additionally,
network.shardsmust contain at least one shard.Failure to meet any of these conditions will cause the
PATCH /networkroute to respond with400 invalid_network_shards.π Change in sharding logic
Documents are now sharded according to the list of shards declared in the network rather than the list of remotes. All remotes owning a shard will process the documents that belong to this shard, allowing for replication.
Example of replication
π§ The following configuration defines 3 remotes
0,1and2, and 3 shardsA,B,C, such that each remote owns two shards, achieving replication (losing one remote does not lose any document).{"leader":"0","self":"0","remotes": {"0": {/\* .. \*/},"1": {/\* .. \*/},"2": {/\* .. \*/} },"shards": {"A": {"remotes": ["0","1"] },"B": {"remotes": ["1","2"] },"C": {"remotes": ["2","0"] } } }- π Full replication is supported by having all remotes own all the shards.
- π Unbalanced replication is supported by having some remotes own more shards than other remotes.
- π "Watcher" remotes are supported by having remotes that own no shards. Watcher remotes are not very useful in this release, and might be upgraded in a future release, so that they keep all documents without indexing them, allowing to "respawn" shards for other remotes.
useNetworktakesnetwork.shardsinto accountWhen
useNetwork: trueis passed to a search query, it is expanded to multiple queries such that each shard declared innetwork.shardsappears exactly once, associated with a remote that owns that shard.This ensures that there is no missing or duplicate documents in the results.
_shardfiltersWhen the
networkexperimental feature is enabled, then it becomes possible to filter documents depending on the shard they belong to.Given
s-aands-bthe names of two shards declared innetwork.shards, then:_shard = "s-a"in afilterparameter to the search or documents fetch will return the documents that belong tos-a._shard != "s-a"will return the documents that do not belong tos-a_shard IN ["s-a", "s-b"]will return the documents that belong tos-aor tos-b.
You can use these new filters in manual remote federated search to create a partitioning over all shards in the network.
Important
To avoid duplicate or missing documents in results, for manually crafted remote federated search requests, all shards should appear in exactly one query.
Tip
π Search requests built with
useNetwork: truealready build a correct partitioning over shards. They should be preferred to manually crafted remote federated search requests in replicated sharding scenarios.β‘οΈ Update instructions
β‘οΈ When updating your Meilisearch network using dumpless upgrade, please observe the following guidelines:
β‘οΈ 1. Do not call the
PATCH /networkroute until all remotes of the network are finished updating β‘οΈ 2. If using the search routes withuseNetwork: true, call them on un-updated remotes. Calling it on already updated remotes will cause un-updated remotes to fail the search as they don't know about the_shardfilters.π Β§ Remove
vectorStoreSettingexperimental featureπ The new HNSW vector store (hannoy) has been stabilized and is now the only supported vector store in Meilisearch.
β‘οΈ As a result, updating to v1.37.0 will migrate all remaining legacy vector store indexes (using arroy) to hannoy, and the
vectorStoreSettingexperimental feature is no longer available.By @Kerollmops in #6176
π Improve indexing performance for embeddings
π We removed a computationally expensive step from vector indexing.
π On a DB with 20M documents, this removes 300s per indexing batch of 1100s.
By @Kerollmops in #6175
π Β§ π Security
- β¬οΈ Bump mini-dashboard (local web interface) which
- now stores API key in RAM instead of in the
localStorage - bumps dependencies with po...
- now stores API key in RAM instead of in the
-
v1.36.0 Changes
February 23, 2026π Version v1.36.0 introduces an exciting update to the ranking rules to improve the engine's relevance. It's actually the first time we've made such a change since v1.0, and we're really happy about this improvement!
β¨ Enhancement
- Introduce the
attributeRankandwordPositioncriteria by @Kerollmops in #6154, #6155, and #6164
π πͺ² Bug fixes
π π Security
- β¬οΈ Bump bytes from 1.11.0 to 1.11.1 by @dependabot[bot] in #6142
- β¬οΈ Bump jsonwebtoken from 9.3.1 to 10.3.0 by @dependabot[bot] in #6141
- β¬οΈ Bump time from 0.3.44 to 0.3.47 by @dependabot[bot] in #6144
- β¬οΈ Bump rsa from 0.9.9 to 0.9.10 by @dependabot[bot] in #6149
π© Miscellaneous
β Warning
π₯ Breaking change: the
meilisearch-openapi-mintlify.jsonfile will not be available in the release assets anymore. If you were using it, please refer to the one that is now available in our public documentation repository.- GenAI contributing and PR template changes by @dureuill in #6140
- π Fix "test with almost all features" by @dureuill in #6139 and #6148
- π Allow any IP for SDK tests by @Strift in #6151
- π Improve output of the declarative tests, also in #6164
π β€οΈ Thanks to @zen-zap for contributing to this release!
- Introduce the
-
v1.35.1 Changes
February 16, 2026π π¦ Bug fixes
π Meilisearch v1.35.1 fixes a possible task database corruption issue that would occur when using the S3 streaming snapshot method.
- β¬οΈ Users of the Community Edition do not need to upgrade as this feature is Enterprise Edition only
- Affected users of the Cloud have been contacted.
Details
π While snapshotting the task database, sending a task to Meilisearch could corrupt it. Index DBs were not affected, so manually rebuilding the task database fixes the corruption.
Full Changelog : v1.35.0...v1.35.1
-
v1.35.0 Changes
February 02, 2026π Meilisearch v1.35.0 contains improvements to the observability of the search performance, a breaking change to the recently introduced
POST /indexes/<index_uid>/fieldsroute, and other bugfixes and improvements.π Improvements
π Observe the search performance
π The search routes accept a new field named
showPerformanceDetails. When set to ΓΉ true`, the search response contains a performance trace, allowing the user to better
understand what takes time during a search query.impacted routes:
POST /indexes/<index_uid>/searchGET /indexes/<index_uid>/searchPOST /multi-searchPOST /indexes/<index_uid>/similarGET /indexes/<index_uid>/similar
Search
routes:
POST /indexes/<index_uid>/searchandGET /indexes/<index_uid>/searchRequest
π new request parameters:
- π
showPerformanceDetails:true/false(boolean)
example
{"q":"glass","showPerformanceDetails":true}Response
π new response field:
- π
performanceDetails:{"<span>": "<human_duration>", .. }(map)
example
{"hits": [// hits ..],"query":"glass","processingTimeMs":5,"limit":20,"offset":0,"estimatedTotalHits":1,"requestUid":"\<uuid\>","performanceDetails": {"wait for permit":"295.29Β΅s","search \> tokenize":"436.67Β΅s","search \> resolve universe":"649.00Β΅s","search \> keyword search":"515.71Β΅s","search \> format":"288.54Β΅s","search":"3.56ms"} }Multi-search
route:
POST /multi-searchRequest
π new request parameters:
- π
queries.showPerformanceDetails:true/false(boolean)
example
"queries": [ {"indexUid":"\<index\_uid\>","q":"glass","showPerformanceDetails":true} ]Response
π new response field:
- π
results.performanceDetails:{"<span>": "<human_duration>", .. }(map)
example
{"results": [ {"indexUid":"\<index\_uid\>","hits": [// hits ..],"query":"glass","processingTimeMs":5,"limit":20,"offset":0,"estimatedTotalHits":1,"requestUid":"\<uuid\>","performanceDetails": {"wait for permit":"295.29Β΅s","search \> tokenize":"436.67Β΅s","search \> resolve universe":"649.00Β΅s","search \> keyword search":"515.71Β΅s","search \> format":"288.54Β΅s","search":"3.56ms"} } ] }Federated Search
route:
POST /multi-searchRequest
π new request parameters:
- π
federation.showPerformanceDetails:true/false(boolean)
example
{"federation": {"showPerformanceDetails":true},"queries": [ {"indexUid":"\<index\_uid\>","q":"glass"} ] }Response
π new response field:
- π
performanceDetails:{"<span>": "<human_duration>", .. }(map)
example
{"hits": [// hits ..],"query":"glass","processingTimeMs":5,"limit":20,"offset":0,"estimatedTotalHits":1,"requestUid":"\<uuid\>","performanceDetails": {"wait for permit":"213.83Β΅s","search \> tokenize":"171.67Β΅s","search \> resolve universe":"257.63Β΅s","search \> keyword search":"577.71Β΅s","search \> format":"114.96Β΅s","search \> federation \> wait for remote results":"62.71Β΅s","search \> federation \> merge results":"120.04Β΅s","search \> federation \> merge facets":"53.42Β΅s","search \> federation":"237.04Β΅s","search":"289.08ms"} }Similar
routes:
POST /indexes/<index_uid>/similarandGET /indexes/<index_uid>/similarRequest
π new request parameters:
- π
showPerformanceDetails:true/false(boolean)
example
{"id":143,"embedder":"manual","showPerformanceDetails":true}Response
π new response field:
- π
performanceDetails:{"<span>": "<human_duration>", .. }(map)
example
{"hits": [// hits ..],"id":"143","processingTimeMs":"[duration]","limit":20,"offset":0,"estimatedTotalHits":4,"performanceDetails": {"search \> format":"244.92Β΅s","search":"1.25ms"} }By @ManyTheFish in #6132
π Stabilize multithreaded post-processing of facets and prefixes
π Multithreaded post-processing of facets and prefixes speeds-up indexing on multi-core machines.
Before v1.35.0, it could be disabled with an experimental feature.
π Meilisearch v1.35.0 removes that experimental feature, resulting in the multithreaded post-processing being always enabled.
β¬οΈ Cloud users upgrading to v1.35.0 will benefit from the speed-up.
By @ManyTheFish in #6130
π π¦ Fixes
π₯ Breaking change: return pagination fields in
POST /indexes/<index_uid>/fieldsrouteβ Warning
π₯ Breaking change : The
POST /indexes/<index_uid>/fieldsroute now returns an object containing theresults,offset,limit, andtotalfields instead of returning an array of results. This change allows to know how many fields match a given filterExample: before/after
Before:
[// fields ..]After:
{"results": [// [fields ..]],"offset":0,"limit":20,"total":0}By @ManyTheFish in #6126
POST /indexes/<index_uid>/fields: Fix pattern filtering when a parent field was matching a child pattern:titlewas matching the patterntitle.to*.Example: before/after
For the following request:
{"filter": {"attributePatterns": ["title.en"] } }Before Response,
titlefield is returned:{"results": [ {"name":"title",//metadata...}, ],"offset":0,"limit":20,"total":1}After Response, nothing returned:
{"results": [],"offset":0,"limit":20,"total":0}By @ManyTheFish, also in #6126
π π Other fixes
- β¬οΈ Bump mini-dashboard version to fix display of image in local UI interface by @Strift in #6129
- π Fix mTLS compatibility with Go by @curquiza in #6133
π© Miscellaneous
- β Add AI usage disclosure guidelines to CONTRIBUTING.md by @meili-bot in #6114
- π¦ Expose SettingsDelta and related types for external crate usage by @MkDev11 in #6119
π New Contributors
Full Changelog : v1.34.3...v1.35.0
-
v1.34.3 Changes
January 28, 2026π π Bug Fixes
- Increase the auth store database size to 2 GiB so that we can index more keys by @Kerollmops in #6134
Full Changelog : v1.34.2...v1.34.3
-
v1.34.2 Changes
January 28, 2026π This patch fixes an accidental breaking change in v1.34.1 where Meilisearch would not start with a configuration file if
experimental_allowed_ip_networkswas not defined.- β‘οΈ Meilisearch Cloud users do not need to update as they were not affected by this regression
- β¬οΈ We recommend that OSS users upgrade to v1.34.2
Full Changelog : v1.34.1...v1.34.2