Meilisearch 1.11
Meilisearch 1.11 advances AI-powered search toward stabilization with key improvements, including binary quantization. This release also enhances federated search functionality based on user feedback.
We're excited to introduce Meilisearch v1.11. In this article, we'll cover the most significant changes. For a full list of updates, visit the changelog on GitHub.
Meilisearch 1.11 is available on Meilisearch Cloud, too—upgrade now!
Experimental: vector database indexing performance improvements
Meilisearch v1.11 introduces a new embedder option: binaryQuantized
.
Binary quantization compresses vectors by encoding each dimension with 1-bit values, significantly boosting performance, especially in datasets with over 1M documents and models with more than 1024 dimensions.
Smaller embeddings (under 1024 dimensions) tend to give worse results. With fewer dimensions, the binary vector doesn't retain enough information for good relevancy.
Enabling this feature permanently updates all vectors to contain only 1s and -1s, which can greatly affect search relevancy. This change is irreversible.
Before enabling this feature, we recommend testing it in a smaller or duplicate index in a development environment to evaluate its impact on your use case.
Experimental: AI-powered search improvements
Breaking changes
This release introduces several breaking changes for feature stabilization.
embedder
parameter becomes mandatory
In previous versions, the default embedder was automatically used for search and similar requests when no embedder was specified. Starting with v1.11, it’s now mandatory to specify the embedder
parameter when performing:
- Semantic or hybrid search via
GET
andPOST
where the embedder must be included as part of thehybrid
object. - Similarity search via
GET
andPOST
, where theembedder
is required as a top-level parameter.
// Semantic and hybrid search client.index('INDEX_NAME').search( query, { hybrid: { embedder: 'EMBEDDER_NAME' // mandatory as of v1.11 } } ) // Similarity search client.index('INDEX_NAME').searchSimilarDocuments({ id: 'TARGET_DOCUMENT_ID', embedder: 'EMBEDDER_NAME' // mandatory as of v1.11 })
Additionally, even for full-vector searches (when using vector
without q
), you must include the hybrid
object with the embedder
.
client.index('INDEX_NAME').search({ vector: [0, 1, 2], hybrid: { embedder: 'EMBEDDER_NAME'// mandatory as of v1.11 } })
Non-zero semanticRatio
now ignored when passing vector
without q
Before Meilisearch v1.11, when performing a search with the vector
and hybrid
parameters but without q
, a placeholder keyword search occurred unless hybrid.semanticRatio
was set to 1.0
. In v1.11, a semantic search is always performed unless hybrid.semanticRatio
is set to 0.0
.
Additions and improvements
Default OpenAI model update
The default OpenAI model has been updated from text-embedding-ada-002
to the new text-embedding-3-small
. This new model is both more cost-effective and more accurate than the legacy ada
model, offering better performance at a lower cost.
New embedder parameter
Meilisearch 1.11's new documentTemplateMaxBytes
parameter allows truncating the document's template text when it exceeds the specified byte limit. It is set, by default, to 400 bytes.
This change is backward compatible. Existing embedders will retain the 400-byte default, with no need to recompute embeddings during the upgrade. The new limit will only apply when a document is modified and the template is re-rendered.
Improved document template
Fields in documentTemplate
now include the field.is_searchable
property. The default document template will filter out both empty fields and fields not in the searchable attributes list. The new default template only applies to embedders created starting with v1.11.
// v1.11 default document template {% for field in fields %} {% if field.is_searchable and not field.value == nil %} {{ field.name }}: {{ field.value }} {% endif %} {% endfor %} // v1.10 default document template {% for field in fields %} {{ field.name }}: {{ field.value }} {% endfor %}
Federated search improvements: facet distribution and stats
Meilisearch v1.11 introduces two new options for federated searches: facetsByIndex
and mergeFacets
. These options allow you to request facet distribution and stats for federated search results.
Facet Information by index
To retrieve facet distribution and stats for each individual index, use the facetsByIndex
option.
{ "federation": { "facetsByIndex": { "movies": ["title", "id"], "comics": ["title"] } }, "queries": [ { "q": "Batman", "indexUid": "movies" }, { "q": "Batman", "indexUid": "comics" } ] }
The response will include facet distribution and stats for each index:
{ "facetsByIndex": { "movies": { // Facet distribution for queries on the `movies` index "distribution": { "title": { "Batman returns": 1 }, "id": { "42": 1 } }, // Facet stats for queries on the `movies` index "stats": { "id": { "min": 42, "max": 42 } } }, "comics": { // Facet distribution for queries on the `comics` index "distribution": { "title": { "Batman: the killing joke": 1 } }, // Facet stats for queries on the `comics` index (empty because only numeric values are considered) "stats": {} } } }
Merged facet information
To get facet distribution and stats from all indexes in a single result, use both facetsByIndex
and mergeFacets
:
POST /multi-search { "federation": { "facetsByIndex": { "movies": ["title", "id"], "comics": ["title"] }, "mergeFacets": { "maxValuesPerFacet": 10 } }, "queries": [ { "q": "Batman", "indexUid": "movies" }, { "q": "Batman", "indexUid": "comics" } ] }
The response will include merged facet data:
{ "facetDistribution": { "title": { "Batman returns": 1, "Batman: the killing joke": 1 }, "id": { "42": 1 } }, "facetStats": { "id": { "min": 42, "max": 42 } } }
Learn more about federated search and its use cases.
Experimental: new STARTS_WITH
filter operator
The new STARTS_WITH
filter operator matches any field values that start with the specified string pattern:
// returns all heroes whose name starts with 'super' "filter": "hero STARTS_WITH super"
This is an experimental feature. To enable it, use the experimental features endpoint and set the containsFilter
option to true
. Note that this will also activate the CONTAINS
filter operator.
Share your feedback via this GitHub discussion
Contributors shout-out
We want to give a massive thank you to the contributors who made this release possible: @iornstein for their help with Meilisearch, and @luflow, @tkhshtsh0917 for their work on charabia.
We also want to extend special thanks to our SDK maintainers working hard to make Meilisearch available across many languages and frameworks.
And that’s a wrap for v1.11! These release notes only highlights the most significant updates. For an exhaustive listing, read the changelog on Github.
Upgrade with ease using Meilisearch Cloud.
Stay in the loop of everything Meilisearch by subscribing to our monthly newsletter. To learn more about Meilisearch's future and help shape it, take a look at our roadmap and participate in our Product Discussions.
For anything else, join our developers community on Discord.