meilisearch/MeiliSearch
 Watch   
 Star   
 Fork   
1 days ago
MeiliSearch

v1.30.0 🐸

🌈 Improvements

Up and down network scaling

Since v1.19.0, Meilisearch Enterprise Edition allows the automatic sharding of documents over multiple Meilisearch instances, enabling scaling to more documents than a single instance would accommodate.

Meilisearch v1.30.0 adds the ability to modify the number of participants in sharding, without having to start over sending documents to a new cluster containing the number of desired machines.

To make this possible, Meilisearch v1.30.0 introduces breaking changes. These breaking changes only affect the users of the experimental network feature who enabled automatic sharding (network.sharding = true). Users of the stable features are not affected.

Usage

Setting up the initial network
  1. Pick a leader machine that will receive all tasks. Calling a route that creates a dcument, settings or network-related task on a machine that is not the leader will now return an error.
  2. Send your network topology to the leader by calling PATCH /network:
// PATCH /network
{
  "self": "ms0",
  "leader": "ms0", // must be equal to `self`
  "remotes": {
    "ms0": {
      "url": "URL_OF_MS0",
      "searchApiKey": "SEARCH_API_KEY_OF_MS0",
      "writeApiKey": "WRITE_API_KEY_OF_MS0",
    },
    "ms1": {
      "url": "URL_OF_MS1",
      "searchApiKey": "SEARCH_API_KEY_OF_MS1",
      "writeApiKey": "WRITE_API_KEY_OF_MS1",
    }
  }
}
  1. The network is automatically propagated to other members of the network.
  2. Send settings and documents as usual, but exclusively to the leader. They will be propagated to all participants in the network, and each participant will process a piece of the documents.
Upgrading from v1.29 or earlier
  1. We recommend using the experimental dumpless upgrade feature to go from Meilisearch v1.13+ to Meilisearch v1.29.
  2. When using the experimental dumpless upgrade and the Meilisearch instance already has a network instance with sharding set to true, then the network object will be modified so that the leader is the first remote in alphabetic order. For instance, if you network contains remotes: A, B, C, the leader will be set to A.
Adding a new remote
  1. Call PATCH /network on the leader with the information about the new remote:
{
  "remotes": {
  // add information about the new remote
  "ms2": {
      "url": "URL_OF_MS2",
      "searchApiKey": "SEARCH_API_KEY_OF_MS2",
      "writeApiKey": "WRITE_API_KEY_OF_MS2",
    }
  // information about existing remotes does not need to be repeated
}
  1. The new network will be propagated from the leader to all remotes (including the new remote ms2).
  2. All remotes will register a new networkTopologyChange task that will "rebalance" the documents between the existing remotes and the new remote, that is, ms0 and ms1 will send parts of their documents to ms2
Removing a remote
  1. Call PATCH /network on the leader by setting any removed remote to null:
{
  "remotes": {
  // set removed remote to null
  "ms2": null
  // information about existing remotes does not need to be repeated
}
  1. The new network will be propagated from the leader to all remotes (including to the old remote ms2 that will then no longer participate in the network).
  2. All remotes will register a new networkTopologyChange task that will "rebalance" the documents between the remaining remotes, that is, ms2 will send its documents between ms0 and ms1

List of changes

List of changes, some of which are breaking
  1. Breaking change: The Network object returned or edited by the /network route is modified in the following way:
    • the sharding boolean is removed
    • a leader field is added as an optional string. When it is not null, it has the same effect (and more) than having sharding: true in the previous iteration of the Network object. The leader is used as a check when receiving task creation requests.
    • a version field is added as a UUID, defaulting to the null UUID. The version is used when processing tasks.
  2. Breaking change: When a network.leader is set, calling one of the following routes will fail with not_a_leader error if the target's network.self is not the same as its network.leader:
    • POST /indexes
    • PATCH/DELETE /indexes/{:indexUid}
    • POST/PUT/DELETE /indexes/{:indexUid}/documents
    • POST /indexes/{:indexUid}/documents/delete
    • POST /indexes/{:indexUid}/documents/delete-batch
    • POST /indexes/{:indexUid}/documents/edit
    • PATCH/DELETE /indexes/{:indexUid}/settings and settings sub-routes
    • PATCH /network if the target is the new leader
    • POST /swap-indexes
  3. Breaking change: when a leader is set, PATCH /network no longer returns a Network object. Rather, it spawns a new NetworkTopologyChange task, and returns the summarized task view.
  4. Breaking change: Tasks are duplicated by the leader to the entire network when calling the following routes:
    • POST /indexes (new to this PR)
    • PATCH/DELETE /indexes/{:indexUid} (new to this PR)
    • POST/PUT/DELETE /indexes/{:indexUid}/documents (was already the case before this PR)
    • POST /indexes/{:indexUid}/documents/delete (was already the case before this PR)
    • POST /indexes/{:indexUid}/documents/delete-batch (was already the case before this PR)
    • POST /indexes/{:indexUid}/documents/edit (was already the case before this PR)
    • PATCH/DELETE /indexes/{:indexUid}/settings and settings sub-routes (new to this PR)
    • PATCH /network if the target is the new leader (new to this PR)
    • POST /swap-indexes (new to this PR)
  5. New NetworkTopologyChange tasks that perform the following:
    1. Execute any remaining task to process with a network.version lower than the network task's version
    2. Iterate over all documents in all indexes, determine their new shard, and send the document to the remote that must now have it in the new version , deleting it from the local DB
      • The export route code has been factored and specialized to allow this
      • Should the export to a remote fail, the corresponding documents are kept locally
      • If there are no documents to send for an index, still call the documents addition with an empty payload and appropriate headers containing the expected metadata
      • If there are no documents to send for an entire remote, call the network route with specific headers containing the expected metadata
    3. Wait for and process tasks from the remotes of the previous version of the network.
  6. Breaking change: When importing dumps, we drop the self and leader from the network
  7. Network topology change tasks can be cancelled. In this case the state will be the current one (any moved documents will stay that way). Cancellation needs to happen on all machines.

by @dureuill in https://github.com/meilisearch/meilisearch/pull/6000

🛠️ Maintenance

Asset availability note

🌈 The Meilisearch binary is available again for meilisearch-enterprise-macos-amd64 and meilisearch-macos-amd64. It was not available for Meilisearch v1.29.

Full Changelog: https://github.com/meilisearch/meilisearch/compare/v1.29.0...v1.30.0

8 days ago
MeiliSearch

v1.29.0 🐑

Build compatibility note

The git binary must now be present at build time to populate the commitSha1 field of the /version field.

This change was made for build performance reasons.

by @dureuill in https://github.com/meilisearch/meilisearch/pull/6030

🌈 Improvements

Another piece of the settings indexer is available: searchable and exact attributes

The new settings indexer scales better, supports near-instant cancellations and displays the progress of the indexing operation.

Previously, the new settings indexer was enabled only if the only changes in a settings batch were to embedder settings. In Meilisearch v1.29.0, the new settings indexer will be enabled if the change is any combination of:

  • searchableAttributes
  • exactAttributes
  • proximityPrecision
  • embedders (as before)

Any other change to settings appearing in a batch will cause the batch to use the legacy settings indexer. Additionally, the new settings indexer is currently disabled by default for Cloud users.

OSS users who would like to disable the new settings indexer should pass the MEILI_EXPERIMENTAL_NO_EDITION_2024_FOR_SETTINGS environment variable to true.

by @Kerollmops in https://github.com/meilisearch/meilisearch/pull/5983

Enable the new vector store by default for new indexes

Meilisearch v1.21.0 introduced a new vector store backend providing better performance and relevancy.

Starting with v1.29.0, any newly created index will default to the new backend. Existing indexes will be left unchanged.

It is still possible to explicitly choose the vector store backend, please refer to the relevant experimental feature discussion page.

by @Kerollmops in https://github.com/meilisearch/meilisearch/pull/6004

Support more models for huggingFace embedder

You can now select models with the XLM Roberta architecture when generating embeddings locally on CPU or GPU with the huggingFace embedder.

by @qdequele in https://github.com/meilisearch/meilisearch/pull/6018

🦋 Bug fixes

🔧 Maintenance and Misc.

Last week was a Quality of Life week, and while we still had improvements in the pipe, the bulk of our work was dedicated to maintenance tasks.

Most notably, the CI is now faster, going from over one hour to less than 30 minutes, and also more reliable as it automatically tests the dumpless upgrade.

Full Changelog: https://github.com/meilisearch/meilisearch/compare/v1.28.2...v1.29.0

13 days ago
MeiliSearch

v1.28.2 🐩

This release fixes a bug affecting the Prometheus metrics route in versions 1.28.0 and 1.28.1, specifically when the instance has too many tasks. The issue is visible as high memory usage and could cause the instance to be OOM-killed. If you are using the /metrics route, we recommend deleting all succeeded or failed functions in the index using the dedicated route or upgrading to at least v1.28.2.

🐛 Bug fixes

Full Changelog: https://github.com/meilisearch/meilisearch/compare/v1.28.1...v1.28.2

15 days ago
MeiliSearch

v1.28.1 🐩

This release features two fixes: one to ensure that we correctly upload the Linux-amd64 binaries for the Community and Enterprise editions, and one contributed by an external developer to ensure that we still return documents that don't contain the sortable attribute after those that do.

🐛 Bug Fixes

🫂 New Contributors

Full Changelog: https://github.com/meilisearch/meilisearch/compare/v1.28.0...v1.28.1

15 days ago
MeiliSearch

v1.28.0 🐩

This release introduces improvements to language support and separates the community and enterprise binary editions. We now offer binaries under the BUSL-1.1 license, identified by the "enterprise" term in their names, in addition to our MIT-licensed binaries, which retain their original names. Docker images for the enterprise edition are available in the getmeili/meilisearch-enterprise repository.

📝 Licensing

  • Separation of EE and CE. CE remains the default binary, and the name does not change by Louis on #6011

✨ Enhancement

  • Charabia v0.9.9: introduce a better word segmentation for Thai, Khmer, and German languages by @ManyTheFish in #6007
  • Expose batch progress traces on the metrics route to improve the indexing debugging experience by @Kerollmops in #5956

🔩 Miscellaneous

  • Remove version from the name of the test job in CI by @paulden in #6012
  • Upgrade most of the dependencies by @Kerollmops in #6002
  • Build x86 and ARM images on GitHub-hosted runners by @paulden in #6003
  • Fix SDKs tests to use the enterprise edition and continue testing the sharding feature by @curquiza in #6013

🫂 New Contributors

  • @paulden made their first contribution in #6003

Full Changelog: https://github.com/meilisearch/meilisearch/compare/v1.27.0...v1.28.0

22 days ago
MeiliSearch

v1.27.0 🦮

This release improves the batch size for better performance. It also fixes bugs with the embedders that could skip some documents during generation and resolves an issue with the document route that displayed the same documents on multiple pages. It improves the quality of error messages when uploading snapshots to S3, which helps with debugging.

⚙️ Compatibility support

✨ Enhancement

🪲 Bug fixes

  • Fix issue that could cause Meilisearch to skip some documents when performing embedding operations by @dureuill in https://github.com/meilisearch/meilisearch/pull/5995
    • Every available_parallelismth document in a batch was ignored for the purpose of embedding when using a Hugging Face embedder https://github.com/meilisearch/meilisearch/issues/5976
    • Every 40th document in a batch was ignored for the purpose of embedding when using a REST embedder with only one embedding per request
    • To verify if documents in your database have been affected:
      1. enable the multimodal exp. feature
      2. search or fetch with filter: NOT _vectors EXISTS to find documents without vectors.
  • Fix /documents/fetch bug that could cause duplicated search results when paginating sorted documents by @ManyTheFish in https://github.com/meilisearch/meilisearch/pull/5999

Full Changelog: https://github.com/meilisearch/meilisearch/compare/v1.26.0...v1.27.0

2025-11-15 18:03:15
MeiliSearch

v1.26.0

✨ Enhancements

Allow to attach custom metadata in the document addition or update tasks

  • To make it easier to keep track of which documents were processed by Meilisearch, it is now possible to attach an arbitrary string to all routes that create document-related tasks.
  • Tasks created with this custom metadata will display the passed metadata when accessed by the tasks route or sent in webhooks.
  • To use this feature, add the customMetadata query parameter to any supported route:
POST /indexes/{indexUid}/documents?customMetadata=my-metadata-for-the-task
  • Note that, as usual for query parameters, the value of the parameter must be URL-encoded.
  • List of supported routes:
POST /indexes/{indexUid}/documents
PUT /indexes/{indexUid}/documents
DELETE /indexes/{indexUid}/documents/{documentId}
POST /indexes/{indexUid}/documents/delete-batch
POST /indexes/{indexUid}/documents/delete
POST /indexes/{indexUid}/documents/edit
DELETE /indexes/{indexUid}/documents
  • Sample output of GET /tasks for tasks with metadata:
{
  "results": [
    {
      "uid": 37,
      "batchUid": 37,
      "indexUid": "mieli",
      "status": "succeeded",
      "type": "documentDeletion",
      "canceledBy": null,
      "details": {
        "deletedDocuments": 31944
      },
      "error": null,
      "duration": "PT0.511099S",
      "enqueuedAt": "2025-11-06T16:33:37.816237Z",
      "startedAt": "2025-11-06T16:33:37.821591Z",
      "finishedAt": "2025-11-06T16:33:38.33269Z",
      "customMetadata": "removeall"
    },
    {
      "uid": 36,
      "batchUid": 36,
      "indexUid": "movies",
      "status": "succeeded",
      "type": "documentAdditionOrUpdate",
      "canceledBy": null,
      "details": {
        "receivedDocuments": 31968,
        "indexedDocuments": 31944
      },
      "error": null,
      "duration": "PT3.192271S",
      "enqueuedAt": "2025-10-30T10:31:12.896073Z",
      "startedAt": "2025-10-30T10:31:12.911905Z",
      "finishedAt": "2025-10-30T10:31:16.104176Z",
      "customMetadata": "foo"
    }
  ],
  "total": 38,
  "limit": 2,
  "from": 36,
  "next": 35
}

by @dureuill in https://github.com/meilisearch/meilisearch/pull/5963

Support more models for huggingFace embedder

You can now select models with the modernBERT architecture when generating embeddings locally on CPU or GPU with the huggingFace embedder.

This unlocks for instance Ruri v3 and other models

by @hayatosc in https://github.com/meilisearch/meilisearch/pull/5980

🧪 Experimental: embedder failure modes

You can now decide to ignore some embedder-related errors. Either:

  1. Errors related to a document template not rendering properly
  2. Errors related to an embedding request to an embedder failing (this includes missing vectors in userProvided embedders)
  3. Or both kinds of errors.

When errors are ignored, the corresponding documents will not have embeddings, but the associated batch of tasks will not be marked as failed.

Of course, ignoring errors means that it is harder to notice an issue with embedders, so use this feature parsimoniously.

To enable the feature:

  • Customers of the Cloud, please ask the support.
  • OSS users, please use the MEILI_EXPERIMENTAL_CONFIG_EMBEDDER_FAILURE_MODES and set it to a comma-separated list of errors to ignore, with the possible values:
    1. ignore_document_template_failures to ignore document template failures
    2. ignore_embedder_failures to ignore embedder failures
    • For example: ignore_document_template_failures,ignore_embedder_failures ignores both kinds of failures

by @dureuill in https://github.com/meilisearch/meilisearch/pull/5984

🧪 Experimental: timeout control for REST embedders

You can now control the duration before a REST embedder request times out.

  • Customers of the Cloud, please ask the support.
  • OSS users, please use the MEILI_EXPERIMENTAL_REST_EMBEDDER_TIMEOUT_SECONDS, which must be a positive integer.

by @dureuill in https://github.com/meilisearch/meilisearch/pull/5984

🔩 Misc

👥 Contributors

Many thanks to our new contributors @hayatosc and @xuhongxu96 ❤️

2025-11-10 22:04:17
MeiliSearch

v1.25.0 🐈‍⬛

✨ Enhancement

🔬 [Experimental]: Search personalization by @ManyTheFish in #5775

Add the ability to dynamically rerank the search results based on Cohere using a personalized prompt. For more information on how to set it up, see the dedicated experimental feature discussion.

🔬 [Experimental]: Upload snapshot tarballs to S3 by @Kerollmops in #5948

Add the ability to upload snapshots directly to S3. It has many advantages, such as being able to stream the entire process and effectively utilizing multipart technology to send chunks of data in parallel. For more information on how to use it, see the dedicated experimental feature discussion.

🪲 Bug fixes

⚠️ [Breaking - Security] Redact Authorization header in webhooks by @dureuill in #5968

The value of the Authorization header is now redacted when getting webhook, getting webhooks, or in the object returned when posting a new webhook or deleting a webhook.

  • Impact on Cloud: Similarly to embedder API, the UI should make sure to never send the Authorization header back after it has been redacted
  • Technically a breaking change, as users could previously get the key value back when getting the webhook, and that will no longer be possible

🚰 Fix the LMDB fork memory leak by @Kerollmops in #5967

This bug was causing crashes in the recent indexer optimizations. If you deactivated these optimizations by setting the following environment variables:

MEILI_EXPERIMENTAL_NO_EDITION_2024_FOR_PREFIX_POST_PROCESSING=true
MEILI_EXPERIMENTAL_NO_EDITION_2024_FOR_FACET_POST_PROCESSING=true

You can now safely reactivate them without experiencing memory leaks.

🇩🇪 Hotfix German word segmentation by @ManyTheFish in https://github.com/meilisearch/charabia/pull/360

German word segmentation relies on a word dictionary to segment words, but if a word is not part of the dictionary, it is cut into bigrams. The segmenter will now skip segmenting unknown words:

Source: "Feuchteschutz"
Before: ["Fe" "uc" "ht" "es, "ch", "utz"]
After:  ["Feuchteschutz"]

Source: "insgesamt"
Before: ["in" "sg" "es" "amt"]
After:  ["insgesamt"]

If you have a Meilisearch database containing German words, you must reindex your data manually.

🇨🇳 Prevent splitting of numbers and English words in Chinese text segmentation by @JinheLin in https://github.com/meilisearch/charabia/pull/354

It’s very common for Chinese, numbers, and English to appear together in the same sentence. We now ensure that numbers and English are not segmented differently between segmenters:

Source: "我从2025年开始学习Rust语言。"
Before: ["我", "从", "2", "0", "2", "5", "年", "开始", "学习", "R", "u", "s", "t", "语言", "。"]
After:  ["我", "从", "2025", "年", "开始", "学习", "Rust", "语言", "。"]

If you have a Meilisearch database containing Chinese words, you must reindex your data manually.

🔩 Miscellaneous

Thanks to @JinheLin, @dureuill, @Kerollmops, and @ManyTheFish for their contribution! 🎉

2025-10-20 19:17:15
MeiliSearch

v1.24.0 🦞

This release features some improvements with the interaction of the vector store and the searchCutoffMs when using the vectorStore: experimental. It also introduces the metadata header Meili-Include-Metadata on the search request that adds a metadata field to the response. These metadatas contains one uid by query and a reminder of the indexUid and its primary key. We also introduced minor bug fixes around the compaction to improve the interaction with task cancellation.

✨ Enhancement

🔩 Miscellaneous

👥 New Contributors

Full Changelog: https://github.com/meilisearch/meilisearch/compare/v1.23.0...v1.24.0

2025-10-13 20:50:52
MeiliSearch

v1.23.0 🐘

This release introduces a new compact route on the index routes, which appends a new compaction task to the queue. Meilisearch uses an LMDB environment by index, and indexes start to fragment after some time. We have noticed that the indexes generally have 30% fragmentation. By defragmenting the environment, we've seen large (2-4x) speed-ups in terms of search and indexation. This is primarily due to the reordering of the LMDB internal pages and the removal of scattered free pages throughout the file, thereby relocating the content to the beginning.

We also worked on parallelizing the post-processing of facets. We noticed that a lot of time was spent iterating over the prefixes of the index in a single-threaded loop. We redesigned this part of the indexation to make it multi-threaded. We have seen a 4x and 6x improvement in terms of time spent on this operation.

✨ Improvements

🦋 Bug Fixes

🔩 Miscellenaous

New Contributors

Full Changelog: https://github.com/meilisearch/meilisearch/compare/v1.22.1...v1.23.0