Manticore Search 28.4.4 has been released. This release brings faster KNN rescoring, more flexible conversational search, a simpler install and upgrade path, better faceting controls, per-table relevance defaults, and fixes across authentication, replication, SQL compatibility, distributed queries, and columnar/KNN internals.
This post is a catch-up for everything shipped from 27.2.0 through 28.4.4.
Upgrade Notes
Please review these before upgrading:
- 28.0.0 bumps the plugin ABI version
SPH_UDF_VERSIONto 12. External UDF, ranker, and token-filter plugin binaries must be rebuilt before loading them into this version. The change lets token-filter plugins receive longdict=keywords_32ktokens instead of silently bypassing values above the old 126-byte plugin limit. Existing table data and configuration remain compatible, and no index migration is required. Downgrade is possible if you also restore plugin binaries built for the older ABI and do not rely on the new long-token plugin behavior. (Issue #4667 , PR #4668 ) - If authentication is enabled, prioritize the 28.4.x update. 28.4.2 fixes an authentication/authorization permission-check bypass in MySQL multi-statement execution. 28.3.4 also improves authenticated MySQL startup compatibility for Connector/J and PyMySQL, and 28.4.1 fixes authenticated replication-cluster restart recovery by persisting the stored replication user in cluster metadata. (PR #4713 , Issue #4691 , Issue #4705 )
- If you manage MCL separately from the daemon, upgrade it together with Manticore. This release line includes MCL
13.7.0, the new
embeddings_threadssetting, and several columnar/KNN build, packaging, and cleanup fixes. Mixing an older library with a newer daemon is not recommended. (PR #169 , PR #186 , PR #4676 )
Highlights
Faster KNN rescoring
KNN search
now batches distance calculations during the rescore pass. After HNSW returns the candidate set, Manticore recomputes final full-precision distances and re-sorts the results. Batching that work reduces per-candidate overhead in the final stage of vector search.
For vector-heavy workloads, this takes work out of the part of the query that runs after candidate selection. Results do not change; the final ranking pass just has less overhead when many candidates are rescored.
Conversational search through SQL and HTTP
Conversational search
is now available through the /search JSON API as well as SQL CALL CHAT. That makes it easier to use Manticore's chat flow from applications that already talk to the HTTP API and do not want to add a separate SQL path just for chat requests.
CREATE CHAT MODEL also gained custom_prompt support, so answers can follow application-specific instructions such as citation rules, tone, response length, or formatting. The feature is still built on the same Manticore Search flow: retrieve relevant documents from an existing vectorized table, build context, keep conversation history, and return an answer with supporting sources.
One-line installation and version selection
The quick-start install path is now simpler:
curl https://manticoresearch.com | sh
The same installer flow can also upgrade an existing installation, list available versions, switch between stable and development repositories, and install a selected version. Package managers still remain the source of truth for installed files, repositories, services, and dependencies; the new bootstrap path just removes the manual setup steps around them.
For all options, run:
curl https://manticoresearch.com | sh -s help
Facets can keep zero-count buckets visible
Faceted search
now supports zero-count facet buckets through SQL ZEROES and JSON "zeroes": true.
This is a small but important UI feature. In e-commerce-style filtering, you often want to keep an option visible even when the current filter combination gives it a count of 0. Combined with max-mode facet behavior, zero-count buckets make it easier to show selected, available, and currently unavailable choices without hiding part of the filter vocabulary from the user.
Better defaults for search relevance
Manticore now supports CREATE TABLE ... profile='relevance'
, plus stored per-table defaults for ranker
and boolean_mode
.
Based on our relevance tests, profile='relevance' applies better full-text defaults for typical search workloads, so new tables can start with stronger ranking behavior without every application query repeating the same options.
It also makes relevance settings part of the table definition. If a table is meant to behave like a relevance-tuned full-text search table, that choice now lives in the schema instead of being hidden in application code.
More control over embedding CPU usage
embeddings_threads
caps the CPU threads used for auto-embedding inserts, ALTER TABLE ... REBUILD KNN, and text-to-vector KNN queries.
This matters on shared hosts and mixed workloads. Embedding generation and KNN rebuilds can be CPU-heavy; a server-level cap makes those jobs easier to schedule without letting them take over the whole machine.
Bug Fixes
This release line includes 17 changelog-listed fixes. The most important ones are:
- 28.4.3 fixed incompatible multi-statement handling around
COUNT(DISTINCT ...), preventing incorrect carry-over and rowset corruption in multi-query result processing. - 28.4.2 fixed an authentication/authorization permission-check bypass in MySQL multi-statement execution, so each statement in a multi-statement request is validated correctly under auth.
- 28.4.1 and 28.3.1 fixed replication-cluster recovery edge cases: authenticated cluster restart recovery and startup when a node was left alone in the cluster.
- Distributed queries with remote stored fields now fail on remote
GETFIELDfetch errors or malformed replies instead of returning apparently successful rows with empty or untrusted stored-field values. - Interrupted columnar/KNN merge cleanup now removes temporary component files under the tracked temp prefix, preventing orphaned
.tmp.spc.*files from breaking later table rename, attach, or drop operations. - DBeaver compatibility improved by accepting simple single-table aliases in
SELECTqueries. - Connector/J and PyMySQL clients can now complete authenticated native-password login flows, and harmless session
SETstatements no longer fail under auth. - The built-in Ukrainian lemmatizer now normalizes apostrophe words correctly, so forms such as
здоров'ямcan matchздоров'яunderlemmatize_uk_all. - AOT blended-keyword handling now honors the configured
blend_mode, restoring separator-stripped variants consistently for indexing and keyword extraction. - RT auto-optimization no longer compacts a table below two disk chunks unless that lower cutoff is explicitly requested.
- A crash involving
percentilesaggregations together with terms aggregations in the same/searchrequest on multi-chunk RT tables was fixed. - Long SQL parse errors now preserve UTF-8 character boundaries, so invalid queries containing Cyrillic and other multibyte text no longer produce truncated or corrupted error messages.
For the complete list, see the changelog .
Need help or want to connect?
- Join our Slack
- Visit the Forum
- Report issues or suggest features on GitHub
- Email us at
[email protected]

