meilisearch/MeiliSearch
 Watch   
 Star   
 Fork   
2 days ago
MeiliSearch

v1.55.0 🔭

🌈 Improvements

Preview the effect of a dynamic search rule

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

Details

  1. There is a new InlineRule object with the following field:
    1. 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.
    2. active, boolean, optional, defaults to true: whether the rule is active. The actions of an inactive inline rule never apply to the search, but its conditions are still checked
    3. conditions: RuleConditions object, identical to the conditions field in the body of PATCH /dynamic-search-rules/{:uid}
    4. actions: RuleActions object, identical to the actions field in the body of PATCH /dynamic-search-rules/{:uid}
    5. precedence: integer, optional, identical to the precedence field in the body of PATCH /dynamic-search-rules/{:uid}
  2. The POST /indexes/{:indexUid}/search body has an additional, optional (defaults to null) inlineRule field which is an InlineRule object.
  3. In the POST /multi-search body, the objects inside the queries array have an additional, optional (defaults to null) inlineRule field which is an InlineRule object.

Examples

Passing a search rule specific to the user making the request
// POST /indexes/movies/search
{
  "q": "super hero",
  "inlineRule": {
    "uid": "user-likes-batman",
    "actions": {
      "scale": [
        {
          // filter recent Batman movies
          "filter": "hero = batman AND release_time = fresh",
          "weight": 1.2 // moderate relevancy boost
        }
      ]
    }
  }
}
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"
          }
        }
      }
    }
  ]
}

Improve showPerformanceDetails at search time

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

🦋 Fixes

Avoid panic at search time during formatting

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

Fix search performance of ranking score threshold

[!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

Prevent unsupported binaryQuantization deactivation in embedder settings

[!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

🔩 Miscellaneous

Full Changelog: https://github.com/meilisearch/meilisearch/compare/v1.54.3...v1.55.0

13 days ago
MeiliSearch

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

13 days ago
MeiliSearch

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

13 days ago
MeiliSearch

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

15 days ago
MeiliSearch

v1.54.2

Meilisearch v1.54.2 contains an important fix for users of the dynamicSearchRule experimental feature.

🦋 Fixes

16 days ago
MeiliSearch

v1.54.1

🪲 Bug fixes

🔩 Miscellaneous

27 days ago
MeiliSearch

v1.54.0

💥 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:

  2. 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.
  3. 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.
  4. 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.

  5. 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 ScaleActions, 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

Boosting "Batman" product for a festival
  1. 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
      }
    ]
  }
}
  1. 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
}
  1. 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

MCP endpoint

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

Improve search performance details in multi-search

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

🔩 Miscellaneous

New Contributors

Full Changelog: https://github.com/meilisearch/meilisearch/compare/v1.53.2...v1.54.0

2026-09-07 17:45:12
MeiliSearch

🖇️​ v1.53.2

🪲 Bug fixes

🔒 Security

🔩 Miscellaneous

New Contributors

Full Changelog: https://github.com/meilisearch/meilisearch/compare/v1.53.1...v1.53.2

2026-08-13 17:36:25
MeiliSearch

🖇️​ v1.53.1

✨ Enhancement

Add an env var to change the task queue readers

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

🔩 Miscellaneous

Full Changelog: https://github.com/meilisearch/meilisearch/compare/v1.53.0...v1.53.1

2026-08-11 00:09:10
MeiliSearch

v1.52.3 🐠

🪲 Bug fixes

Full Changelog: https://github.com/meilisearch/meilisearch/compare/v1.52.2...v1.52.3