⚠️ 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.
We are proud to announce the first major release of Meilisearch is coming! 🎉
This new release focuses on stabilizing the CLI instead of only introducing new features. We took this opportunity to introduce final breaking changes to the CLI and make the error handler more intuitive. There will be no breaking changes in future versions until the release of v2.0.0. Please refer to our versioning policy for a definition of what we consider to be a breaking change in Meilisearch.
Despite our focus on stabilizing Meilisearch, we also took the time to improve support for Chinese and Korean!
📖 Meilisearch's official documentation will be ready for the official v1.0.0 release. Meanwhile, work-in-progress documentation is available here.
New features and improvements 🔥
Improve language support
- Add support for Korean 🇰🇷
- Improve support for Chinese:
- Normalize Chinese characters into Pinyin
- Disable the HMM (Hidden Markov Model algorithm) feature in Chinese segmentation
- Improve Thai language support
Done by @ManyTheFish, @dureuill, @choznerol, @crudiedo, @daniel-shuy, @harshalkhachane, @mosuka, @qbx2, @Roms1383, @Sokom141, and @yenwel in #3269 and meilisearch/milli#736 and all the Charabia's PRs listed here.
Indexing and search speed improvements
- Significantly improve the memory usage of search requests containing multiple long words (#3269 and meilisearch/milli#708) @loiclec
- Significantly improve the performance of the
exactness
ranking rule for search requests containing many words (#3269 and meilisearch/milli#709) @loiclec - Translate multi-word synonyms into phrases when interpreting a search query. This change improves the relevancy of the results and stabilises the latency of search queries containing many multi-word synonyms, removing a source of denial-of-service attacks. (#3269 and meilisearch/milli#732) @loiclec
- Improve the performance of the
proximity
ranking rule for search requests ending with short words (#3269 and meilisearch/milli#733) @loiclec - Limit the reindexing caused by updating settings when not needed (meilisearch/milli#706 and #3269) @GregoryConrad
Other improvements
- Using a single dump, you can now migrate from any old version of Meilisearch (supporting the dump feature) to the latest version. We hope to facilitate your migration to v1.0.0 to make it as smooth as possible (#3170) @dureuill
- Improve
download-latest.sh
script: integrate apple-silicon binary (#3169) @curquiza - Clarify error message when the DB and engine versions are incompatible (#3279) @dureuill
Breaking changes ⚠️
Since we are releasing v1.0.0, this is the last time we introduce breaking changes until v2.0.0.
New CLI behavior
- As a security measure, Meilisearch will now reject master keys that are less than 16 bytes in production environment (#3274 and #3295) @dureuill
- Remove
--max-index-size
and--max-task-db
configuration options (#3278) @dureuill
These options were not serving their intended purpose of limiting the disk space taken by Meilisearch for the reasons laid out here.
Please reach out if the new limits (described in the previous link) impede your usage. - Remove
--disable-auto-batching
CLI option and the associated environment variableMEILI_DISABLE_AUTO_BATCHING
(#3296) @loiclec
This option was initially introduced as a workaround in case of a bug and is no longer useful since the feature has matured. - Rename dump command from
--dumps-dir
to--dump-dir
(#3175) @dureuill - Remove
--snapshot-interval-sec
.--schedule-snapshot
now accepts an optional integer value specifying the interval in seconds (#3281) @dureuill - The
--log-level
option andMEILI_LOG_LEVEL
environment variable now only accept the following arguments:ERROR
,WARN
,INFO
,DEBUG
,TRACE
andOFF
(#3293) @loiclec - Remove hidden but usable CLI arguments
--nb-max-chunks
and--log-every-n
(#3305) @Kerollmops
Revamp primary key inference
We have improved the primary key inference process when receiving documents for the first time.
If an index's primary key has not been specified, Meilisearch will attempt to infer the primary key by searching for any attributes ending with id
, such as puid
or _id
.
If only one such attribute is detected, it will be designated as the index's primary key.
If multiple attributes ending with id
are detected, Meilisearch will ask you to specify the primary key instead of choosing the first found one.
If no primary key candidates are detected, Meilisearch will throw an error as before.
Done in meilisearch/milli#752 and #3269 by @dureuill
Error handler changes
All detailed task responses contain error
field. When a task fails, it is always accompanied by a JSON-formatted error response that contains an error code
and type
. Many of these code
s and type
s were unclear and have been changed to improve the user experience.
This is a breaking change if you use any of the following code
s or type
s in your code base:
- When calling
POST /indexes/swap-indexes
, some errorcode
s have been changed.Click for details
duplicate_index_found
is renamed toinvalid_swap_duplicate_index_found
- Sending an array of indexes not containing exactly 2
indexUids
for a swap operation object now returnsinvalid_swap_indexes
instead of abad_request
- When calling
GET /indexes
andGET /indexes/:uid
, some errorcode
s have been changed.Click for details
- Incorrect use of the
limit
parameter now returnsinvalid_index_limit
instead ofbad_request
- Incorrect use of the
offset
parameter now returnsinvalid_index_offset
instead ofbad_request
- Incorrect use of the
- When calling
POST /indexes
andPUT /indexes/:uid
, some errorcode
s have been changed.Click for details
- A missing
uid
in the payload will returnmissing_index_uid
instead ofbad_request
- Sending a value with a other type than
string
ornull
forprimaryKey
now returnsinvalid_index_primary_key
instead ofbad_request
- A missing
- When calling
GET /index/:uid/documents
andGET /indexes/:uid/documents/:uid
, some errorcode
s have been changed.Click for details
- Incorrect use of the
fields
parameter now returnsinvalid_document_fields
instead ofbad_request
- Incorrect use of the
limit
parameter now returnsinvalid_document_limit
instead ofbad_request
- Incorrect use of the
offset
parameter now returnsinvalid_document_offset
instead ofbad_request
- Incorrect use of the
- When calling
POST /index/:uid/documents
andPUT /indexes/:uid/documents
Click for details
- Incorrect use of the
primaryKey
parameter now returnsinvalid_index_primary_key
instead ofbad_request
invalid_document_geo_field
has been renamed toinvalid_geo_field
- Incorrect use of the
- When calling
GET /index/:uid/search
andPOST /indexes/:uid/search
, some errorcode
s have been changed.Click for details
- Incorrect use of the
q
parameter now returnsinvalid_search_q
instead ofbad_request
- Incorrect use of the
offset
parameter now returnsinvalid_search_offset
instead ofbad_request
- Incorrect use of the
limit
parameter now returnsinvalid_search_limit
instead ofbad_request
- Incorrect use of the
page
parameter now returnsinvalid_search_page
instead ofbad_request
- Incorrect use of the
hits_per_page
parameter now returnsinvalid_search_hits_per_page
instead ofbad_request
- Incorrect use of the
attributesToRetrieve
parameter now returnsinvalid_search_attributes_to_retrieve
instead ofbad_request
- Incorrect use of the
attributesToCrop
parameter now returnsinvalid_search_attributes_to_crop
instead ofbad_request
- Incorrect use of the
showMatchesPosition
parameter now returnsinvalid_search_show_matches_position
instead ofbad_request
- Incorrect use of the
filter
parameter now returnsinvalid_search_filter
instead ofbad_request
- Incorrect use of the
sort
parameter now returnsinvalid_search_sort
instead ofbad_request
- Incorrect use of the
facets
parameter now returnsinvalid_search_facets
instead ofbad_request
- Incorrect use of the
highlightPreTag
parameter now returnsinvalid_search_highlight_pre_tag
instead ofbad_request
- Incorrect use of the
highlightPostTag
parameter now returnsinvalid_search_highlight_post_tag
instead ofbad_request
- Incorrect use of the
matchingStrategy
parameter now returnsinvalid_search_matching_strategy
instead ofbad_request
- Incorrect use of the
- When calling any
/settings
routes and their sub-routes, some errorcode
s have been changed.Click for details
- Incorrect use of the
displayedAttributes
setting now returnsinvalid_settings_displayed_attributes
instead ofbad_request
- Incorrect use of the
searchableAttributes
setting now returnsinvalid_settings_searchable_attributes
instead ofbad_request
- Incorrect use of the
filterableAttributes
setting now returnsinvalid_settings_filterable_attributes
instead ofbad_request
- Incorrect use of the
sortableAttributes
setting now returnsinvalid_settings_sortable_attributes
instead ofbad_request
- Incorrect use of the
rankingRules
setting now returnsinvalid_settings_ranking_rules
instead ofbad_request
- Incorrect use of the
stopWords
setting now returnsinvalid_settings_stop_words
instead ofbad_request
- Incorrect use of the
synonyms
setting now returnsinvalid_settings_synonyms
instead ofbad_request
- Incorrect use of the
distinctAttribute
setting now returnsinvalid_settings_distinct_attribute
instead ofbad_request
- Incorrect use of the
typoTolerance
setting now returnsinvalid_settings_typo_tolerance
instead ofbad_request
invalid_typo_tolerance_min_word_size_for_typos
is not returned anymore andinvalid_settings_typo_tolerance
is returned instead- Incorrect use of the
faceting
setting now returnsinvalid_settings_faceting
instead ofbad_request
- Incorrect use of the
pagination
setting now returnsinvalid_settings_pagination
instead ofbad_request
- Incorrect use of the
- When calling any
/tasks
routes, some errorcode
s have been changed.Click for details
- Incorrect use of the
offset
parameter now returnsinvalid_search_offset
instead ofbad_request
- Incorrect use of the
limit
parameter now returnsinvalid_search_limit
instead ofbad_request
- Incorrect use of the
uids
parameter now returnsinvalid_task_uids
instead ofinvalid_task_uids_filter
- Incorrect use of the
types
parameter now returnsinvalid_task_types
instead ofinvalid_task_types_filter
- Incorrect use of the
statuses
parameter now returnsinvalid_task_statuses
instead ofinvalid_task_statuses_filter
- Incorrect use of the
cancelBy
parameter now returnsinvalid_task_cancel_by
instead ofinvalid_task_canceled_by_filter
- Incorrect use of the
beforeEnqueuedAt
parameter now returnsinvalid_task_before_enqueued_at
instead ofinvalid_task_date_filter
- Incorrect use of the
afterEnqueuedAt
parameter now returnsinvalid_task_after_enqueued_at
instead ofinvalid_task_date_filter
- Incorrect use of the
beforeStartedAt
parameter now returnsinvalid_task_before_started_at
instead ofinvalid_task_date_filter
- Incorrect use of the
afterStartedAt
parameter now returnsinvalid_task_after_started_at
instead ofinvalid_task_date_filter
- Incorrect use of the
beforeFinishedAt
parameter now returnsinvalid_task_before_finished_at
instead ofinvalid_task_date_filter
- Incorrect use of the
afterFinishedAt
parameter now returnsinvalid_task_after_finished_at
instead ofinvalid_task_date_filter
- Incorrect use of the
- When calling
GET /keys
andGET /keys/:uid
, some errorcode
s have been changed.Click for details
- Incorrect use of the
limit
parameter now returnsinvalid_api_key_limit
instead ofbad_request
- Incorrect use of the
offset
parameter now returnsinvalid_api_key_offset
instead ofbad_request
- Incorrect use of the
- When calling
POST /keys
, some errorcode
s have been changed.Click for details
- If the
actions
field is missing, Meilisearch now returnsmissing_api_key_actions
missing_parameter - If the
indexes
field is missing, Meilisearch now returnsmissing_api_key_indexes
missing_parameter - If the
expiresAt
field is missing, Meilisearch now returnsmissing_api_key_expire_at
missing_parameter
- If the
- When Meilisearch does not have enough space
- the
no_space_left_on_device
code replacesinternal
system
type replacesinternal
- the
- When Meilisearch throws an I/O error
- the
io_error
code replacesinternal
system
type replacesinternal
- the
- When your machines exceeds the maximum number allowed for open files, Meilisearch returns
too_many_open_files
instead ofinternal
as acode
system
instead ofinternal
as atype
Done by @irevoire in #3316 and #3263
Fixes 🐞
- Commit SHA and date are now present in the Meilisearch logs when launching Meilisearch from a Docker image (#3212) @brunoocasali
- Fix
MDB_PAGE_FULL
internal error that would sometimes occur when inserting documents on macOS (#3210) @Kerollmops - Re-introduce the
no_space_left_on_device
error (#3263) @irevoire - Index creation and update dates are now kept when using a dump (#3245) @amab8901
- Fix documentation link when returning errors (#3288) @loiclec
Misc
The following changes do not impact user experience.
- GitHub CIs
- Replace deprecated set-output in GitHub actions (#3015) @funilrys
- Use ubuntu-latest when not impacting (#3183) @curquiza
- Add CI to push a
latest
git tag for every stable Meilisearch release (#3172 and #3207) @curquiza - Add
workflow_dispatch
to flaky.yml (#3041) @curquiza - Add a dispatch to the publish binaries workflow (#3100) @curquiza
- Remove macos-latest and windows-latest usages (#3264) @curquiza
- Add a nightly CI: create a
nightly
Docker tag every day based on the latest commit onmain
(#3229 and #3247) @curquiza - Use ubuntu-18.04 container instead of GitHub hosted actions (#3261) @curquiza
- Test suite
- Re-enable dump tests (#3119) @irevoire
- Re-enable the dump test on the dates (#3188) @irevoire
- Stop snapshotting the version of Meilisearch in the dump test (#3208) @irevoire
- Update insta snap tests for index dates of dump v5 (#3302) @loiclec
- Add a test on finite pagination placeholder search when distinct is enabled (#3251) @ManyTheFish
- Dependencies
- Fix update-cargo-toml-version.yml (#3224) @mohitsaxenaknoldus
- Update CI dependencies (#3179, #3181 and #3180)
- Update some
cargo_toml
dependency (#3128) @colbsmcdolbs - Update mini-dashboard to v0.2.4 (#3186) @mdubus
- Documentation
- Update README to reference Meilisearch Cloud (#3221) @davelarkan
- Replace Slack by Discord in README.md (#3234 and #3276) @tpayet @shivaylamba
- Internal changes
- Implement Uuid codec for heed (#3001) @elbertronnie
- Improve the way we receive the documents payload (#3164 and #3266) @jiangbo212
- Improve clarity of the code that receives payloads (#3236) @Kerollmops
- Extract the dates out of the dumpv4 (#3012 and #3190) @funilrys @irevoire
- Rename meilisearch-http (#3112) @colbsmcdolbs
❤️ Thanks again to our external contributors: