v1.44.0: Remote federated facet search, indexing performance improvements
Meilisearch v1.44.0 adds remote federated facet search for sharded networks, improves indexing memory usage and GeoJSON performance, and introduces new stats query parameters for human-readable database sizes. Includes breaking changes to facet search defaults and embedder timeout behavior when using the network experimental feature.
Meilisearch v1.44.0 adds remote federated facet search, indexing performance improvements, and other improvements and bugfixes. It also contains a couple of breaking changes, detailed below.
Breaking changes- When using the
networkexperimental feature, with sharding enabled (leaderis notnullin the network configuration),POST /indexes/{indexUid}/facet-searchcalls now default to a remote federated facet search, fetching and merging results from all shards in the network. - The timeout for calling an external REST embedder at search time is now tied to the
searchCutOffMsdefined in the index, rather than fixed.
Remote facet search
Meilisearch now has the ability to search across all shards of a network during facet search via the existing dedicated facet search route.
- If you are using the
networkexperimental feature and have aleaderdefined for your network, remote calls are now the default for calls toPOST /indexes/{indexUid}/facet-search - The behavior can be controlled explicitly via the new
useNetworkparameter of the facet search object.
Reduce memory usage of the indexing
Reduces allocated memory when computing prefixes and speeds up some operations to avoid unnecessary deserialization.
If you still see high memory usage while the engine is post-processing, we recommend using the --experimental-reduce-indexing-memory-usage option.
By @Kerollmops in #6334
Improve GeoJSON indexing performance
This PR upgrades the cellulite library to a version that includes a GeoJSON indexing optimization. With this change, GeoJSON indexing avoids reprocessing documents that were already indexed in dense cells, and only handles newly added documents incrementally as they descend through the recursive cell tree.
Human-formatted sizes and detailed DB sizes in stats
Adds two new query parameters to GET /indexes/{indexUid}/stats and GET /stats:
showInternalDatabaseSizes: boolean, optional, defaults tofalse. When present, the index stat objects in responses of the stat routes now contain an additionalinternalDatabaseSizeskey, whose value is a dictionary of the internal database names and their current size in the index, like in the stats object of a batch.sizeFormat:humanorraw: optional, defaults toraw. When present and set tohuman, then all database sizes in responses of the stat routes will be returned as a string containing an appropriate unit (MiB, GiB, etc). When missing or set toraw, then the current behavior of expressing the size in bytes as a number is retained.
Note for integrations: The keys in internalDatabaseSizes are subject to change and should not be exposed as a strongly typed object. This is the same as the existing internalDatabaseSizes in batch stats.
Adding showInternalDatabaseSizes to an index stats
// curl -X GET "http://localhost:7700/indexes/movies/stats?showInternalDatabaseSizes=true" { "numberOfDocuments": 31944, "rawDocumentDbSize": 20594688, "avgDocumentSize": 636, "isIndexing": false, "internalDatabaseSizes": { "wordPairProximityDocids": 100827136, "documents": 20594688, "wordPositionDocids": 18694144, "wordFidDocids": 10715136, "wordPrefixPositionDocids": 10256384, "wordDocids": 9453568, "wordPrefixFidDocids": 4603904, "wordPrefixDocids": 3424256, "main": 1425408, "externalDocumentsIds": 999424, "fieldIdWordCountDocids": 245760, "exactWordPrefixDocids": 16384, "celluliteMetadata": 16384 }, "numberOfEmbeddings": 0, "numberOfEmbeddedDocuments": 0, "fieldDistribution": { "genres": 31944, "id": 31944, "overview": 31944, "poster": 31944, "release_date": 31944, "title": 31944 } }
Adding showInternalDatabaseSizes and sizeFormat=human to global stats
// curl -X GET "http://localhost:7700/stats?showInternalDatabaseSizes=true&sizeFormat=human" { "databaseSize": "351.38 MiB", "usedDatabaseSize": "350.64 MiB", "lastUpdate": "2026-04-16T13:07:02.74243Z", "indexes": { "comics": { "numberOfDocuments": 31944, "rawDocumentDbSize": "23.14 MiB", "avgDocumentSize": "751 B", "isIndexing": false, "internalDatabaseSizes": { "wordPairProximityDocids": "98.06 MiB", "documents": "23.14 MiB", "wordPositionDocids": "17.22 MiB", "wordFidDocids": "10.36 MiB", "wordPrefixPositionDocids": "9.47 MiB", "wordDocids": "8.97 MiB", "wordPrefixFidDocids": "4.36 MiB", "wordPrefixDocids": "3.27 MiB", "main": "1.36 MiB", "externalDocumentsIds": "944 KiB", "fieldIdWordCountDocids": "240 KiB", "exactWordPrefixDocids": "16 KiB", "celluliteMetadata": "16 KiB" }, "numberOfEmbeddings": 0, "numberOfEmbeddedDocuments": 0, "fieldDistribution": { "genres": 31944, "id": 31944, "overview": 31944, "poster": 31944, "release_date": 31944, "title": 31944 } }, "movies": { "numberOfDocuments": 31944, "rawDocumentDbSize": "19.64 MiB", "avgDocumentSize": "636 B", "isIndexing": false, "internalDatabaseSizes": { "wordPairProximityDocids": "96.16 MiB", "documents": "19.64 MiB", "wordPositionDocids": "17.83 MiB", "wordFidDocids": "10.22 MiB", "wordPrefixPositionDocids": "9.78 MiB", "wordDocids": "9.02 MiB", "wordPrefixFidDocids": "4.39 MiB", "wordPrefixDocids": "3.27 MiB", "main": "1.36 MiB", "externalDocumentsIds": "976 KiB", "fieldIdWordCountDocids": "240 KiB", "exactWordPrefixDocids": "16 KiB", "celluliteMetadata": "16 KiB" }, "numberOfEmbeddings": 0, "numberOfEmbeddedDocuments": 0, "fieldDistribution": { "genres": 31944, "id": 31944, "overview": 31944, "poster": 31944, "release_date": 31944, "title": 31944 } } } }
The call without any parameters is the same as in previous versions.
// curl -X GET "http://localhost:7700/stats" { "databaseSize": 368443392, "usedDatabaseSize": 367673344, "lastUpdate": "2026-04-16T13:07:02.74243Z", "indexes": { "comics": { "numberOfDocuments": 31944, "rawDocumentDbSize": 24264704, "avgDocumentSize": 751, "isIndexing": false, "numberOfEmbeddings": 0, "numberOfEmbeddedDocuments": 0, "fieldDistribution": { "genres": 31944, "id": 31944, "overview": 31944, "poster": 31944, "release_date": 31944, "title": 31944 } }, "movies": { "numberOfDocuments": 31944, "rawDocumentDbSize": 20594688, "avgDocumentSize": 636, "isIndexing": false, "numberOfEmbeddings": 0, "numberOfEmbeddedDocuments": 0, "fieldDistribution": { "genres": 31944, "id": 31944, "overview": 31944, "poster": 31944, "release_date": 31944, "title": 31944 } } } }š¦ Fixes
- Settings changes performed via a settings subroute (not the "all settings" route) are now correctly propagated to other remotes on the network. By @dureuill in #6380
- The chat route no longer fails in some condition when using Mistral as a provider. By @renezander030 in #6327
- Prevent accidentally renaming a remote when modifying the network configuration. By @dureuill in #6370
- Replace boolean by PatternMatch for searchable by @ManyTheFish in #6344
- Add query to federated search metadata by @StephaneRob in #6371
- Remove issue template for feature issues by @curquiza in #6372
- Improve the documentation of the health route by @Kerollmops in #6376
New Contributors
- @renezander030 made their first contribution in #6327
- @quyentonndbs made their first contribution in #6382
Full Changelog: v1.43.1...v1.44.0
Source: original entry ā