v1.55.0 🔭
Apply an inline-specified dynamic search rule to a search query.
Search query objects in the following endpoints now have an additional, optional inlineRule parameter.
When present and not null, then Meilisearch will check if query satisfies the conditions of the dynamic search rule specified in inlineRule, and if so will apply the actions of the rule as if it had been sent to the PATCH /dynamicSearchRule/{:uid} endpoint.
Additionally, if the Meili-Include-Metadata header is present in the request with the value true, then the metadata in the response will contain information about whether the conditions of the inline rule were satisfied and if not why.
Meilisearch Cloud will use this backend feature to implement a preview UI for dynamic search rules.
Using inlineRule requires Meilisearch Enterprise Edition and the dynamicSearchRules experimental feature.
By @dureuill in https://github.com/meilisearch/meilisearch/pull/6669
- There is a new
InlineRuleobject with the following field:uid, string, mandatory: unique ID of the rule. If there is already a rule with this id, then the inline rule will replace the existing rule for the duration of this search query.active, boolean, optional, defaults totrue: whether the rule is active. The actions of an inactive inline rule never apply to the search, but its conditions are still checkedconditions:RuleConditionsobject, identical to theconditionsfield in the body ofPATCH /dynamic-search-rules/{:uid}actions:RuleActionsobject, identical to theactionsfield in the body ofPATCH /dynamic-search-rules/{:uid}precedence: integer, optional, identical to theprecedencefield in the body ofPATCH /dynamic-search-rules/{:uid}
- The
POST /indexes/{:indexUid}/searchbody has an additional, optional (defaults tonull)inlineRulefield which is anInlineRuleobject. - In the
POST /multi-searchbody, the objects inside thequeriesarray have an additional, optional (defaults tonull)inlineRulefield which is anInlineRuleobject.
Passing a search rule specific to the user making the request
Previewing the effect of a search rule
// POST /multi-search -H 'Meili-Include-Metadata: true`
{
"queries": [
// base query without inline rule
{
"q": "fashion",
"filter": "color = blue AND category = shirt"
},
// same query with inline rule
{
"q": "fashion",
"filter": "color = blue AND category = shirt",
"inlineRule": {
"uid": "special-sales",
"conditions": {
"query": {
"words": "pants",
},
"filter": {
"values": {
"color": "yellow",
"stock_intent": "destock"
}
}
}
}
}
]
}
Response:
{
// [ ... ] some other fields
"results": [
// results without the rule
{
"hits": [ ... ] // documents returned without the rule
},
// results with the rule
{
// [...] some other fields
"hits": [...], // documents returned with the rule. Here the same, because the conditions of the rules are not satisfied
"metadata": {
// [...] some other fields
"inlineRuleConditionOutcomes": {
"satisfiesActiveCondition": true,
"satisfiesQueryWordsCondition": {
"missingWord": "pants"
},
"satifiesFilterCondition": {
"missingConstraintOnField": {
"field": "stock_intent"
},
"unmetConstraintOnField":
"field": "color"
}
}
}
}
]
}
When setting showPerformanceDetails to true in a search request, the response's performanceDetails will now display an entry for the facet distribution computation.
New trace entries
Request
curl -X POST 'http://localhost:7700/indexes/movies/search' \
-H 'Content-Type: application/json' \
-d '{
"q": "batman",
"facets": ["genres"],
"showPerformanceDetails": true,
"limit": 3
}'
Response
{
"hits": [
# ...
],
"query": "batman",
"processingTimeMs": 4,
"limit": 3,
"offset": 0,
"estimatedTotalHits": 68,
"facetDistribution": {
"genres": {
#...
}
},
"facetStats": {},
"requestUid": "01a12f80-0e1b-7632-b4f3-c8d4914048c9",
"performanceDetails": {
"wait in queue": "68.58µs",
"preprocess filters > prepare": "100.25µs",
"preprocess filters": "100.42µs",
"process > prepare": "115.54µs",
"process > send to remote": "102.71µs",
"process > execute local > load field ids map": "30.88µs",
"process > execute local > query[0] > tokenize query": "265.38µs",
"process > execute local > query[0] > evaluate query": "890.96µs",
"process > execute local > query[0] > keyword ranking": "425.04µs",
"process > execute local > query[0]": "2.95ms",
"process > execute local > pin hits": "9.92µs",
"process > execute local > format": "94.62µs",
"process > execute local > facet distribution > compute facet distribution": "315.75µs",
"process > execute local > facet distribution > compute facet stats": "27.71µs",
"process > execute local > facet distribution": "432.62µs",
"process > execute local": "3.81ms",
"process > wait for remote": "50.96µs",
"process > merge": "905.62µs",
"process": "5.07ms"
}
}
Three additional steps:
"process > execute local > facet distribution > compute facet distribution": "315.75µs",
"process > execute local > facet distribution > compute facet stats": "27.71µs",
"process > execute local > facet distribution": "432.62µs",
By @ManyTheFish in https://github.com/meilisearch/meilisearch/pull/6644
Documents containing raw unicode codepoints (e.g. \u03b1) would cause a panic at search time when formatting results for highlighting when using some segmenters.
A failure at the segmenter's level no longer causes a panic.
By @dureuill in https://github.com/meilisearch/meilisearch/pull/6673
[!IMPORTANT]
This fix modifies the relevancy of the engine in some circumstances. This is allowed as per our back-compatiblity policy.
To avoid a performance sink when using the rankingScoreThreshold parameter in a search, Meilisearch now guarantees that the search will stop after evaluating the first document whose score is below the threshold. Previously Meilisearch would try to evaluate more documents, which could lead to evaluating all documents in the database, causing a very long search time.
By @ManyTheFish in https://github.com/meilisearch/meilisearch/pull/6661
[!WARNING]
This fix introduces a breaking change in the Meilisearch API. Because the previous behavior would corrupt the embeddings in the database, this is allowed by our back-compatibility policy.
Since the exact value of embeddings is not retained when the embedder is configured for binary quantize embeddings, disabling the binary quantization on an index is not allowed.
Unfortunately, an oversight in the API allowed to accidentally disable binary quantization by passing binaryQuantization: null in a setting update. This now results in an error.
By @dureuill in https://github.com/meilisearch/meilisearch/pull/6656
- Maintainability: replace some
unreachable!()code paths with static typing by @dureuill in https://github.com/meilisearch/meilisearch/pull/6670 - Add GHA to enforce benchmarks label on each PR by @curquiza in https://github.com/meilisearch/meilisearch/pull/6663
- Add link to MCP guide in generated API reference by @Strift in https://github.com/meilisearch/meilisearch/pull/6650
- Add link to agentic search demo & fix links by @Strift in https://github.com/meilisearch/meilisearch/pull/6655
- Small changes to CONTRIBUTING.md by @dureuill in https://github.com/meilisearch/meilisearch/pull/6668
- Bump actions/setup-java from 5.7.0 to 6.0.1 by @dependabot[bot] in https://github.com/meilisearch/meilisearch/pull/6662
- Fix OpenAPI docs by @curquiza in https://github.com/meilisearch/meilisearch/pull/6667
- CI: Fix flaky tests by @dureuill in https://github.com/meilisearch/meilisearch/pull/6674
Full Changelog: https://github.com/meilisearch/meilisearch/compare/v1.54.3...v1.55.0
v1.52.4
This release contains an important stability fix for Meilisearch. Update from v1.52.3 is recommended.
See https://github.com/meilisearch/meilisearch/pull/6658 for details
v1.53.3
This release contains an important stability fix for Meilisearch. Update from v1.53.2 is recommended.
See https://github.com/meilisearch/meilisearch/pull/6658 for details
v1.54.3
This release contains an important stability fix for Meilisearch. Update from v1.54.2 is recommended.
See https://github.com/meilisearch/meilisearch/pull/6658 for details
v1.54.2
Meilisearch v1.54.2 contains an important fix for users of the dynamicSearchRule experimental feature.
- Trying to process, display, delete or cancel dynamic search rules update tasks that were created in Meilisearch v1.53 or prior no longer causes internal errors. By @dureuill in https://github.com/meilisearch/meilisearch/pull/6651. Thanks to @connorabbas for their report in https://github.com/meilisearch/meilisearch/issues/6646 ❤️
v1.54.1
- Make the embedder setting change succeed when the embedder's API key is expired by @ManyTheFish in https://github.com/meilisearch/meilisearch/pull/6640
- Ignore geo errors when updating or deleting existing docs by @dureuill in https://github.com/meilisearch/meilisearch/pull/6638
- Aggregate the analytics from the MCP route by @Kerollmops in https://github.com/meilisearch/meilisearch/pull/6639
v1.54.0
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.
-
The
POST /dynamic-search-rulesendpoint now returnsactionsas an object with 2 fields instead of a list: -
pinis an array ofPinobjects with the following fields:id, String, mandatory: document id of the document to pinposition: positive or zero number, mandatory: position where to pin the documentindexUid, optional, defaults tonull, uid of the index that this action applies to. Ifnullor missing, the action applies to any index containing a document with the providedid.
-
scaleis an array ofScaleobjects with the following fields:weight, positive or zero number, mandatory: scaling factor to multiply with the selected documents' innate relevancy scoreids, array of strings, optional: list of document ids whose document's relevancy score should be scaled by the provided weightfilter: Meilisearch filter without a foreign filter, optional: a filter on the index that is resolved to determine a list of selected documentsindexUid, optional, defaults tonull, uid of the index that this action applies to. Ifnullor missing, the action applies to any index.
-
The
PATCH /dynamic-search-rules/{:ruleUid}endpoint now expects a rule with the modifiedactionsfield. See changes toPOST /dynamic-search-rulesfor details. -
The uid
__meilisearch_metadatais now reserved and cannot be used as aruleUidinPATCH /dynamic-search-rules/{:ruleUid}
- 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
ruleUidfield 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
scalefield, with order0. The scale field is an object with the following fields:order: order of application of the rule. Always 0actions: an array ofScaleActions, where eachScaleActioncontains the following fields:ruleUid: the name of the rule that was appliedweightthe 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 10MEILI_EXPERIMENTAL_DSR_FUEL_SCALE_FUEL: maximum number of combinations of scale constraint that are evaluated in a single search. Range 1-255, default 10.
Boosting "Batman" product for a festival
- Creating the search rule
// 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
}
]
}
}
- Once the DSR update task has been processed and the festival begins on September 21st, make a search query:
{
"q": "superhero returns prequel",
"showRankingScoreDetails": true
}
- Observe the ranking of documents
"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]"
}
Demoting out-of-stock products
// PATCH /dynamic-search-rules/out-of-stock
{
"actions": {
"scale": [
{
"filter": "availability = \"out of stock\"",
"weight": 0.5
}
]
}
}
Hiding discontinued products
// PATCH /dynamic-search-rules/discontinued
{
"actions": {
"scale": [
{
"filter": "availability = discontinued",
"weight": 0.0
}
]
}
}
By @dureuill in https://github.com/meilisearch/meilisearch/pull/6549
We introduce a new MCP protocol on the /mcp path. It implements the HTTP+SSE Transport version of the protocol. 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
The performance details in a federated search now separate the timing per query
Example
"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"
}
By @ManyTheFish in https://github.com/meilisearch/meilisearch/pull/6631
- Remove
HashMaptransmute in indexer by @dureuill in https://github.com/meilisearch/meilisearch/pull/6622 - Bump
lruto 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-gofrom 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
- @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
🖇️ v1.53.2
- Remove 100ms penalty on task replication by @dureuill in https://github.com/meilisearch/meilisearch/pull/6612
- Do not hilight stop-words by @harismuzaffer in https://github.com/meilisearch/meilisearch/pull/6595
- Include last indexed documents in exactness ranking rule when updating searchable attributes in settings by @harismuzaffer in https://github.com/meilisearch/meilisearch/pull/6604
- Tie authorization to index opening by @ManyTheFish in https://github.com/meilisearch/meilisearch/pull/6610
- Add context for CorruptedTaskQueue error in message by @ManyTheFish in https://github.com/meilisearch/meilisearch/pull/6615
- Allow generating a description for the error codes by @dureuill in https://github.com/meilisearch/meilisearch/pull/6609
- Update charabia to 0.10.0 by @dureuill in https://github.com/meilisearch/meilisearch/pull/6602
- Fix typo by @vaibhav8a in https://github.com/meilisearch/meilisearch/pull/6605
- @harismuzaffer made their first contribution in https://github.com/meilisearch/meilisearch/pull/6595
- @vaibhav8a made their first contribution in https://github.com/meilisearch/meilisearch/pull/6605
Full Changelog: https://github.com/meilisearch/meilisearch/compare/v1.53.1...v1.53.2
🖇️ v1.53.1
by @ManyTheFish in https://github.com/meilisearch/meilisearch/pull/6587
Control the maximum number of LMDB read transactions at the same time for the task queue.
The following environment variable can be exported to specify the maximum number of simultaneous read transactions:
# Only the environment variable can set this parameter
MEILI_EXPERIMENTAL_TASK_QUEUE_MAX_READERS=100
Product discussion: https://github.com/orgs/meilisearch/discussions/806
- Bump mini-dashboard to v0.4.2 by @Strift in https://github.com/meilisearch/meilisearch/pull/6585
Full Changelog: https://github.com/meilisearch/meilisearch/compare/v1.53.0...v1.53.1
v1.52.3 🐠
- Revert the Speed up the search speed a bit more by @Kerollmops introduced in https://github.com/meilisearch/meilisearch/pull/6542
Full Changelog: https://github.com/meilisearch/meilisearch/compare/v1.52.2...v1.52.3