Releases: meilisearch/meilisearch
v1.3.0-rc.0 🦁
v1.3.0 release changelogs
Meilisearch v1.3.0 introduces vector search, visible ranking score details, and the possibility to define fields to search on at search time. It also now includes the ability to search within facet values and sort facet values by count.
⚡ Supercharge your Meilisearch experience
Say goodbye to server deployment and manual updates with Meilisearch Cloud. No credit card required.
New features and improvements 🔥
Vector Search — Experimental
You can now use Meilisearch as a vector store. Meilisearch allows you to add vector embeddings generated by third-party software, and use embeddings when searching with the /search
or /multi-search
routes.
This experimental feature can be enabled via the HTTP API using v1.3.0's new /experimental-features
endpoint.
curl \
-X PATCH 'http://localhost:7700/experimental-features/' \
-H 'Content-Type: application/json' \
--data-binary '{
"vectorStore": true
}'
Sending Vectorized Documents
For the first iteration of this feature you must compute the vectors separately. Once that is done, include them in your documents using the _vectors
field. Finally, send the documents with vector data to your instance. A single document may contain multiple vectors.
curl -X POST -H 'content-type: application/json' \
'localhost:7700/indexes/songs/documents' \
--data-binary '[
{ "id": 0, "_vectors": [0, 0.8, -0.2], "title": "Across The Universe" },
{ "id": 1, "_vectors": [1, -0.2, 0], "title": "All Things Must Pass" },
{ "id": 2, "_vectors": [[0.5, 3, 1], [-0.2, 4, 6]], "title": "And Your Bird Can Sing" }
]'
Query Meilisearch using Vectors
Use the new vector
search parameter with the /search
and /multi-search
to search for documents with the nearest vector. You must compute the vector query with a third-party tool.
curl -X POST -H 'content-type: application/json' \
'localhost:7700/indexes/songs/search' \
--data-binary '{ "vector": [0, 1, 2] }'
Similarity score
When you use vector search, returned documents include a _semanticScore
field.
{
"hits": [
{ "id": 0, "_vectors": [0, 0.8, -0.2], "title": "Across The Universe", "_semanticScore": 0.6754 },
{ "id": 1, "_vectors": [1, -0.2, 0], "title": "All Things Must Pass", "_semanticScore": 0.7546 },
{ "id": 2, "_vectors": [[0.5, 3, 1], [-0.2, 4, 6]], "title": "And Your Bird Can Sing", "_semanticScore": 0.78 }
],
"query": "",
"vector": [0, 1, 2],
"processingTimeMs": 0,
"limit": 20,
"offset": 0,
"estimatedTotalHits": 2
}
🗣️ This feature is experimental and we need your help to improve it! Share your thoughts and feedback on this GitHub discussion.
Done by @Kerollmops in #3825
Display ranking scores at search
Use the new showRankingScore
search parameter to see the ranking scores for returned documents.
curl \
-X POST 'http://localhost:7700/indexes/movies/search' \
-H 'Content-Type: application/json' \
--data-binary '{ "q": "Batman Returns", "showRankingScore": true }'
Each returned document will include a _rankingScore
property displaying a score between 0 and 1. The higher the ranking score, the more relevant the document.
"_rankingScore": 0.8575757575757575,
Ranking score details — Experimental
View detailed scores per ranking rule for each document with the experimental showRankingScoreDetails
search parameter.
curl \
-X POST 'http://localhost:7700/indexes/movies/search' \
-H 'Content-Type: application/json' \
--data-binary '{ "q": "Batman Returns", "showRankingScoreDetails": true }'
When showRankingScoreDetails
is set to true
, returned documents include a _rankingScoreDetails
field. This field contains score values for each ranking rule.
"_rankingScoreDetails": {
"words": {
"order": 0,
"matchingWords": 1,
"maxMatchingWords": 1,
"score": 1.0
},
"typo": {
"order": 1,
"typoCount": 0,
"maxTypoCount": 1,
"score": 1.0
},
"proximity": {
"order": 2,
"score": 1.0
},
"attribute": {
"order": 3,
"attributes_ranking_order": 0.8,
"attributes_query_word_order": 0.6363636363636364,
"score": 0.7272727272727273
},
"exactness": {
"order": 4,
"matchType": "noExactMatch",
"score": 0.3333333333333333
}
}
This experimental feature can be turned on via the HTTP API using v1.3.0's new /experimental-features
endpoint.
curl \
-X PATCH 'http://localhost:7700/experimental-features/' \
-H 'Content-Type: application/json' \
--data-binary '{
"scoreDetails": true
}'
🗣️ This feature is experimental and we need your help to improve it! Share your thoughts and feedback on this GitHub discussion.
Relevancy change on attribute
ranking rule
The attribute
ranking rule now determines relevancy based on the distance to the position of the word in the query rather than the absolute distance to the beginning of a document.
Previously, documents with attributes containing search terms at the beginning of the attribute would be considered more relevant than documents containing search terms at the end of an attribute.
Define fields to search on at search time
attributesToSearchOn
is a new search parameter accepting an array of strings indicating one or more document attributes. Queries using attributesToSearchOn
will restrict the search to the indicated attributes.
Attributes passed to attributesToSearchOn
must be in the searchable attributes list.
Given the following dataset:
{
"id": 0,
"name": "Our Wives Under the Sea",
"genre": ["horror", "scifi"],
"synopsis": "A woman returns to her wife transformed after a deep-sea adventure."
},
{
"id": 1,
"name": "A Strange and Stubborn Endurance",
"genre": ["adventure"],
"synopsis": "A man must overcome trauma and fight off a mysterious assassin."
}
And the following query:
{
"q": "adventure",
"attributesToSearchOn": ["genre"]
}
Meilisearch will only return document 1.
Both documents contain the term "adventure"
, but "attributesToSearchOn": ["genre"]
instructs Meilisearch to only consider results found on the genre
field.
Done by @ManyTheFish in (#3834)
Search for facet values
The new endpoint POST /indexes/{index}/facet-search
allows you to search for facet values. Only fields defined as filterableAttributes
will be facet-searchable.
Facet search supports prefix search and typo tolerance.
curl \
-X POST 'http://localhost:7700/indexes/movies/facet-search' \
-H 'Content-Type: application/json' \
--data-binary '{
"facetName": "genres",
"facetQuery": "a"
}'
Done by @Kerollmops in (#3699)
Sort facet values by count
Order facets by count
using the sortFacetValuesBy
property of the faceting
index settings. This allows you to sort facet values in descending order by the number of matched documents containing that facet value.
It is possible to change this ordering for all facets using *
:
curl \
-X PATCH 'http://localhost:7700/indexes/movies/settings/faceting \
-H 'Content-Type: application/json' \
--data-binary '{
"sortFacetValuesBy": {"*": "count"}
}'
Alternatively, it is possible to order a single facet by count
, while other attributes follow alphanumeric ordering:
curl \
-X PATCH 'http://localhost:7700/indexes/movies/settings/faceting \
-H 'Content-Type: application/json' \
--data-binary '{
"sortFacetValuesBy": {"*": "alpha", "genre": "count"}
}'
Done by @Kerollmops in (#3612)
Language support improvements
- Enhance Japanese word segmentation (#218) @mosuka
- Enhance separator-based Tokenization (#215) @ManyTheFish
- words containing
_
are now properly segmented into several words - brackets
{([])}
are no longer considered as context separators for theproximity
ranking rule
- words containing
Done by @ManyTheFish, @mosuka in [#3866] and in Charabia v0.8.1
Other improvements
- Improve the Prometheus
/metrics
experimental feature (#625). Provides metrics on the task queue such as the number of queued tasks and the number of processing tasks. Adds the real database size used by Meilisearch. Add "meilisearch" prefix to metrics (#3789, #3861) @irevoire @dureuill - Reduce index size (~15%) by removing an internal database (#3819) @loiclec
- Add new
/experimental-features
endpoint to configurescoreDetails
andvectorStore
(#3850) @dureuill - Reduce deserialization time by using
RoaringBitmap::deserialize_unchecked_from
(#3788) @Kerollmops - Re-enable autobatching for addition and deletion tasks ...
v1.2.0 🐻❄️
Meilisearch v1.2 introduces new filter operators IS NULL
and IS EMPTY
, a new route to delete documents with filters, and significant relevancy and performance updates.
🧰 All official Meilisearch integrations (including SDKs, clients, and other tools) are compatible with this Meilisearch release. Integration deployment happens between 4 to 48 hours after a new version becomes available.
Some SDKs might not include all new features—consult the project repository for detailed information. Is a feature you need missing from your chosen SDK? Create an issue letting us know you need it, or, for open-source karma points, open a PR implementing it (we'll love you for that ❤️).
New features and improvements 🔥
Delete documents by filter
Meilisearch v1.2 allows you to use filters to delete documents with the new /documents/delete
route:
curl -X POST http://localhost:7700/indexes/dogs/documents/delete \
-H 'Content-Type: application/json' \
--data-binary '{ "filter": ["doggo = 'bernese mountain'", "face = cute"] }'
Fields must be set as filterable before you can use them as filters.
Meilisearch will return a summarized task object:
{
"taskUid": 242,
"indexUid": "dogs",
"status": "enqueued",
"type": "documentDeletion",
"enqueuedAt": "2023-05-03T11:01:58.721841Z"
}
Use the returned taskUid
with the task route to check the task status.
Done by @dureuill and @irevoire in #3550.
Get documents by filter
You can now use filters in the GET
endpoint of the /documents
route:
curl -X GET 'http://localhost:7700/indexes/dogs/documents?limit=1&filter=doggo=bernese'
You can also use the new /documents/fetch
route to handle complex filters:
curl -X POST http://localhost:7700/indexes/dogs/documents/fetch \
-H 'Content-Type: application/json' \
--data-binary '{ "limit": 1, "filter": "doggo = bernese" }'
/documents/fetch
accepts following parameters: limit
, offset
, fields
, and filter
.
Fields must be set as filterable before you can use them as filters.
Done by @dureuill and @irevoire in #3570.
New filter operators: IS EMPTY
and IS NULL
This release introduces two new filter operators. IS EMPTY
matches existing fields with a valid, but empty value. IS NULL
matches existing fields with an explicit null
value.
Given the following documents:
[{
"id": 0,
"color": []
},
{
"id": 1,
"color": null
},
{
"id": 2,
},
]
color IS EMPTY
matches document 0
.
color IS NULL
matches document 1
.
Both operators can be used together with the NOT
operator: color IS NOT EMPTY
and NOT color IS EMPTY
match document 1
. color IS NOT NULL
and NOT color IS NULL
match document 0
.
Neither operator will match documents missing the specified field.
Done by @Kerollmops in #3571.
Improve relevancy and search performance
The search engine has seen significant refactoring. This brings performance and relevancy improvements, as well as setting the foundations for new features related to search customization. Stay tuned!
If you have any questions or experience unexpected behavior, feel free to reach out.
Done by @loiclec, @dureuill, @ManyTheFish, @Kerollmops and @irevoire in #3542.
Performance improvements
- The fastest 75 percent of queries now consistently answer below 50ms on our test setup
- Complexity of search queries has been limited to limit CPU time and RAM consumption. More specifically:
- A single term is now limited to 150 possible typo matches for queries containing 1 typo, and to 50 possibilities for queries containing 2 typos
- Both single word or multi word queries consider a maximum of 50 synonyms
- The total number of words for all synonyms of a single term cannot exceed 100
- Queries can now contain a maximum of 1000 words. This change only impacts queries containing very long phrases. Search terms (words not inside a phrase, and individual phrases) remain limited to 10 per query
- Geo search improvements:
- Increased performance when geosorting small sets of documents
- Descending sort is now as performant as ascending sort
- Address assorted minor performance issues: #3124, #3378, #2202, #3123
Relevancy improvements
- The
exactness
ranking rule no longer treats synonyms as exact matches. This boosts documents containing the query exactly as typed by the user. Solves #3410 - Meilisearch will always sort results as if the
words
ranking rule were present with a higher priority than theattributes
,exactness
,typo
andproximity
ranking rules. This happens even if thewords
ranking rule has been removed or set with a lower priority. Search behavior when using the specified ranking rules before or withoutwords
was confusing and hurt relevancy - Split words are now also treated as possible digrams. This means the query
whit ehorse
may match documents containingwhite horse
, which improves the relevancy of typo tolerance - N-grams and split words are now ranked lower in comparison to the exact word when processing the
typo
ranking rule. For example, a query forsun flower
will now return a document titledSun Flower
before one titledSunflower
- Ranking rule behavior no longer depends on the number of ranked documents, improving consistency in terms of both relevancy and latency. Solves #3356
Automated task deletion
Maximum number of tasks the task queue can hold now limited to 1M. Fixes issues with enqueuing new tasks when the database is full.
Once the task queue reaches this limit, Meilisearch will try to delete the oldest 100k tasks. If not all 100k tasks can be deleted due to some of them being unfinished, Meilisearch will delete as many tasks as possible. If there are no unfinished tasks, Meilisearch will not delete anything but still enqueue new tasks as usual.
The engine will stop you from adding new tasks once the hard limit of 10GiB of tasks is reached (that’s between 5M and 15M of tasks depending on your workflow). In this case, Meilisearch will try to automatically delete unfinished tasks. If this is unsuccessful, it will not enqueue new tasks, and log a warning notifying the user the engine is not working properly.
Language support improvements
- Split camelCase in Latin segmenter
- Improve Arabic: normalizer and segmentation
Done by @ManyTheFish, @akeamc, @DrAliRagab, @goodhoko, and @mosuka in #3702 and in Charabia v0.7.2
Other improvements
- Introduce experimental feature to reduce the RAM usage. Can be useful if Meilisearch is sometimes killed by your OS. Check out this discussion to get more information and how to use it (#3651) @Kerollmops
- Add boolean support for CSV documents (#3576) @irevoire
- Improve geosort errors during sorting and filtering (#3638 and #3631) @cymruu
- Improve error message when payload is too large (#3739) @cymruu
Fixes 🐞
- Improve the
GET /health
route by ensuring the internal DB is not down (#3647) @irevoire - Handle single quotation mark (
’
) and apostrophe ('
) the same way (#3702) @ManyTheFish - Fix the sort error message: regression seen in v1.1 (#3749 and #3755) @ManyTheFish
Misc
- Dependencies upgrade
- CIs and tests
- Add scheduled tests for all features to Actions (#3510) @jlucktay
- Clean CI file names (#3567) @curquiza
- Enable cache again in test suite CI (#3587) @curquiza
- Remove CLI changes for clippy (#3464) @dureuill
- Improve docker cache in CIs (#3566) @inductor
- Remove Uffizzi because the team no longer uses it (#3694) @curquiza
- Add SDK tests to CI (#3709) @curquiza
- Use URL of our self-hosted bors instance (#3721) @curquiza
- Improve index-scheduler tests (#3639) @Sufflope
- Documentation
- Add newline after the meilisearch version in the issue template (#3636) @bidoubiwa
- Add sprint issue to template issues (#3643) @curquiza
- Update the prototype section in CONTRIBUTING.md (#3649) @curquiza
- Update README to reference new docs website (#3666, #3710, #3718 and #3720) @guimachiavelli @roy9495 @Kerollmops @curquiza
- Move comments above keys in
config.toml
(#3731) @jirutka
- Misc
❤️ Thanks again to our external contributors:
- Meilisearch: @cymruu, @GregoryConrad, @inductor, @jirutka, @jlucktay, @roy9495, and @Sufflope.
- Charabia: @akeamc, @DrAliRagab, @goodhoko, and @mosuka.
v1.2.0-rc.4 🐻❄️
v1.2.0-rc.3 🐻❄️
v1.2.0-rc.2 🐻❄️
Fixes
Changes
- Update get/delete documents feature according to the last decision with product squad. Check out the spec for more information. (#3775) @irevoire
- Get rid of the
invalid_document_delete_filter
and always use theinvalid_document_filter
- Introduce a new
missing_document_filter
instead of returninginvalid_document_delete_filter
(that’s consistent with all the other routes that have a mandatory parameter) - Always return the
original_filter
in the details (potentially set tonull
) instead of hiding it if it wasn’t used
- Get rid of the
v1.2.0-rc.1 🐻❄️
Bug fixes
- Fix the sort error message: regression seen in v1.1 (#3749 and #3755) @ManyTheFish
- Fix bugs introduced by the release
Improvements
- Improve error message when payload is too large (#3739) @cymruu
- Introduce experimental feature to reduce the RAM usage. Check out this discussion to get more information (#3651) @Kerollmops
- Add missing analytics. More about the telemetry in Meilisearch (#3738) @irevoire
- Improve performance of search (#3757) @loiclec
v1.2.0-rc.0 🐻❄️
Meilisearch v1.2 introduces new filter operators IS NULL
and IS EMPTY
, a new route to delete documents with filters, and significant relevancy and performance updates.
📖 Meilisearch's official documentation will be ready for the official v1.2.0 release. Meanwhile, work-in-progress documentation is available here (link coming soon).
New features and improvements 🔥
Delete documents by filter
Meilisearch v1.2 allows you to use filters to delete documents with the new /documents/delete
route:
curl -X POST http://localhost:7700/indexes/dogs/documents/delete \
-H 'Content-Type: application/json' \
--data-binary '{ "filter": ["doggo = 'bernese mountain'", "face = cute"] }'
Fields must be set as filterable before you can use them as filters.
Meilisearch will return a summarized task object:
{
"taskUid": 242,
"indexUid": "dogs",
"status": "enqueued",
"type": "documentDeletion",
"enqueuedAt": "2023-05-03T11:01:58.721841Z"
}
Use the returned taskUid
with the task route to check the task status.
Done by @dureuill and @irevoire in #3550.
Get documents by filter
You can now use filters in the GET
endpoint of the /documents
route:
curl -X GET 'http://localhost:7700/indexes/dogs/documents?limit=1&filter=doggo=bernese'
You can also use the new /documents/fetch
route to handle complex filters:
curl -X POST http://localhost:7700/indexes/dogs/documents/fetch \
-H 'Content-Type: application/json' \
--data-binary '{ "limit": 1, "filter": "doggo = bernese" }'
/documents/fetch
accepts following parameters: limit
, offset
, fields
, and filter
.
Fields must be set as filterable before you can use them as filters.
Done by @dureuill and @irevoire in #3570.
New filter operators: IS EMPTY
and IS NULL
This release introduces two new filter operators. IS EMPTY
matches existing fields with a valid, but empty value. IS NULL
matches existing fields with an explicit null
value.
Given the following documents:
[{
"id": 0,
"color": []
},
{
"id": 1,
"color": null
},
{
"id": 2,
},
]
color IS EMPTY
matches document 0
.
color IS NULL
matches document 1
.
Both operators can be used together with the NOT
operator: color IS NOT EMPTY
and NOT color IS EMPTY
match document 1
. color IS NOT NULL
and NOT color IS NULL
match document 0
.
Neither operator will match documents missing the specified field.
Done by @Kerollmops in #3571.
Improve relevancy and search performance
The search engine has seen significant refactoring. This brings performance and relevancy improvements, as well as setting the foundations for new features related to search customization. Stay tuned!
If you have any questions or experience unexpected behavior, feel free to reach out.
Done by @loiclec, @dureuill, @ManyTheFish, @Kerollmops and @irevoire in #3542.
Performance improvements
- The fastest 75 percent of queries now consistently answer below 50ms on our test setup
- Complexity of search queries has been limited to limit CPU time and RAM consumption. More specifically:
- A single term is now limited to 150 possible typo matches for queries containing 1 typo, and to 50 possibilities for queries containing 2 typos
- Both single word or multi word queries consider a maximum of 50 synonyms
- The total number of words for all synonyms of a single term cannot exceed 100
- Queries can now contain a maximum of 1000 words. This change only impacts queries containing very long phrases. Search terms (words not inside a phrase, and individual phrases) remain limited to 10 per query
- Geo search improvements:
- Increased performance when geosorting small sets of documents
- Descending sort is now as performant as ascending sort
- Address assorted minor performance issues: #3124, #3378, #2202, #3123
Relevancy improvements
- The
exactness
ranking rule no longer treats synonyms as exact matches. This boosts documents containing the query exactly as typed by the user. Solves #3410 - Meilisearch will always sort results as if the
words
ranking rule were present with a higher priority than theattributes
,exactness
,typo
andproximity
ranking rules. This happens even if thewords
ranking rule has been removed or set with a lower priority. Search behavior when using the specified ranking rules before or withoutwords
was confusing and hurt relevancy - Split words are now also treated as possible digrams. This means the query
whit ehorse
may match documents containingwhite horse
, which improves the relevancy of typo tolerance - N-grams and split words are now ranked lower in comparison to the exact word when processing the
typo
ranking rule. For example, a query forsun flower
will now return a document titledSun Flower
before one titledSunflower
- Ranking rule behavior no longer depends on the number of ranked documents, improving consistency in terms of both relevancy and latency. Solves #3356
Automated task deletion
Maximum number of tasks the task queue can hold now limited to 1M. Fixes issues with enqueuing new tasks when the database is full.
Once the task queue reaches this limit, Meilisearch will try to delete the oldest 100k tasks. If not all 100k tasks can be deleted due to some of them being unfinished, we will delete as many tasks as possible.
You’ll still be able to register new tasks even after reaching this limit. The engine will only stop you from adding new tasks once the hard limit of 10GiB of tasks is reached (that’s between 5M and 15M of tasks depending on your workflow).
If automated deletion fails to delete anything, Meilisearch will log a warning notifying the user the engine is not working properly and no tasks were enqueued.
Language support improvements
- Split camelCase in Latin segmenter
- Improve Arabic: normalizer and segmentation
Done by @ManyTheFish, @akeamc, @DrAliRagab, @goodhoko, and @mosuka in #3702 and in Charabia v0.7.2
Other improvements
- Add boolean support for CSV documents (#3576) @irevoire
- Improve geosort errors during sorting and filtering (#3638 and #3631) @cymruu
Fixes 🐞
- Improve the
GET /health
route by ensuring the internal DB is not down (#3647) @irevoire - Handle single quotation mark (
’
) and apostrophe ('
) the same way (#3702) @ManyTheFish
Misc
- Dependencies upgrade
- CIs and tests
- Add scheduled tests for all features to Actions (#3510) @jlucktay
- Clean CI file names (#3567) @curquiza
- Enable cache again in test suite CI (#3587) @curquiza
- Remove CLI changes for clippy (#3464) @dureuill
- Improve docker cache in CIs (#3566) @inductor
- Remove Uffizzi because the team no longer uses it (#3694) @curquiza
- Add SDK tests to CI (#3709) @curquiza
- Use URL of our self-hosted bors instance (#3721) @curquiza
- Improve index-scheduler tests (#3639) @Sufflope
- Documentation
- Add newline after the meilisearch version in the issue template (#3636) @bidoubiwa
- Add sprint issue to template issues (#3643) @curquiza
- Update the prototype section in CONTRIBUTING.md (#3649) @curquiza
- Update README to reference new docs website (#3666, #3710, #3718 and #3720) @guimachiavelli @roy9495 @Kerollmops @curquiza
- Move comments above keys in
config.toml
(#3731) @jirutka
- Misc
- Milli scope: when updating settings, check if primary key actually changes before throwing an error (#3608) @GregoryConrad
- Remove unused snapshot files (#3696) @irevoire
❤️ Thanks again to our external contributors:
- Meilisearch: @cymruu, @GregoryConrad, @inductor, @jirutka, @jlucktay, @roy9495, and @Sufflope.
- Charabia: @akeamc, @DrAliRagab, @goodhoko, and @mosuka.
v1.1.1 🐡
🚨 Replaces v1.1.0. We recommend upgrading from v1.1.0.
Bug fixes
- Disable auto-batching of additions and deletions (#3667, fixes #3664) @dureuill
- Stops receiving tasks once the task queue is full (#3659 & #3673) @irevoire & @dureuill
❤️ Thanks again to our external contributors:
- Meilisearch: @phaistonian for testing the prototype fix for #3664
v1.1.0 🐡
Meilisearch v1.1.0 introduces the much-requested multi-index search! You can now use one single HTTP request to perform different searches in multiple indexes.
Additional new features include: the geoBoundingBox
geosearch filter, the addition of a facetStats
object to queries using the facets
search parameter, and the customization of CSV separators.
🧰 All official Meilisearch integrations (including SDKs, clients, and other tools) are compatible with this Meilisearch release. Integration deployment happens between 4 to 48 hours after a new version becomes available.
Some SDKs might not include all new features—consult the project repository for detailed information. Is a feature you need missing from your chosen SDK? Create an issue letting us know you need it, or, for open-source karma points, open a PR implementing it (we'll love you for that <3).
New features and improvements 🔥
Multi-index search: allow multiple searches in a single request
Perform searches in multiple indexes in a single HTTP request using the new /multi-search
endpoint:
curl \
-X POST 'http://localhost:7700/multi-search' \
-H 'Content-Type: application/json' \
--data-binary '{
"queries": [
{
"indexUid": "products",
"q": "Nike",
"limit": 1
},
{
"indexUid": "brands",
"q": "Nike",
"limit": 1
}
]
}'
When you use the multi-index search endpoint, Meilisearch returns an array of results for each queried index:
{
"results": [
{
"indexUid": "products",
"hits": […],
"query": "Nike",
"processingTimeMs": 1,
"limit": 1,
"offset": 0,
"estimatedTotalHits": 17
},
{
"indexUid": "brands",
"hits": […],
"query": "Nike",
"processingTimeMs": 0,
"limit": 1,
"offset": 0,
"estimatedTotalHits": 7
}
]
}
Introduce facetStats
Queries containing the facets
parameter now include a facetStats
object by default:
curl \
-X POST 'http://localhost:7700/indexes/movies/search' \
-H 'Content-Type: application/json' \
--data-binary '{
"facets": ["price"]
}'
facetStats
only lists facets containing numerical values. Facets with other types of values are not included in the facetStats
object. This object contains the minimum (min
) and the maximum (max
) of each numerical facet:
{
"hits": […],
"facetDistribution": {
"price": {…}
},
"facetStats": {
"price": {
"min": 2,
"max": 60
}
}
}
New geosearch filter: _geoBoundingBox
Use the filter
search parameter and the _geoBoundingBox
filter expression to obtain results contained within a specific geographic area.
curl \
-X POST 'http://localhost:7700/indexes/restaurants/search' \
-H 'Content-type:application/json' \
--data-binary '{ "filter": "_geoBoundingBox([45.472735, 9.184019],[45.473711, 9.185613] )" }'
_geoBoundingBox([lat, lng], [lat, lng])
accepts two parameters: one array specifying the top right corner, and a second array specifying the bottom left corner.
Done by @gmourier and @irevoire in #3405 and #3529.
Removing limits on index size and count
Meilisearch no longer limits the size nor the amount of indexes a single instance may contain. You can now create an unlimited number of indexes, whose maximum size will be only dictated by the memory address space devoted to a single process by the OS. Under Linux, the limit is at about 80TiB.
Done by @dureuill in #3319, #3331 and #3544.
Experimental feature: monitor Meilisearch usage with Prometheus
This release introduces an experimental feature allowing you to monitor metrics with Prometheus.
When launching Meilisearch, use the following flag:
meilisearch --experimental-enable-metrics
The /metrics
route will be available and compatible with Prometheus.
🗣️ Since this feature is experimental, we need your help to iterate on it! You are more than welcome to share your thoughts and your feedback on this discussion.
Done by @irevoire, @dureuill, and @james-2001 in #3496, #3524, #3538 and #3543.
Improve language support
- Enhance Greek support by normalizing diacritics and final sigma
- Enhance Arabic support by ignoring Tatweel
- Enhance language detection: detection now happens during indexing, reducing erroneous language recognition during search
🇯🇵 For people using Japanese datasets, language detection might still fail on small datasets. For instance, a song dataset that only contains titles in Japanese will still be detected as Chinese.
If you encounter any issue, we recommend you use this prototype which is an alternative version of Meilisearch v1.1 for Japanese users. Please, let us know about any feedback you may have in this dicussion.
Done in #3347, #3569 and on Charabia by @choznerol, @cymruu, @james-2001 and @ManyTheFish.
Other improvements
- Allow wildcards (
*
) at the end of index names when creating API keys or tenant tokens (#3174) @Kerollmops & @akhildevelops - Customize the CSV delimiter (default:
,
) with thecsvDelimiter
parameter in the document addition or update, and document addition or replace endpoints (#3505, #3534) @MixusMinimax and @irevoire - Improve error messages: introduction of "did you mean ...?" suggestions when making typos in a Meilisearch parameter (#3492) @irevoire
- Automatically batch addition and deletion tasks together to speed up indexing (#3470) @irevoire
- Accept
null
as a valid_geo
field when importing or updating documents (#3515) @irevoire - Reduce crate size (from ~200MB to ~50MB) by compressing dictionaries (#3347) @ManyTheFish
- Cache the indexes stats results (#3541) @irevoire
Fixes 🐞
- Improve facet string normalization: fixes issues when using
sortBy
with accented characters (#3372) @ManyTheFish - Fix web interface issues: bump version of search preview to v0.2.7 (#3623) @bidoubiwa
- Unify "Bad latitude" and "Bad longitude" errors (#3479) @cymruu
- Prevent "Cannot allocate memory" errors when creating a lot of indexes (#3331) @dureuill
- Fix Japanese support (see the related issue) thanks to the new language detection (#3347) @ManyTheFish
- Remove
MDB_BAD_VALSIZE
error by avoiding fetching an LMDB value with an empty string (#3577) @Kerollmops - Fix snapshots permissions on Unix system (#3561) @irevoire
- Ensure the task queue is correctly imported (#3597) @irevoire
- Fix facet normalization (#3621) @ManyTheFish
Misc
The following changes do not impact user experience.
- GitHub CIs & test suite
- Create a preview environment for every PR using Uffizzi (#3040 and #3482) @waveywaves
- Improve
publish-aarch64
job that used ubuntu-18.04 (#3568) @curquiza - Add tests with rust nightly in CI (#3495) @ztkmkoo
- Add
--all
to test CI (#3403) @curquiza - Remove cache from test CI to prevent Windows CI failures (#3422) @curquiza
- Pin Rust version in Clippy job (#3451) @curquiza
- Update comments in version bump CI (#3519) @curquiza
- Fix cargo flaky (#3348) @irevoire
- Make clippy happy for Rust 1.67, allow
uninlined_format_args
(#3434) @dureuill
- Internal documentation
- Fixup
dumps-destination
intodump-directory
section header in help link (#3199) @dureuill - Add prototype guide to CONTRIBUTING.md (#3433) @curquiza
- Rework technical information in the README (#3399) @curquiza
- Add image hyperlink to the README.md (#3420) @gregsadetsky
- Update migration link to the docs (#3539) @curquiza
- Fixup
- Internal changes
- Add support for running milli on iOS and macOS when using App Sandbox by activating Cargo feature for LMDB's POSIX semaphores (#3407) @GregoryConrad
- Extract creation and last updated timestamp for v3 dump (#3343) @FrancisMurillo
- Gitignore VScode & Jetbrains IDE folders (#3480) @AymanHamdoun
- Import the milli repository (#3346) @Kerollmops
- Identify builds git tagged with
prototype-...
in CLI and analytics (#3467) @dureuill - Use the workspace inheritance: the Meilisearch version is now present in
Cargo.toml
at the root of the repository (#3499) @irevoire
- Dependencies: bump libgit2-sys and tokio (#3409 and #3456)
❤️ Thanks again to our external contributors:
- Meilisearch: @akhildevelops, @AymanHamdoun, @cymruu, @FrancisMurillom @GregoryConrad, @gregsadetsky, @james-2001, @MixusMinimax, @waveywaves, and @ztkmkoo.
- Charabia: @choznerol, @cymruu, and @james-2001.
v1.1.0-rc.3 🐡
Bug fixes
- Fix facet normalization (#3621) @ManyTheFish
- Update mini-dashboard to version v0.2.7 to fix some issue in the local web interface (#3623) @bidoubiwa