Skip to content

Releases: meilisearch/meilisearch

v1.3.0-rc.0 🦁

03 Jul 13:21
a0df4be
Compare
Choose a tag to compare
v1.3.0-rc.0 🦁 Pre-release
Pre-release

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.

⚠️ Vector size must be the same across all documents in a dataset. If vector sizes are inconsistent, Meilisearch will return an error during document addition.

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.

⚠️ Experimental features may be incompatible between Meilisearch versions.

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.

⚠️ Experimental features may be incompatible between Meilisearch versions.

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.

Done by @dureuill in #3771

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 the proximity ranking rule

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 configure scoreDetails and vectorStore (#3850) @dureuill
  • Reduce deserialization time by using RoaringBitmap::deserialize_unchecked_from (#3788) @Kerollmops
  • Re-enable autobatching for addition and deletion tasks ...
Read more

v1.2.0 🐻‍❄️

05 Jun 08:04
d963b5f
Compare
Choose a tag to compare

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 the attributes, exactness, typo and proximity ranking rules. This happens even if the words ranking rule has been removed or set with a lower priority. Search behavior when using the specified ranking rules before or without words was confusing and hurt relevancy
  • Split words are now also treated as possible digrams. This means the query whit ehorse may match documents containing white 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 for sun flower will now return a document titled Sun Flower before one titled Sunflower
  • 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.

Done by @irevoire in #3693.

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

Fixes 🐞

Misc

❤️ Thanks again to our external contributors:

v1.2.0-rc.4 🐻‍❄️

31 May 08:33
d963b5f
Compare
Choose a tag to compare
Pre-release

Fixes

  • Fixes up the task type of the document deletion by filter that came from prototype phase by @irevoire in #3792

v1.2.0-rc.3 🐻‍❄️

29 May 14:19
0a7817a
Compare
Choose a tag to compare
Pre-release

Fixes

  • Bug fix for a regression introduced in v1.2.0-rc.0: Prevents panic at runtime on search queries that start with a hard separator. @dureuill in #3786

v1.2.0-rc.2 🐻‍❄️

25 May 08:41
087866d
Compare
Choose a tag to compare
Pre-release

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 the invalid_document_filter
    • Introduce a new missing_document_filter instead of returning invalid_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 to null) instead of hiding it if it wasn’t used

v1.2.0-rc.1 🐻‍❄️

17 May 12:44
101f5a2
Compare
Choose a tag to compare
Pre-release

Bug fixes

  • Fix the sort error message: regression seen in v1.1 (#3749 and #3755) @ManyTheFish
  • Fix bugs introduced by the release
    • Compute split words derivations of terms that don't accept typos (#3742) @loiclec
    • Add ngram support to the highlighter (#3741) @loiclec
    • Remove invalid error code when parsing filters (#3759) @irevoire

Improvements

v1.2.0-rc.0 🐻‍❄️

09 May 09:17
4a4210c
Compare
Choose a tag to compare
Pre-release

⚠️ Since this is a release candidate (RC), we do NOT recommend using it in a production environment. Is something not working as expected? We welcome bug reports and feedback about new features.

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 the attributes, exactness, typo and proximity ranking rules. This happens even if the words ranking rule has been removed or set with a lower priority. Search behavior when using the specified ranking rules before or without words was confusing and hurt relevancy
  • Split words are now also treated as possible digrams. This means the query whit ehorse may match documents containing white 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 for sun flower will now return a document titled Sun Flower before one titled Sunflower
  • 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.

Done by @irevoire in #3693.

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

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

❤️ Thanks again to our external contributors:

v1.1.1 🐡

18 Apr 08:03
4b953d6
Compare
Choose a tag to compare

🚨 Replaces v1.1.0. We recommend upgrading from v1.1.0.

⚠️ If you encountered issue #3664, have already tried to download this version and still have the bug, it means your database is corrupted. The only way you can recover your data is to send your documents again in a fresh index. Using a dump will not work, either. We are sorry for the inconvenience.

Bug fixes

❤️ Thanks again to our external contributors:

v1.1.0 🐡

03 Apr 08:09
950f73b
Compare
Choose a tag to compare

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
	  }
	]
}

Done by @dureuill in #3417

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
    }
  }
}

Done by @dureuill in #3423.

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.

⚠️ The experimental feature API can break between Meilisearch versions. Be careful if using it in production.

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 the csvDelimiter 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 🐞

Misc

The following changes do not impact user experience.

❤️ Thanks again to our external contributors:

v1.1.0-rc.3 🐡

30 Mar 09:27
950f73b
Compare
Choose a tag to compare
v1.1.0-rc.3 🐡 Pre-release
Pre-release

Bug fixes