Meilisearch v1.54.0stable Released Sep 21, 2026
⚠️ Breaking Change Impact Score: 7/10

Meilisearch v1.54.0 — Release Notes & Engineering Impact

Source available — automated, not human-reviewed

Component: meilisearch · Channel: stable. Automated analysis, not a compatibility certification. How this works.

Analysis updated: 2026-11-01.

Breaking-change evidence from the source

  • 💥 Breaking Changes Meilisearch v1.54.0 makes breaking changes to the `dynamicSearchRules` experimental features.
  • Meilisearch v1.54.0 makes breaking changes to the `dynamicSearchRules` experimental features.
Read the original context ↗
Source flags breaking changes — review applicability
📄 .MD
⚡ Executive Summary (TL;DR)

Meilisearch v1.54.0. Source highlight: Meilisearch v1.54.0 makes breaking changes to the `dynamicSearchRules` experimental features.

Who Does This Impact? (Role-Based Analysis)

💻 Software Engineers & Devs

Check the source notes against the package and APIs you use before upgrading.

📊 Product & Engineering Leads

Use the documented changes to assess relevance to your product; release frequency alone is not a quality measure.

⚙️ DevOps & Security

Verify the target version, runtime requirements and rollback procedure in the official documentation.

⚠️ Breaking Changes & Deprecations (2)

  • 💥 Breaking Changes Meilisearch v1.54.0 makes breaking changes to the `dynamicSearchRules` experimental features.
  • Meilisearch v1.54.0 makes breaking changes to the `dynamicSearchRules` experimental features.

🔧 Bug Fixes & Patches (2)

  • Fix grammar and broken Markdown links in error code descriptions
  • Fix typo
📄 View Raw Release Notes (Original Developer Log)
# 💥 Breaking Changes Meilisearch v1.54.0 makes breaking changes to the `dynamicSearchRules` experimental features. - For Cloud users, rules will be migrated automatically, and the UI will adapt to the new API. Only the first change on rulelist might affect users that directly get rules through the API. - If upgrading with `--upgrade-db`, rules will be migrated automatically. 1. The `POST /dynamic-search-rules` endpoint now returns `actions` as an object with 2 fields instead of a list: 1. `pin` is an array of `Pin` objects with the following fields: 1. `id`, String, mandatory: document id of the document to pin 2. `position`: positive or zero number, mandatory: position where to pin the document 3. `indexUid`, optional, defaults to `null`, uid of the index that this action applies to. If `null` or missing, the action applies to any index containing a document with the provided `id`. 4. `scale` is an array of `Scale` objects with the following fields: 1. `weight`, positive or zero number, mandatory: scaling factor to multiply with the selected documents' innate relevancy score 2. `ids`, array of strings, optional: list of document ids whose document's relevancy score should be scaled by the provided weight 3. `filter`: Meilisearch filter without a foreign filter, optional: a filter on the index that is resolved to determine a list of selected documents 4. `indexUid`, optional, defaults to `null`, uid of the index that this action applies to. If `null` or missing, the action applies to any index. 2. The `PATCH /dynamic-search-rules/{:ruleUid}` endpoint now expects a rule with the modified `actions` field. See changes to `POST /dynamic-search-rules` for details. 3. The uid `__meilisearch_metadata` is now reserved and cannot be used as a `ruleUid` in `PATCH /dynamic-search-rules/{:ruleUid}` # 🌈 Enhancements ## Boost, demote and hide documents with search rules - A dynamic search rule can now boost, deboost or hide documents by defining a new "scale" action that selects some documents by filter and/or an explicit list of ids and exposes a scale factor as a `weight`: - If the weight is > 1.0, then the selected documents are boosted - If the weight is < 1.0, then the selected documents are deboosted (demoted) - If the weight is = 0.0, then the selected documents are hidden and don't appear in search results (unless if they are also pinned) - ⚠️ Because the factor is applied to the relevancy rules, it has little measurable effect when the first ranking rule is not a relevancy rule. - Score details for a pinned document now contains an additional `ruleUid` field indicating the name of the rule that resulted in the document being pinned. ⚠️ As a result, end-users can find out the uid of applied rules by looking at ranking score details. Please keep any sensitive information in the description of the rule instead ⚠️ - Score details for a scaled document now contains an additional `scale` field, with order `0`. The scale field is an object with the following fields: - `order`: order of application of the rule. Always 0 - `actions`: an array of `ScaleAction`s, where each `ScaleAction` contains the following fields: - `ruleUid`: the name of the rule that was applied - `weight` the weight of the rule that was applied - `totalWeight`: the total multiplicative factor computed as the product of the individual `.actions[].weight`. - New environment variables controlling how much scale operations can occur: - `MEILI_EXPERIMENTAL_DSR_FUEL_MAX_SCALE_ACTIONS`: maximum number of applicable (at least one selected document) scale actions in a single search. Range 1-255, default 10 - `MEILI_EXPERIMENTAL_DSR_FUEL_SCALE_FUEL`: maximum number of combinations of scale constraint that are evaluated in a single search. Range 1-255, default 10. ### Examples <details><summary>Boosting "Batman" product for a festival</summary> 1. Creating the search rule ```jsonc // PATCH /dynamic-search-rule/batman-festival { "conditions": { "time": { "start": "2026-09-21T19:00:00Z", "end": "2026-09-28T18:59:00Z" }, }, "actions": { "scale": [ { "filter": "series = batman", "weight": 4.0 } ] } } ``` 2. Once the DSR update task has been processed and the festival begins on September 21st, make a search query: ```jsonc { "q": "superhero returns prequel", "showRankingScoreDetails": true } ``` 3. Observe the ranking of documents ```jsonc "hits": [ { "id": "batman-returns", "title": "Batman Returns", "series": "batman", "_rankingScore": 0.30808080808080807, "_rankingScoreDetails": { "scale": { "order": 0, "actions": [ { "ruleUid": "batman-festival", "weight": 4.0 } ], "totalWeight": 4.0 }, "words": { "order": 1, "matchingWords": 1, "maxMatchingWords": 3, "score": 0.3333333333333333 }, "typo": { "order": 2, "typoCount": 0, "maxTypoCount": 1, "score": 1.0 }, "proximity": { "order": 3, "score": 1.0 }, "attributeRank": { "order": 4, "score": 1.0 }, "wordPosition": { "order": 5, "score": 0.9090909090909092 }, "exactness": { "order": 6, "matchType": "noExactMatch", "matchingWords": 1, "maxMatchingWords": 1, "score": 0.3333333333333333 } } }, { "id": "superman-returns", "series": "superman", "title": "Superman Returns - The Prequels", "_rankingScore": 0.9628456221198156, "_rankingScoreDetails": { "words": { "order": 0, "matchingWords": 3, "maxMatchingWords": 3, "score": 1.0 }, "typo": { "order": 1, "typoCount": 0, "maxTypoCount": 3, "score": 1.0 }, "proximity": { "order": 2, "score": 0.5714285714285714 }, "attributeRank": { "order": 3, "score": 1.0 }, "wordPosition": { "order": 4, "score": 0.9032258064516128 }, "exactness": { "order": 5, "matchType": "noExactMatch", "matchingWords": 2, "maxMatchingWords": 3, "score": 0.25 } } }, // ... ], "processingTimeMs": "[duration]", "limit": 20, "offset": 0, "estimatedTotalHits": 42, "requestUid": "[uuid]" } ``` </details> <details> <summary>Demoting out-of-stock products</summary> ```jsonc // PATCH /dynamic-search-rules/out-of-stock { "actions": { "scale": [ { "filter": "availability = \"out of stock\"", "weight": 0.5 } ] } } ``` </details> <details> <summary>Hiding discontinued products</summary> ```jsonc // PATCH /dynamic-search-rules/discontinued { "actions": { "scale": [ { "filter": "availability = discontinued", "weight": 0.0 } ] } } ``` </details> By @dureuill in https://github.com/meilisearch/meilisearch/pull/6549 ## MCP endpoint We introduce a new MCP protocol on the /mcp path. It implements [the HTTP+SSE Transport version of the protocol](https://modelcontextprotocol.io/specification/2024-11-05/basic/transports#http-with-sse). You can register the Meilisearch MCP in your favorite LLM, e.g., Claude Code, Codex. Note that the MCP route is using bearer authentication and doesn't support OAuth authentication. Enable the `mcpRoute` experimental feature to use the feature. by @Kerollmops in https://github.com/meilisearch/meilisearch/pull/6629 ## Improve search performance details in multi-search The performance details in a federated search now separate the timing per query <details> <summary>Example</summary> ```json "performanceDetails": { "wait in queue": "1.36ms", "preprocess filters > prepare": "985.00µs", "preprocess filters > send to remote": "220.00µs", "preprocess filters > execute local > evaluate filter": "139.00µs", "preprocess filters > execute local": "1.61ms", "preprocess filters > wait for remote": "35.97ms", "preprocess filters": "39.01ms", "process > prepare": "96.00µs", "process > send to remote": "118.00µs", "process > execute local > load field ids map": "63.00µs", "process > execute local > query[0] > evaluate filter": "84.00µs", "process > execute local > query[0] > tokenize query": "163.00µs", "process > execute local > query[0] > evaluate query": "116.00µs", "process > execute local > query[0] > keyword ranking": "634.00µs", "process > execute local > query[0]": "1.52ms", "process > execute local > pin hits": "29.00µs", "process > execute local > format": "36.00µs", "process > execute local": "2.90ms", "process > wait for remote": "37.24ms", "process > merge": "82.00µs", "process": "40.45ms", "hydrate > send to remote": "38.00µs", "hydrate > execute local": "35.00µs", "hydrate > wait for remote": "41.00µs", "hydrate": "295.00µs", "merge facets": "51.00µs" } ``` </details> By @ManyTheFish in https://github.com/meilisearch/meilisearch/pull/6631 # 🔩 Miscellaneous - Remove `HashMap` transmute in indexer by @dureuill in https://github.com/meilisearch/meilisearch/pull/6622 - Bump `lru` to 0.18.4 by @Kerollmops in https://github.com/meilisearch/meilisearch/pull/6633 - Simplify Rust install and update Rust to v1.98.1 by @dureuill in https://github.com/meilisearch/meilisearch/pull/6601 - Bump most dependencies by @Kerollmops in https://github.com/meilisearch/meilisearch/pull/6589 - Bump `actions/setup-go` from 6.5.0 to 7.0.0 by @dependabot[bot] in https://github.com/meilisearch/meilisearch/pull/6611 - Fix grammar and broken Markdown links in error code descriptions by @curquiza in https://github.com/meilisearch/meilisearch/pull/6626 - Fix typo by @simpleqt in https://github.com/meilisearch/meilisearch/pull/6619 ## New Contributors * @simpleqt made their first contribution in https://github.com/meilisearch/meilisearch/pull/6619 **Full Changelog**: https://github.com/meilisearch/meilisearch/compare/v1.53.2...v1.54.0