🚀 typesense/typesense - Release Notes

Version 28.0 (2025-02-18)

This release contains important new features, performance improvements and bug fixes.

### New Features

- Support union / merging of search results across collections containing similar type of fields. (https://github.com/typesense/typesense/pull/2051)
- Dictionary based stemming: stemming is now configurable through an import of a custom dictionary that maps a word to a root form. (https://github.com/typesense/typesense/pull/2062) 
- Allow search results to be randomized via `sort_by=_rand(seed)` clause. (https://github.com/typesense/typesense/pull/1918)
- Ability to re-rank hybrid search hits by augmenting their keyword / semantic match score when the 
  hit was identified by only either keyword or vector search. (https://github.com/typesense/typesense/pull/1968)
- Sort hits based on a pivot value. (https://github.com/typesense/typesense/pull/2003) 
- Support decay functions in `sort_by` to support gaussian, linear, and exponential decay of values. (https://github.com/typesense/typesense/pull/2036) 
- Field level `token_separators` and `symbols_to_index` are now supported. (https://github.com/typesense/typesense/pull/2118)
- Support bucketing of text match scores based on `bucket_size` parameter. (https://github.com/typesense/typesense/pull/2120)
- Ability to truncate a collection. (https://github.com/typesense/typesense/pull/2127)
- Index and search on geo polygons. (https://github.com/typesense/typesense/pull/2150)

### Enhancements

- Support `distance_threshold` parameter for vector query that uses inner product distance.
- Allow updating of remote model's `api_key` parameter. (https://github.com/typesense/typesense/pull/1944)
- Support `max_filter_by_candidates` search parameter that controls the number of similar words that Typesense considers during fuzzy search on `filter_by` values (default is `4`).
- Performance and stability fixes for joins.
- API endpoint that returns status of alter schema operations that are in-progress. (https://github.com/typesense/typesense/pull/2123)
- Faceting performance improvements.

### Bug Fixes

- Fixed fields with `async_reference` property not being restored correctly on restart. 
- Fixed sorting with nested reference fields.
- Addressed edge cases in conversation API.
- Assign default sorting score if reference is not found while sorting by a reference field.
- Fix `distance_threshold` in `vector_query` not working correctly while sorting.
- Add validation to ensure that embedding fields are of type `float[]`.
- Fix vector query format validation error messages.
- Fix race condition in high concurrency image embedding.
- Fix `flat_search_cutoff` not working for hybrid search.

### Deprecations / behavior changes

There are no deprecations / behavior changes in this release.

## Upgrading

Before upgrading your existing Typesense cluster to v28.0, please review the behavior
changes above to prepare your application for the upgrade.

We'd recommend testing on your development / staging environments before upgrading. 

### Typesense Cloud

If you're on Typesense Cloud:

1. Go to [https://cloud.typesense.org/clusters](https://cloud.typesense.org/clusters).
2. Click on your cluster
3. Click on "Cluster Configuration" on the left-side pane, and then click on "Modify"
4. Select a new Typesense Server version in the dropdown
5. Schedule a time for the upgrade.

### Self Hosted

If you're self-hosting Typesense, here are instructions on how to upgrade: https://typesense.org/docs/28.0/api/#self-hosted

## Downgrading

Once you upgrade to `v28` of Typesense Server, you can only downgrade back to `v27` or `v26`. 

### Documentation

View the complete API documentation for this release here: [https://typesense.org/docs/28.0/api/](https://typesense.org/docs/28.0/api/)

Version 27.1 (2024-09-27)

This release fixes some bugs and performance regressions identified in `v27.0`.

### Bug Fixes

- **[New in v27.1]** Fixed an important performance regression in evaluation of range filter queries.
- **[New in v27.1]** When infix search does not find highlight, use normal search.
- **[New in v27.1]** Don't return error if `limit_hits` threshold is breached. Instead, just return empty results.
- **[New in v27.1]** Add guard for non-indexed default sorting field.
- **[New in v27.1]** Fix OpenAI error handling during conversation model init.
- **[New in v27.1]** Fixed usage of `distance_threshold` parameter for inner product vector distance.
- **[New in v27.1]** Fixed and improved validation for analytics rules and events.
- **[New in v27.1]** Fixed an edge case with scoped API key usage with joins. 
- **[New in v27.1]** Fixed prefix highlighting bugs that occurred due to use of stemming.
- **[New in v27.1]** Initialize analytics db store only if analytics dir is given. We will create a directory if it does not exist.
- **[New in v27.1]** Fixed exporting regression that prevented embedding fields, joined fields and non-schema fields from being exported.
- **[New in v27.1]** Fixed `geo_distance_meters` returning values in `km` / `mi`.

## Upgrading

Before upgrading your existing Typesense cluster to v27.x, please review the behavior changes above to prepare your application for the upgrade.

We'd recommend testing on your development / staging environments before upgrading. 

### Typesense Cloud

If you're on Typesense Cloud:

1. Go to [https://cloud.typesense.org/clusters](https://cloud.typesense.org/clusters).
2. Click on your cluster
3. Click on "Cluster Configuration" on the left-side pane, and then click on "Modify"
4. Select a new Typesense Server version in the dropdown
5. Schedule a time for the upgrade.

### Self Hosted

If you're self-hosting Typesense, here are instructions on how to upgrade: https://typesense.org/docs/27.1/api/#self-hosted

## Downgrading

Once you upgrade to `v27` of Typesense Server, you can only downgrade back to `v26` or  `v0.25.x`. 

### Documentation

View the complete API documentation for this release here: [https://typesense.org/docs/27.1/api/](https://typesense.org/docs/27.1/api/)

Version 27.0 (2024-08-27)

This release contains important new features, performance improvements and bug fixes.

### New Features

- A new `text_match_type` mode called `sum_score` which sums the field-level text match scores to arrive at a document-level score.
  - This mode is helpful in cases where you need to consider a document with more matches across more weighted fields, to be more relevant.
  - [Docs](https://typesense.org/docs/27.0/api/search.html#ranking-and-sorting-parameters)
- Enable/disable typo tolerance on alphanumeric words in the query via the 
  `enable_typos_for_alpha_numerical_tokens` search parameter. Default: `true`.
  - For eg: If you need to disable typo tolerance for a word that contains a mix of letters and numbers like `turbo100`, you can now set `enable_typos_for_alpha_numerical_tokens: false` as a search parameter.
  - [Docs](https://typesense.org/docs/27.0/api/search.html#typo-tolerance-parameters)
- Conversation History from Conversational Searches is now stored as a regular Typesense collection.
  - This is new feature, also has a corresponding breaking change. See the `Deprecations / behavior changes` section below.
  - [Docs](https://typesense.org/docs/27.0/api/conversational-search-rag.html#create-a-conversation-history-collection)
- Support synonyms on query prefixes and typo-corrected query tokens via the `synonym_prefix` 
  and `synonym_num_typos` parameters. 
  - Defaults to [`synonym_prefix: false`](https://typesense.org/docs/27.0/api/search.html#ranking-and-sorting-parameters) and [`synonym_num_typos: 0`](https://typesense.org/docs/27.0/api/search.html#typo-tolerance-parameters).
- Customization of faceting index used for search via the `facet_strategy` parameter.
  - By default, Typesense picks an efficient `facet_strategy` for you based on some built-heuristics. But this flag now lets you explicitly control which strategy to use: `exhaustive` or `top_values` or `automatic` (default).
  - [Docs](https://typesense.org/docs/27.0/api/search.html#faceting-parameters)
- Support nested reference collections (when using JOINs), in `include_fields` search parameter, Eg: `include_fields: $Collection_B(title, $Collection_A(title))`
- Support `sort_by` of nested join fields. Eg: `sort_by: $Collection_B( $Collection_A(price) )`
- Ability to use JOINs when using the documents export endpoint, with the `filter_by` and `include_fields` parameters. 
- Support exact prefix value filtering via the `:=` operation. For example, given `filter_by: name:= S*`.
  we will match `Steve Jobs` but NOT `Adam Stator`.

### Enhancements

**Search Parameters:**

- Added `enable_synonyms` boolean flag to enable/disable the application of synonyms during search (default: `true`).
- Added `filter_curated_hits` search parameter which allows you to customize filter behavior for pinned hits.
- Added search parameter `enable_analytics` that prevents the given query from being used for analytics aggregation.
- Support array fields in `facet_return_parent` search parameter.
- Allow special characters in range facet labels.
- Increase max length of facet value stored to `255` characters.

**Server-side improvements:**

- Added `--filter-by-max-ops` server-side flag that can customize the maximum number of operators that can be present
  in a `filter_by` clause (default: `100`).
- Added `--max-per-page` server-side flag that increases the number of hits that can be fetched within a single page. Default: `250`.
- Allow dynamic update of cache size via the `/config` API with the `cache-num-entries` key.
- Use 64K page size for Jemalloc on ARM64 / Linux.
- Log in-flight search queries during a crash.

**AI Search:**

- Added API key support for vLLM conversation models using the `api_key` parameter
- Suppress punctuations and non-speech tokens from appearing in voice search (e.g. `hmm`).

**API Endpoints:**

- Support `include_fields` and `exclude_fields` in the single document fetch (`GET /collections/x/documents/id`) end-point.
- `GET /collections` API endpoint now respects the collections allowed in the API key associated with the request.
- Support for `exclude_fields` in the `GET /collections` API end-point. This is useful when you have a lot of fields which bloats the payload.

**Performance:**

- Implemented lazy filtering of numerical fields which speeds up a subset of searches when `enable_lazy_filter` boolean parameter is enabled.
- Improved working memory used when loading large embedding models.

### Bug Fixes

- Fixed a few bugs in the use of conversational search feature on a HA set-up.
- Fixed an edge case in use of `_eval()` along with hybrid search.
- Fixed an edge case in vector query by document ID returning k+1 hits.
- Fixed a bug in the use of `flat_search_cutoff` parameter of vector search that returned suboptimal results.
- Fixed a few bugs and edge cases involving reference fields and joins.
- Fixed wildcard query not excluding un-indexed fields while searching.
- Fixed a crash that occurred while loading collections that's related to indexing a collection not referenced by other collections.
- Fixed an edge case in the sorting clause of `_eval` operation that caused a rare crash.
- Fixed stemming for non-English locales.
- Fixed semantic search faceting happening on the entire result set instead of only on `k` returned docs.
- Fixed geosearch not returning real distances when `precision` parameter was used. 
- Fixed quirks around deletion of analytics event rules.
- Fixed an issue with deletion & update of array reference fields.
- Return `store` field property in collection schema response.
- Fixed a hanging issue when OpenAI API returned no response.
- Fixed persistence of `range_index` and `stem` field properties.
- Fixed highlighting of text stored in fields inside array of objects.
- Fix `_vector_query` parameter in `sort_by` clause being treated as a sorting field.
- Fix overrides not working with semantic search.
- Fixed a regression in v26 that prevented an empty array from being used as a valid value in filter_by clause.
- Fix `return_id` not being returned in import API response during failures.

### Deprecations / behavior changes

**Conversational Search:**

To address some limitations that we found with the previous design of the conversational search feature, 
we now use a Typesense collection for storing the conversation history. 

During upgrade, we will attempt to create a 
default collection with the name `ts_conversation_history_model_id` and migrate existing conversations 
to this collection. 

**However,** given the edge cases we found and have now fixed with the new approach on multi-node Highly Available 
clusters, this automated migration may not work: if it does not, please refer to the guide on how to 
[re-create the conversation model](https://typesense.org/docs/27.0/api/conversational-search-rag.html).

**Exhaustive `total_values` in facet stats**

We refactored the faceting data structures to improve efficiency. This had an impact on how the `total_values` in
`facet_stats` is computed for low-cardinality facet fields: it's now computed only within the
results returned, instead of on the whole dataset. 

To get an accurate `total_values` for the entire dataset, send this additional search parameter:

```json
{
  "facet_strategy": "exhaustive"
}
```

This will force Typesense to compute facets in an exhaustive manner and allows the `total_values` key in the response to be exact.

## Upgrading

Before upgrading your existing Typesense cluster to v27.0, please review the behavior changes above to prepare your application for the upgrade.

We'd recommend testing on your development / staging environments before upgrading. 

### Typesense Cloud

If you're on Typesense Cloud:

1. Go to [https://cloud.typesense.org/clusters](https://cloud.typesense.org/clusters).
2. Click on your cluster
3. Click on "Cluster Configuration" on the left-side pane, and then click on "Modify"
4. Select a new Typesense Server version in the dropdown
5. Schedule a time for the upgrade.

### Self Hosted

If you're self-hosting Typesense, here are instructions on how to upgrade: https://typesense.org/docs/27.0/api/#self-hosted

## Downgrading

Once you upgrade to `v27` of Typesense Server, you can only downgrade back to `v26` or  `v0.25.x`. 

### Documentation

View the complete API documentation for this release here: [https://typesense.org/docs/27.0/api/](https://typesense.org/docs/27.0/api/)

Version 26.0 (2024-04-01)

This release contains important new features, performance improvements and bug fixes.

### New Versioning Scheme

Starting with this release, we're dropping the `0.x.y` versioning scheming and switching to a `x.y` versioning scheme. 

So we're going from `0.25 --> 26.0`.

Typesense has been production-ready for a few years now, and is actively used at scale in production, serving billions of search requests per month just on Typesense Cloud, and several billions more in self-hosted clusters.

We originally intended the `0.x` versioning scheme to communicate that there might be backward in-compatible changes between versions. In reality though, we've only had to do two backward incompatible changes over the years. However, the usage of the previous `0.x` versioning scheme seemed to mis-communicate Typesense's production-readiness among new users, causing confusion.

Switching from `0.x` to `1.x` also seemed to mis-communicate the progress and feature-set maturity we've built over the years.
So we decided to simply drop the `0.` and switch to whole numbers for major versions, to convey Typesense's progress over the last 8 years.

### New Features

- **Built-in Conversational Search (RAG):** You can now seamlessly run a semantic search and then pass the result to an LLM
  for summarizing the result as an answer.
  - Built-in support for OpenAI and Cloudflare Workers AI hosted models.
  - [Docs](https://typesense.org/docs/26.0/api/conversational-search-rag.html)
- **Image Search:** Search through images using text descriptions of their contents, or perform similarity searches, using the CLIP model.
  - [Docs](https://typesense.org/docs/26.0/api/image-search.html)
- **Voice Search:** Capture and send query via voice recordings -- Typesense will transcribe (via Whisper model) and provide search results.
  - [Docs](https://typesense.org/docs/26.0/api/voice-search-query.html)
- **JOINs:** Connect one or more collections via common reference fields and join them during query time. This
  allows you to model SQL-like relationships elegantly.
  - [Docs](https://typesense.org/docs/26.0/api/joins.html)
- **Search Personalization using Historical Queries:** The `vector_query` parameter in Vector Search supports a `qs` parameter (stands for plural of the `q` parameter) that accepts a
  comma-separated list of historical search queries. We compute the average embedding of these queries and use that as the vector for search.
  - [Docs](https://typesense.org/docs/26.0/api/vector-search.html#searching-with-historical-queries) 
- **Analytics:**
  - Ability to track queries that don't produce hits. [Docs](https://typesense.org/docs/26.0/api/analytics-query-suggestions.html#no-hits-queries)
  - Ability to track counts of document-level analytics (eg: clicks, views, etc) to improve search relevance. [Docs](https://typesense.org/docs/26.0/api/analytics-query-suggestions.html#counting-events-for-popularity)
- **Sorting based on Filter Score:** You can now use `_eval` in `sort_by` and assign scores to records that match particular filters, to boost or bury a set of records together.
  the filter expression.
  - [Docs](https://typesense.org/docs/26.0/api/search.html#sorting-based-on-filter-score)
- **Stemming:** Allows handling common word variations of the same root word. This is helpful for different word-forms of the same root word (eg: plurals / singular).
  - Eg: Searching for `walking`, will also return results with `walk`, `walked`, `walks`, etc when stemming is enabled.
  - [Docs](https://typesense.org/docs/26.0/api/collections.html#schema-parameters). See the `stem: true` property under the `fields` parameter.
- **Prefix Filtering:** During filtering, you can now query on records that begin with a given prefix string. 
  - Eg: `company_name: Acm*` will return names that begin with `acm`.
  - Previously, only full-word or full-attribute-value matching was possible in `filter_by` and only `q` supported prefix matches.
- **Stop Words:** Specify a list of common words (e.g.`a`, `am`, `the`, `are`, etc.) that should be excluded from the indexing and search process to improve search relevance and performance.
  - [Docs](https://typesense.org/docs/26.0/api/stopwords.html)
- **Curate / Override by Tags:** You can tag override rules with tags and then trigger curation by referring to the rule
  by the tag name directly at search time.
  - [Docs](https://typesense.org/docs/26.0/api/curation.html#add-tags-to-rules)


### Enhancements

- Collection schema changes only block writes now, and reads will be serviced as usual. Previously both reads and writes were blocked. 
- **Sort facets alphabetically or by the value of another field:** Sort facet values can now be sorted in
  alphabetical order for display via `"facet_by": "phone(sort_by: _alpha:asc)"` or on the value of another field
  via `"facet_by": "recipe.name(sort_by: recipe.calories:asc)"`
- **Fetching parent of faceted field:** When you facet on a nested field like `color.name` you can now set
  `"facet_return_parent": "color.name"`. This will return the parent color object as parent property in the facet response.
- **Improved faceting and filtering performance:** Query planner has been optimized to handle many common patterns better.
- **NOT contains**: Exclude results that contains a specific string during filtering. For example, `"filter_by": "artist:! Jackson"`
  will exclude all documents whose `artist` field value contains the word `jackson`.
- **Excluding IDs via filtering:** The `id` field now support the `:!=` operation, so `"filter_by": "id:!=[id1, id2]"`
  will exclude documents that have an `id` value of `id1` or `id2`.
- **Configurable HNSW Parameters:** `M`, `efConstruction` and `efSearch` have been made configurable.
- **Disable typos for numerical tokens:** Use `enable_typos_for_numerical_tokens: false` parameter to disable typos on numerical.
- **Customize URL for OpenAI embedding API:** This allows you to use other OpenAI compatible APIs.
- **Pagination for collections, synonyms & overrides listing:** These API end-points now support `limit` and `offset` GET parameters.
- **Store custom metadata with collection schema:** While creating a collection you can send a `metadata` object field,
  which is persisted along with collection schema. This is useful for record keeping.
- **Store metadata with override rules:** Store a `metadata` object within an override, so that the search end-point response
  will return the pre-defined metadata associated for that rule. This can can be used to display a message on the front-end.
- **Faster numerical range queries:** You can set `range_index: true` in a field's schema for fast range queries 
  (this will incur additional memory overhead though).
- Prevent the contents of a field from being stored on-disk via the `store: false` field property.
- Expose information about applied typo tolerance or dropped tokens in `text_match_info` response.
- Option to ignore "not found" error when deleting an object that's already deleted.
- Allow a field which is configured as `index: false` + `optional: false`. Previously this was not allowed.
- Exposed swap usage as a metric in `/metrics.json` API.
- The `/health` API returns additional information about memory/disk exhaustion.
- Support overriding wildcard query via `"q": "*"` in rules.
- Build support for Apple M1 / M2 / M3
- Add option to expand prefix search query via the `expand_query` parameter for suggestion aggregation.
- Auto deletion of expired API keys when the `autodelete: true` property is set during key creation.
- Make the size of search cache configurable via the `--cache-num-entries` server flag. Default is `1000`.
- Add flag for logging search query at the start of req cycle.
- Improved on-disk compaction: prunes older records more aggressively, leading to better bounds on data storage.

### Bug Fixes

- Fixed multiple synonym substitutions in query yielding no results.
- Fix `typo_tokens_threshold` not considering the number of grouped hits.
- Fixed odd behavior when `_eval` condition in `sort_by` contained a comma.
- Fixed `object` type auto-creating schema for nested fields even for non-indexed fields.
- Fixed open quote present in search query treated as phrase search.
- Fixed facet by range not working with decimal numbers or with numerical labels or labels that contain spaces.
- Fixed extra new line showing up in the import API response.
- Fixed face range end values being exclusive in nature when it should be inclusive.
- Fixed edge cases in handling unicode in German / Thai locales.
- Fixed facet counts being incorrect when combined with grouping and pinning.
- Fixed highlighting quirks on long documents.
- Fixed inheritance of sort field property for nested fields.
- Fixed propagation of dynamic field properties for child nested fields.
- Fixed some edge cases in phrase search.
- Fixed update doc API returning 200 status code, instead of 201.

### Deprecations / behavior changes

There are no depreciation or behavior changes in this version.

## Upgrading

Before upgrading your existing Typesense cluster to v26.0, please review the behavior changes above to prepare your application for the upgrade.

We'd recommend testing on your development / staging environments before upgrading. 

### Typesense Cloud

If you're on Typesense Cloud:

1. Go to [https://cloud.typesense.org/clusters](https://cloud.typesense.org/clusters).
2. Click on your cluster
3. Click on "Cluster Configuration" on the left-side pane, and then click on "Modify"
4. Select a new Typesense Server version in the dropdown
5. Schedule a time for the upgrade.

### Self Hosted

If you're self-hosting Typesense, here are instructions on how to upgrade: https://typesense.org/docs/26.0/api/#self-hosted

## Downgrading

Once you upgrade to `v26` of Typesense Server, you can only downgrade back to `v0.25.x`. 

### Documentation

View the complete API documentation for this release here: [https://typesense.org/docs/26.0/api/](https://typesense.org/docs/26.0/api/)

Version 0.25.2 (2024-01-03)

This release fixes some important bugs identified in `v0.25.1` and also adds several enhancements to existing features. So we highly recommend upgrading to it. 

## Enhancements

- New search parameter flag `prioritize_num_matching_fields` that allows you to configure whether the text match score should consider number of matching fields as a ranking criteria. This defaults to `true`.
- Unload embedding model and free memory when no collections use a given model.
- Allow the hybrid search / keyword search weight (`alpha`) to be configurable in `vector_query`.
- Allow the direction of drop tokens to be configurable via `drop_tokens_mode` search parameter.
- Handle zero width non-joiner character for Persian.
- Ability to apply vector search only on the results of keyword search.
- Prevent Typesense from loading an embedding model that exceeds available memory.
- Improvements to range faceting: float value support, min/max ranges by leaving range param blank, support spaces in range label.
- Support `remote_embedding_timeout_ms` and `remote_embedding_num_tries` for indexing.
- Better isolation of operations across collections.
- Parameterize compaction of store during collection drop via the `compact_store` parameter.
- Server argument for configuring the periodic DB compaction interval via `db-compaction-interval`. Default: `604800` (seconds).
- When using `group_by`, you can now control if documents with a `null` value in the grouped field should be placed in one group together, or should not be grouped using the `group_missing_values` parameter.

## Bug fixes

- Improve precision of HNSW index under frequent deletion and updates of vectors.
- Fixed a regression in analytics aggregation for aggregation intervals configured to > 60 seconds.
- Fixed a bug that prevented two embedding field names from sharing the same prefix.
- Fixed reindexing of old documents with embeddings on collection schema update.
- Fixed group by search that used facet range query.
- Fixed edge cases in indexing and querying of optional nested fields.
- Fixed hanging when PaLM API is down.
- Fixed an edge case in deletion of values from infix search index.
- Fixed hybrid search not considering `hidden_hits` search parameter.
- Tweaked text embedding mean-pooling code to match the vectors generated by Python libraries.
- Fixed truncation of certain float values in facet response.

### Upgrade

Before upgrading your existing Typesense cluster to `v0.25.2`, please review the behavior changes above to prepare your application for the upgrade.

- For self-hosted Typesense deployment, please refer to the important upgrade section of the [0.25.2 documentation](https://typesense.org/docs/0.25.2/api/#upgrading). This particular version requires a specific set of upgrade steps especially for multi-node clusters. 
- For Typesense Cloud, visit your [clusters page](https://cloud.typesense.org/clusters), click on the cluster you want to upgrade, click on "Cluster Configuration" on the right pane, then "Modify", pick `0.25.2` and schedule a time for your upgrade.

### Downgrade

Once you upgrade to `v0.25.x` of Typesense Server the internal structure of the data directory becomes incompatible with older versions of Typesense (`v0.24`). 

However, if you need to downgrade to `v0.24`, we've released a special version `v0.24.2` that backports these data structure changes back to `v0.24` while keeping other `v0.24.1` features as is.

So `v0.25.x` can only be downgraded to `v0.24.2`.

But `v0.25.2` can be downgraded to `v0.25.1` and `v0.25.0` if needed. 

### Documentation

View the complete API documentation for this release here: [https://typesense.org/docs/0.25.2/api/](https://typesense.org/docs/0.25.2/api/)

Version 0.25.1 (2023-09-11)

This release fixes some important bugs identified in the recently released `v0.25.0`. So we highly recommend upgrading to it. 

## Bug Fixes

- Handle mismatched vector dimensions during indexing
- Allow remote embedders to use multiple per-collection credentials
- Fixed altering of schema involving embedding fields
- Fixed charset in content-type header of export API response
- Fixed an issue in analytics query aggregation that caused crash on empty collections
- Fixed group by on vector search
- Improved error handling of remote embedding APIs
- Fixed tokenizer of embedding models that use XLM-RoBERTa
- Fixed upsert of unchanged docs containing embedding fields, that would cause the embedding field value to be removed
- Fixed text match score calculation to consider the presence of dropped tokens when ranking

### Upgrade

Before upgrading your existing Typesense cluster to `v0.25.1`, please review the behavior changes above to prepare your application for the upgrade.

- For self-hosted Typesense deployment, please refer to the important upgrade section of the [0.25.1 documentation](https://typesense.org/docs/0.25.1/api/#upgrading). This particular version requires a specific set of upgrade steps especially for multi-node clusters. 
- For Typesense Cloud, visit your [clusters page](https://cloud.typesense.org/clusters), click on the cluster you want to upgrade, click on "Cluster Configuration" on the right pane, then "Modify", pick `0.25.1` and schedule a time for your upgrade.

### Downgrade

Once you upgrade to `v0.25` of Typesense Server the internal structure of the data directory becomes incompatible with older versions of Typesense (`v0.24`). 

However, if you need to downgrade to `v0.24`, we've released a special version `v0.24.2` that backports these data structure changes back to `v0.24` while keeping other `v0.24.1` features as is.

So `v0.25` can only be downgraded to `v0.24.2`.

But `v0.25.1` can be downgraded to `v0.25.0`. 

### Documentation

View the complete API documentation for this release here: [https://typesense.org/docs/0.25.1/api/](https://typesense.org/docs/0.25.1/api/)

Version 0.25.0 (2023-08-15)

This release contains exciting new features and important bug fixes.

### New Features

- **Semantic Search:** Search for conceptually related terms in your dataset, even if the exact keyword does not exist in your dataset. 
  - [Demo](https://hn-comments-search.typesense.org) | [Docs](https://typesense.org/docs/0.25.0/api/vector-search.html#semantic-search)
- **Hybrid search:** Combine both keyword and semantic / vector search results in a single query using rank fusion
  - [Demo](https://hn-comments-search.typesense.org) | [Docs](https://typesense.org/docs/0.25.0/api/vector-search.html#hybrid-search)
- **Automatic embedding generation:** specify one or more string fields that should be used for generating embeddings during indexing & during search using
    state-of-the-art embedding models, optionally [using a GPU](https://typesense.org/docs/0.25.0/api/vector-search.html#using-a-gpu-optional). 
  - [Example](https://github.com/typesense/showcase-hn-comments-semantic-search/blob/0a10f2ef34e01e79049e7ba42ae8660e80cf524f/scripts/indexDataInTypesense.js#L32-L45) | [Docs](https://typesense.org/docs/0.25.0/api/vector-search.html#using-built-in-models)
- **Integration with OpenAI API, PaLM API and Vertex AI API:** Have Typesense automatically make API calls to remote embedding services like OpenAI / Google, to generate vectors for the JSON data you index in Typesense. 
  - [Example](https://github.com/typesense/showcase-hn-comments-semantic-search/blob/0a10f2ef34e01e79049e7ba42ae8660e80cf524f/scripts/indexDataInTypesense.js#L49-L67) | [Docs](https://typesense.org/docs/0.25.0/api/vector-search.html#using-openai-api)
- **Query Analytics:** Typesense now supports aggregation of popular search queries which can then be used as insights into query patterns. [Docs](https://typesense.org/docs/0.25.0/api/analytics-query-suggestions.html)
- **Query Suggestions:** You can use historical search terms collected by the Query Analytics feature, to power Query Suggestions.
  - [Docs](https://typesense.org/docs/0.25.0/api/analytics-query-suggestions.html#query-suggestions)
- **Update Documents by Query:** You can now update all documents that match a `filter_by` condition
  - [Docs](https://typesense.org/docs/0.25.0/api/documents.html#update-by-query)
- **Range faceting:** numerical values can be dynamically faceted at query-time by bucketing them into ranges.
  - [Docs](https://typesense.org/docs/0.25.0/api/search.html#faceting-parameters)
- **Pagination using `offset` and `limit`**: This is in addition to the existing `page` and `per_page` mechanism. This new pagination method offers more flexibility and is also useful for GraphQL compatibility.
  - [Docs](https://typesense.org/docs/0.25.0/api/search.html#pagination-parameters)

### Enhancements

- Resolve field names using wildcard: fields can now be resolved in `facet_by`, `query_by`, `include_fields`, `exclude_fields`,
  `highlight_fields` and `highlight_full_fields` when a wildcard expression is used, e.g. `title_*` will match `title_en`.
- Ability to sort grouped hits based on the size of each group, using `sort_by: _group_count:desc`.
- A count is returned for total number of records under each group even if the hits are truncating via `group_limit`.
- The `!=` filtering operation can now be performed against numerical fields. Previously only string fields were supported for this operator.
- Support use of `preset` parameter in embedded API key.
- Support nested dynamic fields. 
- Migrated build system to Bazel.
- New server configuration option (`--reset-peers-on-error`) that makes the cluster forcefully refresh its peers when an
  unrecoverable clustering error happens due to sudden change of peer IPs. There's also an equivalent
  `/operations/reset_peers` API. Be careful while using this option, as it can lead to transient loss of data.

### Bug Fixes

- Fixed updates of nested object field values.
- Fix geopoint indexing in nested fields.
- Fixed some special characters not getting highlighted properly in prefix searches.
- Fixed a bug in phrase matches on array.
- Fixed a socket leak on followers of a cluster when import data fails validation.
- Fixed high memory usage incurred in export/import of large datasets.
- Fixed bad unicode characters in export.
- Fixed errors that were caused by presence of bad Japanese unicode characters in import.
- Fixed broken http/2 support on CURL v8.
- Fixed non-curated members of a group appearing in curated override results.
- Fixed override query rule being case-sensitive.
- Fixed phrase search not considering field weights.

### Deprecations / behavior changes

There are no depreciation or behavior changes in this version.

### Upgrade

Before upgrading your existing Typesense cluster to `v0.25.0`, please review the behavior changes above to prepare your application for the upgrade.

- For self-hosted Typesense deployment, please refer to the important upgrade section of the [0.25.0 documentation](https://typesense.org/docs/0.25.0/api/#upgrading). This particular version requires a specific set of upgrade steps especially for multi-node clusters. 
- For Typesense Cloud, visit your [clusters page](https://cloud.typesense.org/clusters), click on the cluster you want to upgrade, click on "Cluster Configuration" on the right pane, then "Modify", pick `0.25.0` and schedule a time for your upgrade.

### Downgrade

Once you upgrade to `v0.25` of Typesense Server the internal structure of the data directory becomes incompatible with older versions of Typesense. 

However, if you need to downgrade to `v0.24`, we've released a special version `v0.24.2` that backports these data structure changes back to `0.24` while keeping other `0.24.1` features as is.

So `v0.25` can only be downgraded to `v0.24.2`. 

### Documentation

View the complete API documentation for this release here: [https://typesense.org/docs/0.25.0/api/](https://typesense.org/docs/0.25.0/api/)

Version 0.24.1 (2023-04-05)

This release fixes some important bugs identified in the recently released `v0.24.0`. So we recommend updating to it. 

## Bug Fixes

- Improved memory footprint of export API.                          
- Fixed an edge case in deletion of deeply nested fields.           
- Fixed weighting of fields in phrase search.                       
- Handle `NaN` values for geo filter query.                         
- Fixed indexing of nested geopoint array values.                   
- Added validation for vector dimensions during indexing.           
- Fixed highlighting when both flat/nested form of field is present.
- Fixed an edge case with phrase match on array.                    
- Fixed an edge case in fuzzy search typo correction.               
- Allow null values for optional nested fields.                     
- Enabling exhaustive search should automatically drop tokens.      
- Don't remove empty array of object elements for highlight.        
- Restrict the `id` from being a default sorting field.             

## Download

Please download the appropriate binary archive for your operating system and architecture here: https://typesense.org/downloads/

**NOTE:** The new version is also available on [Typesense Cloud](https://cloud.typesense.org/). If you're already using Typesense Cloud, please reach out to us to have your cluster upgraded to `v0.24.1`.

## Upgrade

Before upgrading your existing Typesense cluster to `v0.24.1`, please review the changes above to prepare your application for the upgrade.

- ⚠️ For self-hosted Typesense deployment, please refer to the important upgrade section of the [0.23 documentation](https://typesense.org/docs/0.24.1/api/#upgrading). 
- For Typesense Cloud, email us at `contact@typesense.org` and we can do an in-place upgrade for you.

Version 0.24.0 (2023-01-30)

This release contains new features, performance improvements and important bug fixes.

### New Features

- **Indexing of nested object fields**: feature must be enabled via the `enable_nested_fields` 
  option during collection creation.
- **Cross-field OR and complex filter expressions**: a filter query like 
  `is_premium: true || (price:> 100 && category: shoes)` is now possible.
- **Vector search**: support for both exact & HNSW-based approximate vector searching.
- **Multi-lingual support**: Chinese, Japanese, Korean, Cyrillic and Thai are now supported via the use of field-level 
  `locale` flag in the collection schema.
- **Optional filtering**: `sort_by` clause can now accept an expression whose result is used for sorting, e.g. 
  `sort_by=_eval(brand:nike):desc,_text_match:desc`.
- **Preset search configurations**: manage your search query parameters by storing them within Typesense as a "preset", 
  that you can refer to during query time. This helps in keeping the query parameters hidden away from public view.

### Enhancements

- New `text_match_type` parameter that allows you to customize how multi-field text relevancy score is computed.
- Improve performance of large collection deletions.
- Ability to clone a collection schema (without documents), overrides and synonyms.
- New highlight structure that mimics the original document structure. Nested fields are highlighted only in this new
  structure, which is returned in a key named `highlight` in the JSON response.
- Allow override rules to be processed past the first match via the `stop_processing` flag (default is `true`).
- Support locale and symbols in synonyms via the `locale` and `symbols_to_index` options during synonym creation.
- Allow cloning of collection schema & linked assets (like synonyms, overrides) from a reference collection.
- Support query replacement action in an override via the `replace_query` option.
- Support an override to be active with a given time window via the `effective_from_ts` and `effective_to_ts` options.
- Support `filter_by` rule in overrides.
- New `--skip-writes` flag for starting Typesense in a mode that does not read writes from the Raft log. This is
  useful when the server has crashed due to some recent bad writes that you want to skip over temporarily.
- New `--memory-used-max-percentage` and `--disk-used-max-percentage` flags for preventing writes when a specified 
  memory/disk threshold is breached.
- Allow the imported documents and their `id`s to be returned in the import response via 
  the `return_doc` and `return_id` options.
- API for compacting the on-disk database via the `POST /operations/db/compact` end-point.

### Bug Fixes

- Fixed some edge cases with schema alteration.
- Fixed a race condition in parallel collection creation that manifested on localhost, especially on Mac.
- Fixed an edge case in highlighting involving non-ASCII unicode characters.
- Fixed sort by string not accounting for accented characters.
- Fixed an edge case in numerical facet field values not being fully removed on deletion.
- Fixed HTTPS POST body buffering removing genuine trailing white space in the chunked payload in some cases.
- Fixed float field validation to handle scientific notation.
- Fixed a bug involving exact filter match on array.
- Fixed a few edge cases that showed up in super-large documents that contained greater than 64,000 tokens.
- Implemented automatic log rotation for RocksDB info logs. Previously, one had to restart the server for truncation or 
  perform external truncation via `logrotate`.

### Deprecations / behavior changes

- The default value for `search_cutoff_ms` is now `30000`, i.e. 30 seconds. If you wish to allow searches to run 
  longer than that, you can pass a higher value as a search parameter.
- Disable text match score bucketing, if there are more buckets than the number of results found. Previously, results 
  were being aggregated into a single score.
- The older `highlights` key in the response is deprecated (but is still returned for now). Use the new `highlight` 
  object in the response for highlighting information.
- The `text_match` key in the response is deprecated (but is still returned for now) in favor of the 
  new `text_match_info` object that returns fine grain matching information, including the score.

## Upgrade

Before upgrading your existing Typesense cluster to `v0.24.0`, please review the behavior changes above to prepare your application for the upgrade.

- For self-hosted Typesense deployment, please refer to the important upgrade section of the [0.24.0 documentation](https://typesense.org/docs/0.24.0/api/#upgrading). This particular version requires a specific set of upgrade steps especially for multi-node clusters. 
- For Typesense Cloud, visit your [clusters page](https://cloud.typesense.org/clusters), click on the cluster you want to upgrade, click on "Modify Configuration" on the right pane and schedule a time for your upgrade. Alternatively, you can also email `support@typesense.org`. 

Version 0.23.1 (2022-07-07)

This release contains a few enhancements and bug fixes identified in [v0.23.0](https://github.com/typesense/typesense/releases/tag/v0.23.0) which we thought are important enough to warrant a patch release. If you're using v0.23.0, we recommend upgrading.

### Bug Fixes

- Fixed a potential crash caused by attempting to alter the `id` field.
- Fixed synonym queries not respecting the `prefix` setting.
- Fixed a rare bug present in exact filtering of string arrays.
- Fixed a race condition in slow request logging that led to a crash under high concurrency.
- Better validation of regular expression used in API key collection allow list.
- ARM builds now work on more ARM processors (previously worked only on Graviton instances)

## Enhancements

- Improved filtering performance, upto 5x-10x faster when querying a small subset on large datasets
- Support for `sort_by` parameter in override rule.
- Allow word position in a field value to be used a ranking signal via the `prioritize_token_position` search parameter.
- Improved stability in rotation of geographically distributed clusters having a large dataset.

## Download

Please download the appropriate binary archive for your operating system and architecture here: https://typesense.org/downloads/

**NOTE:** The new version is also available on [Typesense Cloud](https://cloud.typesense.org/). If you're already using Typesense Cloud, please reach out to us to have your cluster upgraded to v0.23.1.

## Upgrade

Before upgrading your existing Typesense cluster to v0.23.1, please review the changes above to prepare your application for the upgrade.

- ⚠️ For self-hosted Typesense deployment, please refer to the important upgrade section of the [0.23 documentation](https://typesense.org/docs/0.23.1/api/#upgrading). 
- For Typesense Cloud, email us at `contact@typesense.org` and we can do an in-place upgrade for you.

Version 0.23.0 (2022-06-04)

This release contains new features, performance improvements and important bug fixes.

### New Features

- Phrase search: wrap keywords in a query with double quotes to search them as a phrase, e.g. `"new york"`.
- Schema changes: we now support fields to be added or dropped from a collection schema in-place.
- Improved multi-field matching: much better performance and accuracy when query keywords have to be matched across
  multiple fields in a document.
- Infix searching: find string within strings, which is useful for entities like model number or email address.
- Allow string fields to be sorted: sorting on string fields can be enabled by setting `sort: true` parameter of the field.

### Enhancements

- Improved update and delete performance of numerical fields by 10x.
- Emplace mode for imports: using the `emplace` action creates a document if it does not exist in a collection 
  or updates it (partially or fully) if it already exists.
- Treat space as typo: search for `basket ball` if `basketball` is not found or vice-versa. You can disable this behavior
  by setting `split_join_tokens: false`.
- Improved Cyrillic support: better highlighting and fuzzy search for fields configured with: 
  `el`, `ru`, `sr`, `uk` and `be` locales.
- ARM compatibility: an ARM build is now published for every release.
- Each multi-search query can have an independent `x-typesense-api-key` key. This is useful to specify different scoped search API keys for each search.
- Control the number of words that Typesense considers for typo and prefix searching via the `max_candidates` parameter.
- CORS can now be enabled for a specific set of domains using the `--cors-domains` flag.
- Search results are now highlighted by prefix, rather than the full world. 
  Previously, searching for "app" will highlight the full word "apple" in the results, but now it will only highlight the "app"le prefix within the word.
- "Remove Matched Tokens" can be used by itself in Overrides. So you can now setup rules like, if query contains "word", remove "word" from the search query.
- Ability to toggle if filters should by applied to overrides or not using the `filter_curated_hits` flag.
- Ability to hide `out_of` and `search_time_ms` from the search API response, using the `exclude_fields` parameter.
- Ability to control typo tolerance for facet queries using `facet_query_num_typos`.
- Ability to specify which subnet to use for peering using `--peering-subnet` server parameter.

### Bug Fixes

- Fixed exact match of synonym query candidates not being ranked correctly.
- Fix glibc incompatibility on recent Linux distros (Ubuntu 21.04+). [#531](https://github.com/typesense/typesense/issues/531)
- Fixed the `snippet` containing the full field value when `highlight_full_fields` is enabled.
- Fixed `--enable-cors=true` flag format not working. Earlier, only the `--enable-cors` format worked.
- Fixed exact match for repeated words (when searching for repeated words such as "Boom Boom"). [#427](https://github.com/typesense/typesense/issues/427)
- Fixed `highlight_fields` parameter not respecting `include_fields`. [#556](https://github.com/typesense/typesense/issues/556)
- Fixed document ids that are accepted with space char (%20) but cannot be deleted later. [#574](https://github.com/typesense/typesense/issues/574)
- Improved highlighting of text containing punctuations. [#528](https://github.com/typesense/typesense/issues/528)
- Fixed case sensitivity of facet fields. [#504](https://github.com/typesense/typesense/issues/504)

### Deprecations / behavior changes

- In prefix queries, only the prefix part of a word in the result is highlighted now, instead of the whole word. 
  For e.g. given a query like "new y", the result will be highlighted as `New York City`.

## Download

Please download the appropriate binary archive for your operating system and architecture here: https://typesense.org/downloads/

**NOTE:** The new version is also available on [Typesense Cloud](https://cloud.typesense.org/). If you're already using Typesense Cloud, please reach out to us to have your cluster upgraded to v0.23.0.

## Upgrade

Before upgrading your existing Typesense cluster to v0.23.0, please review the behavior changes above to prepare your application for the upgrade.

- For self-hosted Typesense deployment, please refer to the important upgrade section of the [0.23.0 documentation](https://typesense.org/docs/0.23.0/api/#upgrading). This particular version requires a specific set of upgrade steps especially for multi-node clusters. 
- For Typesense Cloud, visit your [clusters page](https://cloud.typesense.org/clusters), click on the cluster you want to upgrade, click on "Modify Configuration" on the right pane and schedule a time for your upgrade. Alternatively, you can also email `support@typesense.org`. 

Version 0.22.2 (2022-02-04)

This release contains a couple of bug fixes identified in [`v0.22.1`](https://github.com/typesense/typesense/releases/tag/v0.22.1) which we thought are important enough to warrant a patch release. If you're using `v0.22.1`, we recommend upgrading.

### Bug Fixes

- Handle bad geo polygon vertices (e.g. duplicate points).
- Fixed an edge case in ranking of words that share a prefix during prefix search.
- Better validation + handling of unexpected data errors during indexing.
- Fixed a rare but critical bug that manifested during document updates that had performance implications.

## Download

Please download the appropriate binary archive for your operating system and architecture here: https://typesense.org/downloads/

**NOTE:** The new version is also available on [Typesense Cloud](https://cloud.typesense.org/). If you're already using Typesense Cloud, please reach out to us to have your cluster upgraded to v0.22.2.

## Upgrade

Before upgrading your existing Typesense cluster to v0.22, please review the behavior changes above to prepare your application for the upgrade.

- ⚠️ For self-hosted Typesense deployment, please refer to the important upgrade section of the [0.22 documentation](https://typesense.org/docs/0.22.2/api/#upgrading). 
- For Typesense Cloud, email us at `contact@typesense.org` and we can do an in-place upgrade for you.

Version 0.22.1 (2021-12-11)

This release contains a couple of bug fixes identified in [`v0.22.0`](https://github.com/typesense/typesense/releases/tag/v0.22.0) which we thought are important enough to warrant a patch release. If you're using `v0.22.0`, we recommend upgrading.

### Bug Fixes

- Fixed an edge case in exporting of documents using a `filter_by` condition: documents were being duplicated.
- Allow a document to contain a dict/hashmap field when a wildcard auto (`.*`) field is present in the collection schema.

## Download

Please download the appropriate binary archive for your operating system and architecture here: https://typesense.org/downloads/

**NOTE:** The new version is also available on [Typesense Cloud](https://cloud.typesense.org/). If you're already using Typesense Cloud, please reach out to us to have your cluster upgraded to v0.22.1.

## Upgrade

Before upgrading your existing Typesense cluster to v0.22, please review the behavior changes above to prepare your application for the upgrade.

- ⚠️ For self-hosted Typesense deployment, please refer to the important upgrade section of the [0.22 documentation](https://typesense.org/docs/0.22.1/api/#upgrading). 
- For Typesense Cloud, email us at `contact@typesense.org` and we can do an in-place upgrade for you.

Version 0.22.0 (2021-12-08)

This release contains new features, performance improvements and important bug fixes.

### New Features

- Customizable word separators: define a list of special characters via the `token_separators` configuration 
  during schema creation. These characters are then used as word separators, _in addition_ to space and new-line characters. 
- Index and search special characters: define a list of special characters that will be indexed as text via the 
  `symbols_to_index` configuration during schema creation.
- Dynamic filtering based on rules: overrides now support a `filter_by` clause that can apply filters dynamically to query rules defined in the override.
- Server side caching: cache search requests for a configurable amount of time to improve perceived latencies on heavy queries. Refer to the `use_cache` and `cache_ttl` parameters. By default, caching is disabled.
- Protection against expensive queries via the use of `search_cutoff_ms` parameter that attempts to return results early when the cutoff time has elapsed. This is not a strict guarantee and facet computation is not bound by this parameter.
- Added `geo_precision` sorting option to geo fields. This will bucket geo points into "groups" determined by the given precision value, such that points that fall within the same group are treated as equal, and the next sorting field can be considered for ranking.

### Enhancements

- Reduced memory consumption: 20-30% depending on the shape of your data.
- Improved update performance: updates on string fields are now 5-6x faster.
- Improved search performance: 20-25% faster on a variety of datasets we tested on. 
- Improved parallelization for multi-collection writes: collections are now indexed independently, making indexing much faster when you are writing to hundreds of collections at the same time.
- Allow exhaustive searching via the `exhaustive_search` parameter. Setting `?exhaustive_search=true` will make Typesense consider _all_ prefixes and typo corrections of the words in the query without stopping early when enough results are found (`drop_tokens_threshold` and `typo_tokens_threshold` configurations are ignored).
- Exact filtering on strings (using the `:=` operator) no longer requires the field to be defined as a facet.
- Make minimum word length for 1-char typo and 2-char typos configurable via `min_len_1typo` and `min_len_2typo` parameters. Defaults are 4 and 7 respectively.
- Support filtering by document `id` in filter_by query.
- Support API key permission for creating a specific collection: previously, there was no way to generate an API key that allows you to create a collection with a specific name.
- Allow use of type `auto` for a field whose name does not contain a regular expression.
- Geosearch polygon filter automatically sorts the geo points for the polygon in the correct order: so you don't have to define them in counter clockwise order anymore.

### Bug Fixes

- Fixed edge cases in import of large documents where sometimes, imports hanged mysteriously or ended prematurely.
- Fixed document with duplicate IDs within an import upsert batch being imported as two separate documents.
- Fixed fields with names that contain a regular expression acting as an `auto` type instead of respecting the schema type.
- Fixed a few edge cases in multi-field searching, especially around field weighting and boosting.
- Fixed deletion of collections with slashes or spaces in their names not working: you can now URL encode the names while calling the API.

### Deprecations / behavior changes

- Once you upgrade your Typesense server to `v0.22`, the data directory cannot be used with
  `v0.21.0` binary again. So, please take a snapshot/backup of the data directory before upgrading. See important upgrade instructions below.
- The `drop_tokens_threshold` and `typo_tokens_threshold` now default to a value of `1`. 
  If you were relying on the earlier defaults (`10` and `100` respectively), please set these parameters explicitly.
- Minimum word length for 1-char typo correction has been increased to 4. 
  Likewise, minimum length for 2-char typo has been increased to 7. This has helped to reduce false fuzzy matches.
  You can use the `min_len_1typo` and `min_len_2typo` parameters to customize these default values.

## Download

Please download the appropriate binary archive for your operating system and architecture here: https://typesense.org/downloads/

**NOTE:** The new version is also available on [Typesense Cloud](https://cloud.typesense.org/). If you're already using Typesense Cloud, please reach out to us to have your cluster upgraded to v0.22.0.

## Upgrade

Before upgrading your existing Typesense cluster to v0.22, please review the behavior changes above to prepare your application for the upgrade.

- For self-hosted Typesense deployment, please refer to the important upgrade section of the [0.22 documentation](https://typesense.org/docs/0.22.0/api/#upgrading). This particular version requires a specific set of upgrade steps especially for multi-node clusters. 
- For Typesense Cloud, email us at `contact@typesense.org` and we can do an in-place upgrade for you.

Version 0.21.0 (2021-07-14)

This release contains new features, performance improvements and important bug fixes.

## New Features

- Geosearch: Use the geopoint data type to index locations, filter and sort on them. We support filtering on records within a given radius and as well as within any arbitrarily defined geo polygon.
- Wrap literal strings in filter_by values using backticks to ensure that the commas in filter values don't get parsed as a list separator. Example: ```filter_by: primary_artist_name:=[`Apple, Inc.`]```
- Support exclude / not equals operator for filtering string and boolean facets. Example: ```filter_by=author:!= JK Rowling```
- Ability to turn off prefix search on a per field basis. For example, if you are querying 3 fields and want to enable prefix searching only on the first field, use `?prefix=true,false,false`. The order should match the order in `query_by`.
- Ability to turn off typo tolerance on a per field basis. For example, if you are querying 3 fields and want to disable typo tolerance on the first field, use `?num_typos=0,2,2`. The order should match the order in `query_by`.
- You can now highlight fields that you don't query for. Use ?highlight_fields=title to specify a custom list of fields that should be highlighted.
- Add `filter_by`, `include_fields` and `exclude_fields` options to documents/export endpoint.

## Enhancements

- Increased maximum supported length of HTTP query string to 4K characters: if you wish to send larger payloads, use the multi-search end-point.
- Accept null values for optional fields.
- Support for indexing pre-segmented text: you can now index content from any logographic language into Typesense if you are able to segment / split the text into space-separated words yourself before indexing and querying. You should also set `?pre_segmented_query=true` during searching.
- If you have some overrides defined but want to disable all of them during query time, you can now do that by setting `?enable_overrides=false.`

## Bug Fixes

- Fixed some edge cases with typo correction not finding the correct matches
- Ensure that exact matches are ranked above others. Set `?prioritize_exact_match=false` to disable this behavior.
- Fixed `collections:*` API key permission which was not previously being recognized by the authentication engine.
- Fixed float facets being displayed with imprecise precision when displayed as string.

## Deprecations

- There is a change in the upsert behavior to conform to existing popular conventions: The upsert action now requires the whole document to be sent for indexing. If you wish to update part of a document, use the update action.

## Download

Please download the appropriate binary archive for your operating system and architecture here: https://typesense.org/downloads/

**NOTE:** The new version is also available on [Typesense Cloud](https://cloud.typesense.org/). If you're already using Typesense Cloud, please reach out to us to have your cluster upgraded to v0.21.0.

## Upgrade

- For self-hosted Typesense deployment, please replace the binary and restart the Typesense process. 
- For Typesense Cloud, email us at `contact@typesense.org` and we can do an in-place upgrade for you.

Version 0.20.0 (2021-04-29)

This release contains new features, significant performance improvements and important bug fixes.

## New Features

- Auto schema detection: you can now index documents without a pre-defined schema
- Data validation during indexing: configure Typesense to coerce, reject or drop bad values
- Concurrency improvements: utilize all CPU cores and scale to hundreds of thousands of collections

## Enhancements

- Default sorting field is now optional: when not present, text match score and insertion order are used
- Allow custom key value to be provided [during creation of API keys](https://github.com/typesense/typesense/issues/244)
- Faster parallel loading of collections on cold start
- Ensure that all queried fields are highlighted in search response
- Reduction in memory consumption of facet fields
- Validate SSL certificate and key before loading SSL certs from disk

## Bug Fixes

- Fixed exact matches [ranking below matches with typos](https://github.com/typesense/typesense/issues/243)
- Fixed a bug in [filtering of string fields](https://github.com/typesense/typesense/issues/254)
- Fixed an edge case involving [scoped API keys and embedded filters](https://github.com/typesense/typesense/issues/263) working with multi-search end-point
- Fixed an edge case involving filtering on negative integers
- Fixed an issue related to [range filter](https://github.com/typesense/typesense/issues/210)
- Fixed a crash while parsing certain rare + long query string parameters
- Fixed collection with [`null` value crashing Typesense](https://github.com/typesense/typesense/issues/251)
- Fixed a crash when a snapshot was taken on an empty DB but right after a key is created

## Deprecations

- The `catch-up-min-sequence-diff` and `catch-up-threshold-percentage` flags that are used for determining the
  catch up status of a follower, are replaced with `healthy-read-lag` and `healthy-write-lag`
  [flags](./guide/configure-typesense.md#using-command-line-arguments).

## Download

Please download the appropriate binary archive for your operating system and architecture here: https://typesense.org/downloads/

**NOTE:** The new version is also available on [Typesense Cloud](https://cloud.typesense.org/). If you're already using Typesense Cloud, please reach out to us to have your cluster upgraded to v0.20.

Version 0.19.0 (2021-02-16)

This release contains new features, significant performance improvements and important bug fixes.

## New Features

- Ability to send multiple search requests in a single HTTP request
- Ability to limit total number of results that can be fetched using the `limit_hits` search parameter
- Support for slow request logs
- Support numerical range operator in `filter_by` `field:[min..max]`

## Enhancements
- Improved `filter_by` & `facet_by` performance during searches, improves performance as much as 60% in some datasets.
- Detailed stack traces with additional symbols and line numbers
- Keep existing config files in place when updating RPM package
- `/operations/snapshot` endpoint no longer blocks write operations

## Bug Fixes

- Improved facet query validation
- Improved override validation
- Fixed a crash when import requests are aborted
- Fixed a crash when integer filter values are used for creating scoped api keys

## Deprecations

- The `max_hits` search parameter is deprecated and is no longer necessary.

## Download

- Please download the appropriate binary archive for your operating system and architecture here: https://typesense.org/downloads/
- The new version is also available on Typesense Cloud: https://cloud.typesense.org/


Version 0.18.0 (2020-12-29)

This release contains several new features and important bug fixes.

### New Features

- **[Feature]** Support for query synonyms.
- **[Feature]** Ability to assign custom weights to each field being queried upon.
- **[Feature]** Total documents in a collection is now returned in every response via the `out_of` key.
- **[Feature]** Exclusion operator `-` for excluding individual query tokens from results.
- **[Feature]** Vote API for triggering rotation of leader in a multi-node cluster.
- **[Feature]** On-demand snapshot API: allows you to create a backup with a single API call.
- **[Feature]** Support for expiration of API keys
- **[Feature]** Support regex for defining allowed collection names of an API key.
- **[Feature]** Support operators in multi-valued numerical filter.

### Improvements

- **[Performance]** Faster snapshot transfer and copy in multi-regional clusters.
- **[Performance]** Speed up filters on numerical fields.
- **[Feature]** Better search relevance when searching across multiple fields: addressed some edge cases in multi-field queries.
- **[Feature]** Support bulk imports of upto 3 GB in a single POST API call.

### Bug fixes

- **[Bug fix]** Fixed an edge case in fuzzy search that missed some tokens during exact searches.
- **[Bug fix]** Prefix matches are assigned lesser importance than exact matches.
- **[Bug fix]** Debug end-point is now available even when node is not ready to serve searches.
- **[Bug fix]** Fixed >= operator not working well with negative values.
- **[Bug fix]** Fixed non-ascii characters not encoded properly in highlight snippet.
- **[Bug fix]** Fixed issue where duplicate results were returned across pages.
- **[Bug fix]** Fixed issue with pinned results being duplicated.

### Download

- Please download the appropriate binary archive for your operating system and architecture here: https://typesense.org/downloads/
- The new version is also available on Typesense Cloud: https://cloud.typesense.org/

Version 0.17.0 (2020-11-17)

This release contains a few new features and important bug fixes.

[Feature] Matched tokens are returned in the highlight response structure.
[Feature] Customization of the start and end HTML tags used for highlighting (default being the mark tag).
[Feature] Delete documents that match a filter query.
[Feature] Tokenizer now splits text on new line characters, in addition to space.
[Bug fix] Fixed a bug that prevented single document updates from being available on the Raft log.
[Bug fix] Validate data types of the fields of a collection schema during collection creation.
[Bug fix] Ignore invalid unicode characters when returning search response. Earlier, this was causing a crash in some rare cases.
[Bug fix] Allow the colon character (:) to be present in the filter query value.

Please download the appropriate binary archive for your operating system and architecture:
https://typesense.org/downloads/

Version 0.16.1 (2020-11-07)

This is a maintenance release to fix an issue we identified with the updates feature.

**[Bug fix]** Updates to string array fields were causing a crash during faceting.

Please download the appropriate binary archive for your operating system and architecture:
https://typesense.org/downloads/

Version 0.16.0 (2020-10-25)

The primary focus of this release is to provide update support for documents.

[Feature] Support partial updates or upserts of documents.
[Feature] Parameterize the number of tokens that surround a highlight via the new `highlight_affix_num_tokens` parameter.
[Bug fix] When a document is not imported due to an error, the full document was not always being returned in the import response. This has been addressed in this release.

Please download the appropriate binary archive for your operating system and architecture:
https://typesense.org/downloads/

Version 0.15.0 (2020-09-19)

This release contains several new features, bug fixes and performance improvements.

[Performance] Adopted jemalloc: we're now using jemalloc as the memory allocator. In our tests, jemalloc showed significantly better performance and lower memory fragmentation.
[Performance] Streaming import: You can now safely import large number of documents into Typesense without a drastic impact on search latency. We've also changed the output format of the import end-point: the response will now be in JSON lines rather than as a full-fledged JSON document.
[Performance] Significant performance improvement in wildcard queries and faceting involving array fields.
[Feature] Allow default sorting field to be an int64.
[Feature] Ensured that the server returns a 503 response when it is still catching up on the writes from the leader. This threshold can be controlled by the --catch-up-threshold-percentage argument (default: 95).
[Feature] Data snapshot interval can now be customized by the --snapshot-interval-seconds argument (default: 3600).
[Feature] Metrics API: we've added a /metrics.json end-point that returns CPU, storage and memory metrics.
[Feature] Exact filtering on string field: It's now possible to match a facet-enabled string field exactly in the filter query by using the := operator.
[Bug fix] Clustering improvements: We've fixed a number of performance issues and edge cases by extensively benchmarking the clustering implementation via multi-region deployments.
[Bug fix] Fixed a race condition that sometimes prevented a Typesense node from recognizing custom generated API keys.
[Bug fix] Fixed an edge case in text match score calculation that caused relevancy issues on long queries.
[Bug fix] Fixed a crash that happened when an int32 field was filtered by a number exceeding the range of a valid int32 value.

Please download the appropriate binary archive for your operating system and architecture:
https://typesense.org/downloads/

Version 0.14.0 (2020-07-04)

In this release, we announce support for grouping documents on one or more fields. There are also a number of bug fixes.

[Feature] Group by: documents can now be grouped on one or more fields. You can also limit each group to the top K hits within the documents matching that group.
[Bug fix] Fixed an edge case in filtering of documents by int64 field.
[Bug fix] Allow float array field to accept integer values (i.e. whole numbers).
[Bug fix] Deletion of records with optional fields.
[Bug fix] Collection schema API response should contain the optional attribute of fields in the schema.

Please download the appropriate binary archive for your operating system and architecture:
https://typesense.org/downloads/

Version 0.13.0 (2020-06-01)

In this release, we announce the support for API key management.

- [Feature] API key management. You can generate API keys with fine-grained access control restrictions for better security.
- [Deprecation] Command line `--search-only-key` option is removed. Please use the key generation API to generate a key with search-only permission.
- [Deprecation] The `max_hits` search query parameter is removed. Please use the per_page parameter as a replacement.

Please download the appropriate binary archive for your operating system and architecture:
https://typesense.org/downloads/

Version 0.12.0 (2020-05-24)

This is a major release packed with multiple new features and a few bug fixes.

- [Feature] Raft-based clustering for high write+read availability. We also deprecate the read-only replication feature supported via the --master argument.
- [Feature] Ability to Curate / Merchandize search results is now available in the open source version, via the Overrides feature.
- [Feature] Ability to pin or hide specific documents during query time
- [Feature] Ability to create Aliases for collections is now available in the open source version.
- [Feature] Allow the maximum number of results returned to be configurable via the max_hits parameter. Previously only the top 500 results were returned.
- [Feature] Facet search: facet values that are returned can now be filtered via the facet_query parameter. The matching facet text is also highlighted.
- [Feature] Allow integer and float values to be facetable.
- [Feature] Facet stats such as min/max/avg are computed for numerical facet fields.
- [Feature] Allow fields to be marked as optional in the schema.
- [Feature] Expose typo_tokens_threshold parameter: If the number of results found for a specific query is less than this number, Typesense will attempt to look for tokens with more typos until enough results are found. Previously, this was hard-coded to 100.
- [Feature] The underlying string similarity score is exposed as _text_match and can be used as a sorting field parameter.
- [Security] Enforce API key authentication always for search end-point. Previously, search endpoint was open unless a search-only API key was explicitly defined.
- [Bug] Ensure that float fields defined as a sorting field accepted integer values.
- [Bug] Fixed an edge case that resulted in incomplete deletion of string array values when a document is deleted.
- [Others] Adopted GPL v3 license.

Please download the appropriate binary archive for your operating system and architecture:
https://typesense.org/downloads/

Version 0.11.2 (2020-02-03)

This is a maintenance release with bug fixes.

## Bug fixes

- Ensure that default sorting field exists in schema during collection creation.
- Fixed the environment variable examples mentioned in the commandline help text.
- Ensure that the `hits` and `found` JSON fields were always returned in response, even if the query produced no results.

## Downloads

Please download the appropriate binary archive for your operating system and architecture:
https://typesense.org/downloads/

Docker:
`docker pull typesense/typesense:0.11.2`

Version 0.11.0 (2019-11-03)

This is a maintenance release with some important bug fixes.

## Maintenance changes

- DEB and RPM packages are now available: https://typesense.org/downloads/
- OpenSSL upgrade.

## Bug fixes

- Fixed an edge case in indexing of non-ASCII characters.
- Fixed an edge case in replication.

## Downloads

Please download the appropriate binary archive for your operating system and architecture:
https://typesense.org/downloads/

Docker:
`docker pull typesense/typesense:0.11.0`

Version 0.10.1 (2019-07-09)

This release contains one new feature and a couple of bug fixes.

## New feature

- You can control the maximum number of facet values returned in the search results via the `max_facet_values` parameter of the search end-point.

## Bug fixes

- Fix long queries causing highlighter to misbehave and sometimes crash.
- Fix facet counts not showing up in wildcard searches.

## Downloads

Please download the appropriate binary archive for your operating system and architecture.

Linux(64-bit):
https://dl.typesense.org/releases/typesense-server-0.10.1-linux-amd64.tar.gz

Mac OS X (64-bit):
https://dl.typesense.org/releases/typesense-server-0.10.1-darwin-amd64.tar.gz

Docker:
`docker pull typesense/typesense:0.10.1`

Version 0.10.0 (2019-06-02)

This release contains new features, bug fixes and performance improvements.

## New features

- **Importing documents:** added a `/collections/:collection/documents/import` endpoint to which you can POST documents for import.
- **Load configuration from environment variables or config file:** Arguments to the Typesense server can now be passed via environment variables or through a configuration file.

## Bug fixes

- **Filter on facet fields:** When a facet field is filtered upon, search should be verbatim.
- **Improve memory and disk consistency:** Fixed edge cases when in-memory index could potentially go out of sync with on-disk storage (rarely).

## Performance

- **Faster collection initialization:** Server initialization time has been significantly reduced for large collections.

## Downloads

Please download the appropriate binary archive for your operating system and architecture.

Linux(64-bit):
https://dl.typesense.org/releases/typesense-server-0.10.0-linux-amd64.tar.gz

Mac OS X (64-bit):
https://dl.typesense.org/releases/typesense-server-0.10.0-darwin-amd64.tar.gz

Docker:
`docker pull typesense/typesense:0.10.0`

Version 0.9.2 (2018-09-08)

This is largely a maintenance release with some minor feature additions:

## New features

- **Health check:** added a `/health` health check endpoint that return `200` status code when the service is up.
- **Latin character substituition:** latin characters are "normalized" to their ASCII equivalent. For e.g `ß` is substituted with `ss`. 
- **Collection creation timestamp:** the collection summary data now includes the `created_at` UNIX timestamp (second since epoch). 

## Bug fixes

- Fixed a concurrency related issue with the replication
- Fixed wrong datetime appearing in log files on Linux

## Downloads

Please download the appropriate binary archive for your operating system and architecture.

Linux(64-bit):
https://dl.typesense.org/releases/typesense-server-0.9.2-linux-amd64.tar.gz

Mac OS X (64-bit):
https://dl.typesense.org/releases/typesense-server-0.9.2-darwin-amd64.tar.gz

Docker:
`docker pull typesense/typesense:0.9.2`