Skip to content

Releases: typesense/typesense

Version 30.2

19 Apr 16:00

Choose a tag to compare

This release fixes some important bugs identified in v30.1.

Bug Fixes

  • [v30.2] Fixed incorrect handling of numeric != filters in both lazy and eager filter execution, including explicit not-equals lists on range-indexed numeric fields.
  • [v30.2] Fixed highlighting to correctly mark single-token phrase matches and to avoid race conditions during union searches that run alongside concurrent writes.
  • [v30.2] Fixed missing synonyms, stem, and stemming_dictionary fields in curation GET responses.
  • [v30.2] Fixed a number of edge cases in diversity search.
  • [v30.2] Fixed union search deduplication so curated pinned hits are no longer collapsed.
  • [v30.2] Fixed a bug related to reference faceting.
  • [v30.2] Fixed vector search behavior so zero-match phrase queries still preserve vector search results.
  • [v30.2] Fixed scoped API key handling so embedded collection parameters can supply a missing collection in multi-search requests.
  • [v30.2] Fixed conversation search error handling so failed searches do not incorrectly reuse the first search collection.
  • [v30.2] Fixed search cache keying so scoped API key parameters and request-specific embedded params do not collide in the cache.
  • [v30.2] Fixed JSON response escaping by using nlohmann::json::dump() when serializing response payloads.
  • [v30.2] Fixed /health responsiveness during heavy bulk inserts by routing health checks to the meta thread pool.
  • [v30.2] Fixed HTTP/2 async import teardown on early exit.

Version 29.1

19 Apr 15:59

Choose a tag to compare

This release fixes some important bugs identified in v29.0.

Bug Fixes

  • [v29.1] Fixed scoped API key handling so embedded collection parameters can supply a missing collection in multi-search requests.
  • [v29.1] Fixed conversation search error handling so failed searches do not incorrectly reuse the first search collection.
  • [v29.1] Fixed search cache keying so scoped API key parameters and request-specific embedded params do not collide in the cache.

Version 30.1

29 Jan 04:01

Choose a tag to compare

Bug fixes

  • [New in 30.1]: This release contains a bug fix that caused the search latency metric in the stats.json endpoint to overflow

Version 30.0

27 Jan 18:02

Choose a tag to compare

This release contains new features, enhancements, performance improvements, bug fixes and important API changes for synonyms, curation rules and analytics rules.

New Features

  • Diversify Search Results: Using Maximum Marginal Relevance (MMR), you can now diversify the top 250 hits on a pre-defined similarity metric. (Docs)
  • Global Synonyms: Synonyms are now top-level resources, and can be shared between collections. (Docs)
  • Global Curation Rules: Curations are also top-level resources now, and can be shared between multiple collections. (Docs)
  • New features in JOINs:
    • facet_by now supports JOINed reference fields. (Docs)
    • Fetch related docs count for a document in a joined collection with the include_fields param. (Docs)
    • Support sorting and limit on joined fields with include_fields parameter. (Docs)
    • Support for altering reference fields in the collection schema.
    • New cascade_delete: false JOIN parameter for a reference field, to override the default behavior of document being cascade deleted in case all the documents it references are deleted.
      Requires async_reference parameter to be true. (Docs)
  • New features in Union Search:
    • Support for group_by with Union search. (Docs)
    • Support for the pinned_hits search parameter in Union search.
    • Support for filtering out duplicates when using Union search with a new flag called remove_duplicates. (Docs)
  • Facet Sampling: Make facet sampling dynamic using the new facet_sample_slope search parameter. (Docs)
  • IPv6 Support: Typesense now supports binding to and serving requests over IPv6 addresses, enabling seamless integration and connectivity in modern IPv6-only or dual-stack networks.

Enhancements

  • Support for (optionally) copying documents when cloning collections. (Docs)
  • Support for ! as a standalone negation operator in filters, allowing field:![value] syntax as an alternative to field:!=[value].
  • Support for Azure OpenAI models in Natural Language Search. (Docs)
  • Support for GCP service account authentication in Natural Language Search models. (Docs)
  • Support for GCP service account authentication for auto-embedding with GCP models. (Docs)
  • Configurable token truncation for string fields to improve exact match filtering on long strings, using the new truncate parameter in the collection schema. (Docs)
  • Return an error message when a field is declared that references another field of the same collection.
  • New group_max_candidates search parameter which overrides the behavior of group_by queries introduced in v29.0 where found value is an approximation. When group_max_candidates is passed, found will be accurate up until its value. (Docs)
  • Allow non-indexed nested fields to still be marked as required.
  • Improved synonym matching logic: Previously, synonym matches with a higher number of tokens (query/synonym) would be ranked higher. Now, matches are ranked by how well they match the query/synonyms overall, not just by the number of matched tokens.
  • Use Transliterator objects pool to enhance tokenization performance of Cyrillic and Chinese languages.
  • Support for dynamic facet_return_parent fields. (Docs)
  • Support for sending an empty array to avoid embedding generation for an optional auto embedding field when indexing a document.
  • Highlight the actual search query when augmenting the search query with Natural Language search.
  • Enhance image embedding models support by adding CLIP Multilingual Model support.
  • Support for synonym matching in curations. (Docs)
  • Support stemming with curations. (Docs)

Bug Fixes

  • Fix parsing of _eval() expressions when backticks are used to wrap strings containing parentheses.
  • Ensure unique analytics IDs are generated when queries differ by filter_by or analytics_tag metadata to prevent aggregation issues.
  • Fix search highlighting to use field-specific token separators instead of collection-level ones for consistent behavior.
  • Return 201 status code when creating conversational models, personalization models, or natural language search models to follow REST conventions.
  • Fix custom OpenAI-compatible endpoint URLs not being used for auto-embedding.
  • Fix schema updates with embedding fields incorrectly requiring api_key validation for local models.
  • Fix console logging to output info messages to stdout and warnings/errors to stderr instead of all to stderr.
  • Fix phrase query highlighting to highlight only exact phrase matches instead of every individual keyword occurrence.
  • Set user agent when initializing HTTP client for external API calls.
  • Fix hyphen handling in negation searches to only apply special treatment when token starts with -.
  • Fix query sub-tokenization to respect field-level symbols_to_index and token_separators configuration.
  • Fix union search pagination bug where global pagination parameters were not passed to individual queries.
  • Fix missing groups in case of high cardinality fields.
  • Fix various deadlock scenarios related to async reference fields.
  • Fix an edge case in group_by query along with infix search.
  • Fix non-deterministic bucketing order when combining group_by with text match score bucketing, ensuring stable group pagination.
  • Support id:![...] negation syntax for id filters.
  • Fix remote embedder cache key handling for matryoshka models with different num_dim values to prevent dimension mismatches.
  • Fix nested array highlights to respect highlight_affix_num_tokens for single-token matches.
  • Fix phrase highlighting in nested array fields to return all matching snippets.
  • Fix a crash while searching when updates are happening in parallel.
  • Fixed the override matching for wildcard queries, dynamic filter, dynamic sort, and placeholders.
  • Fix sort using _eval() for id fields.
  • Fix missing vector distance in results when doing hybrid search with union search.
  • Fix missing results when querying a stemmed field with drop_tokens_threshold set.
  • Fix an edge case where field name can be empty.
  • Fix synonym resolution when synonym_prefix is disabled.
  • Fix allowing the addition of the same field multiple times when altering the collection.
  • Fix an edge case that enables using resolved synonyms as prefixes when prefix search is enabled.
  • Fix adding the field to schema despite an error, when sorting is enabled for a field that has auto as its type.
  • Fix max_bytes parameters usage for the OpenAI's o-series and GPT-5 models.
  • Prevent usage of temperature parameter for the o-series and GPT-5 models since it is not supported.
  • Fix curation rule matching when doing semantic search with embedding generation.
  • Fix rocksdb params assignment
  • Fix missing joined collection fields in pinned hits
  • Fix blocking indexing while generating embeddings.
  • Fix issues of using outdated schemas when altering operations is ongoing while indexing documents.
  • Fix curations with rerank_hybrid_matches
  • Fix uninitialized analytics manager crash
  • Validate that curation rules with match also include query, returning 400 otherwise.
  • Fix dropping nested object fields to only remove dot-delimited children, preserving similarly-prefixed top-level fields.
  • Fix conversation and natural language search model updates when the model ID changes, returning 409 on ID conflicts.

Deprecations / behavior changes

  • Synonyms are no longer nested under Collections. We now have a top-level resource called a "Synonym Set" which is a list of synonyms that can be attached to one or more collections, or can be dynamically sent as a search parameter. Existing synonyms will be auto-migrated to synonym sets automatically on upgrading. (Docs)
  • Overrides (aka Curation Rules) are no longer nested under Collections. Similar to synonym sets, we now have a top-level resource called a "Curation Set" that can be attached to one or more collections, or can be dynamically sent as a search parameter. Existing overrides will be auto-migrated to curation sets automatically on upgrading. The override_tags parameter has also been renamed to curation_tags. [(Docs)](https://typesense.org/docs/30.0/a...
Read more

Version 29.0

30 Jun 03:52
1c58041

Choose a tag to compare

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

New Features

  • Natural Language Search: Typesense can now detect user intent in natural language queries and convert them into structured search queries using LLMs.
    This allows a user query like q: A Honda or BMW with at least 200 hp to be understood and executed by Typesense as filter_by: make:[Honda, BMW] && engine_hp:>=200 automatically. (Docs)
  • Dynamic Sorting in Overrides: Typesense now supports dynamic sorting rules within override definitions, similar to dynamic filtering.
    This enables query-dependent sorting of results through override rules (Docs).
  • Filter multiple properties within a nested array of objects: You can now scope filter expressions to a specific nested object within an array field (Docs).
  • Streaming support for conversations: responses from LLM APIs are now directly streamed, allowing you to build interactive chat experiences. (Docs).
  • Support adding meta fields to query analytics documents: You can now pass the filter_by search parameter and a new analytics_tag search parameter that you can set to any string you need, to be stored with your popular and no-hits queries. This gives you additional context around the search. (Docs).
  • You can now fetch JOIN reference fields in the GET document API (Docs)

Enhancements

  • Improved group-by performance and resource usage, especially when high cardinality fields (like productId) are used for grouping.
  • Improved performance of numeric range queries.
  • Return uniform API response structure when union: true is set, regardless of number of collections queried.
  • Ability to customize RocksDB parameters like write buffer sizes for better performance. (Docs).
  • Support for filtering with nested object fields in overrides.
  • Ability to do image search using user-uploaded images at runtime (Docs).
  • Support for configuring the max group_limit via a new server-side parameter called max-group-limit (Docs).
  • Support caching for remote query embeddings via embedding-cache-num-entries server-side parameter (Docs).
  • Support for sorting when doing a one-to-many JOIN (Docs).
  • Support for bucketing on vector distance (Docs).
  • Improved synonym matching when multiple synonym definitions match a given search query.
  • New Cache hit/miss statistics (cache_hit_count, cache_miss_count, cache_hit_ratio) are now exposed in stats.json
  • Support for Azure OpenAI and Google Gemini in conversation models.
  • Support dimension truncation for GCP text embedding models, by setting num_dim.
  • Add support for Azure OpenAI for embedding generation.
  • Support for document_task and query_task support for GCP text embedding models.
  • Support for OpenAI compatible conversation models using the openai_url (base) and openai_path parameters.
  • The region parameter is now configurable for GCP models for text embedding.

Bug Fixes

  • Fixed a few bugs related to updates of deeply nested field values.
  • Fixed phrase search queries being stemmed.
  • Respect field-level tokenization config in filters.
  • Fixed facet sum being wrong when negative values are added.
  • Fixed vector query parsing with backticks escaping special characters.
  • Improve reliability of joins during imports.
  • Fixed broken cache-num-entries server side parameter.
  • Exclude x-typesense-user-id from cache key to make cache global.
  • Fixed import of large stemming dictionaries.
  • Fixed auth token refreshing problem for GCP-based embedding generation.
  • Fixed vector search not working reliably with 3 sort_by fields.
  • Fixed a bug caused by using flat_search_cutoff along with filtering for vector search.
  • Tweak rank computation for fusion scoring - two keyword search results with same text match score should have the same keyword search rank.
  • Improved reliability of CLIP embeddings under high concurrency.
  • Fixed a bug with collection truncation, requiring unnecessary parameters.
  • Fixed a bug where the alter operations endpoint was returning the incorrect document counter.
  • Fixed a bug where analytics counters only worked with int32 fields.

Deprecations / behavior changes

  • For group_by queries, the found value returned in the response is no longer an exact number. It's an
    approximation of the number of groups found, and is guaranteed to be within 2% of the actual number of groups found.

Upgrading

Before upgrading your existing Typesense cluster to v29.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.
  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/guide/updating-typesense.html#typesense-self-hosted

Downgrading

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

Documentation

View the complete API documentation for this release here: https://typesense.org/docs/29.0/api/

Version 28.0

18 Feb 15:49

Choose a tag to compare

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. (#2051)
  • Dictionary based stemming: stemming is now configurable through an import of a custom dictionary that maps a word to a root form. (#2062)
  • Allow search results to be randomized via sort_by=_rand(seed) clause. (#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. (#1968)
  • Sort hits based on a pivot value. (#2003)
  • Support decay functions in sort_by to support gaussian, linear, and exponential decay of values. (#2036)
  • Field level token_separators and symbols_to_index are now supported. (#2118)
  • Support bucketing of text match scores based on bucket_size parameter. (#2120)
  • Ability to truncate a collection. (#2127)
  • Index and search on geo polygons. (#2150)

Enhancements

  • Support distance_threshold parameter for vector query that uses inner product distance.
  • Allow updating of remote model's api_key parameter. (#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. (#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.
  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/

Version 27.1

27 Sep 23:10

Choose a tag to compare

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.
  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/

Version 27.0

27 Aug 21:47
fe675f4

Choose a tag to compare

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
  • 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
  • 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
  • Support synonyms on query prefixes and typo-corrected query tokens via the synonym_prefix
    and synonym_num_typos 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
  • 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.

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:

{
  "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.
  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/

Version 26.0

01 Apr 22:11

Choose a tag to compare

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
  • Image Search: Search through images using text descriptions of their contents, or perform similarity searches, using the CLIP model.
  • Voice Search: Capture and send query via voice recordings -- Typesense will transcribe (via Whisper model) and provide search results.
  • 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.
  • 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.
  • Analytics:
    • Ability to track queries that don't produce hits. Docs
    • Ability to track counts of document-level analytics (eg: clicks, views, etc) to improve search relevance. Docs
  • 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.
  • 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. 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.
  • 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.

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

Read more

Version 0.25.2

03 Jan 01:39

Choose a tag to compare

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. This particular version requires a specific set of upgrade steps especially for multi-node clusters.
  • For Typesense Cloud, visit your clusters page, 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/