{"slug": "manticore-search-29-9-0-chunked-auto-embeddings-and-mmap-columnar-access", "title": "Manticore Search 29.9.0: Chunked auto-embeddings and mmap columnar access", "summary": "Manticore Search released version 29.9.0, adding chunked auto-embeddings that let long documents store multiple vectors instead of one, with five chunking strategies including truncate, mean, fixed, recursive, and sentence. The release also makes mmap the default access mode for columnar attributes, adds a MAX_INPUT_TOKENS option to cap local embedding work, and includes fixes across hybrid search, KNN, bulk ingestion, and grouped search. The update covers everything shipped after 29.0.2, from 29.0.3 through 29.9.0, with no release-wide mandatory data migration.", "body_md": "[Manticore Search 29.9.0](/install/)\nhas been released. The largest change is in auto-embeddings: long documents can now be split into searchable chunks, and a document can keep several vectors instead of compressing all of its content into one. This release also makes `mmap` the default access mode for columnar attributes, adds safer controls for embedding workloads, UTF-8 identifiers, better backup support, and fixes across hybrid search, KNN, bulk ingestion, grouped search, and schema changes.\n\nThis post covers everything shipped after 29.0.2, from **29.0.3 through 29.9.0**.\n\n❤️ We’d like to thank [@tudorvasinca](https://github.com/tudorvasinca)\nfor their work on [PR #4857](https://github.com/manticoresoftware/manticoresearch/pull/4857)\n, [PR #4859](https://github.com/manticoresoftware/manticoresearch/pull/4859)\n, and [PR #4873](https://github.com/manticoresoftware/manticoresearch/pull/4873)\n.\n\n## Upgrade notes\n\nThere is no release-wide mandatory data migration. Existing tables and configuration can be upgraded normally, but a few fixes need follow-up if the earlier behavior already affected your data:\n\n- German sharp-s normalization is opt-in. Switching an existing table to `lemmatize_de_v2` or`lemmatize_de_v2_all` changes indexed terms, so rebuild a plain table or replay documents into a new RT table.\n- Authenticated `BACKUP` introduces the`backup` authorization action. Before downgrading to 29.3.12 or earlier, remove any`backup` grants.\n- Columnar attributes now use `mmap` by default instead of buffered`file` reads. Set`access_columnar_attrs='file'` explicitly if you need to retain the previous access mode.\n\n## Long documents can keep more than one embedding\n\nThe old auto-embedding path produced one vector per document and truncated text that did not fit the model input window. That works for titles and short descriptions, but it means a relevant paragraph near the end of a long article may never reach the index.\n\nManticore Search now supports five [chunking strategies](https://manual.manticoresearch.com/Searching/KNN#Chunking-strategies)\n:\n\n- `truncate` keeps the previous behavior and remains the default.\n- `mean` embeds every chunk and averages the results into one vector.\n- `fixed` splits text into fixed-size token windows.\n- `recursive` prefers paragraph, line, sentence, and space boundaries in that order.\n- `sentence` groups complete sentences up to the configured limit.\n\nThe multi-vector strategies use [`float_vector_array`](https://manual.manticoresearch.com/Creating_a_table/Data_types#Float-vector-array)\n. Each chunk competes independently during KNN search, but Manticore returns the document once and uses its closest chunk for `knn_dist()`:\n\n```\nCREATE TABLE articles (\n  title text,\n  content text,\n  chunks float_vector_array knn_type='hnsw' hnsw_similarity='cosine'\n    model_name='Xenova/all-MiniLM-L6-v2' from='title,content'\n    chunk_strategy='sentence' max_tokens='256' overlap_tokens='32'\n);\n\nINSERT INTO articles (id, title, content)\nVALUES (1, 'Rotating certificates', 'A long guide with many sections ...');\n\nSELECT id, knn_dist()\nFROM articles\nWHERE knn(chunks, 5, 'how do I rotate a certificate');\n```\n\n`MAX_TOKENS`, `OVERLAP_TOKENS`, and `MAX_CHUNKS` control chunk size, shared context at boundaries, and the maximum vector count. Declare a model-backed `float_vector_array` when creating the table: adding one later with `ALTER TABLE ... ADD COLUMN` and rebuilding its embeddings are not supported yet.\n\n## Put a ceiling on local embedding work\n\nLong-context models can make a single large input unexpectedly expensive, especially on CPU. The new [`MAX_INPUT_TOKENS`](https://manual.manticoresearch.com/Searching/KNN#Auto-Embeddings-%28Recommended%29)\ncolumn option caps how much of each input is sent to a local embedding model:\n\n```\nALTER TABLE articles\nMODIFY COLUMN chunks MAX_INPUT_TOKENS='512';\n```\n\nThe change applies to embeddings generated afterward; existing vectors stay as they are. Set it during `CREATE TABLE` or change it later without re-embedding the table. A value of `0`, or leaving the option out, uses the model's own limit.\n\nThis release also fixes two less visible problems around this path. Models no longer remain cached after an embedding column is modified, and configurations with different `API_TIMEOUT` or `MAX_INPUT_TOKENS` values no longer collide and reuse the wrong cached model.\n\n## UTF-8 identifiers and better German matching\n\nTable, field, and attribute names now follow one consistent [safe UTF-8 identifier syntax](https://manual.manticoresearch.com/Creating_a_table/Data_types#Table-and-field-name-syntax)\n. RT, percolate, distributed, template, and plain tables can use localized names such as Chinese or Cyrillic identifiers across DDL, expressions, field selectors, and inferred source schemas.\n\nGerman AOT morphology also gains opt-in sharp-s normalization. With `charset_table=non_cont,german` and `morphology=lemmatize_de_v2` or `lemmatize_de_v2_all`, forms such as `Straße`, `Strasse`, and `STRAẞE` match in ordinary whole-word searches. If `index_exact_words=1` is enabled, exact-word queries can still distinguish the `ß` and `ss` forms.\n\n## Better load testing and backups\n\n[`manticore-load`](https://github.com/manticoresoftware/manticore-load)\ncan now benchmark through the HTTP JSON API with `--http`. Writes use `/bulk`, searches use `/search`, and `--table` selects the target table. Its reports now include local `searchd` RSS during the run plus peak RSS, disk, and CPU statistics at the end, including aggregate monitoring for multi-command workloads.\n\n[Manticore Backup](https://github.com/manticoresoftware/manticoresearch-backup)\nnow works with authenticated Manticore Search installations through username/password or bearer-token credentials. SQL [`BACKUP`](https://manual.manticoresearch.com/Securing_and_compacting_a_table/Backup_and_restore#General-syntax-of-BACKUP)\nhas a dedicated authorization action and checks read access to the selected tables.\n\nS3 backups and restores can also use the AWS SDK credential provider chain when static keys are not set. That includes IRSA, shared credentials, ECS task roles, and EC2 instance profiles. Temporary credentials can supply `AWS_SESSION_TOKEN`.\n\n## Columnar attributes use mmap by default\n\nManticore Search now defaults [`access_columnar_attrs`](https://manual.manticoresearch.com/Creating_a_table/Local_tables/Plain_and_real-time_table_settings#Accessing-table-files)\nto `mmap`. The operating system maps and caches `*.spc` columnar-attribute files on demand, without prereading the whole file at startup. The previous buffered path remains available with `access_columnar_attrs='file'`.\n\n`ALTER TABLE` also reopens replaced columnar storage with the configured access mode, so an altered table no longer falls back to a different reader than the one requested.\n\n## Vector and grouped-search fixes\n\nSeveral fixes target queries that were valid but could return incomplete results or fail under a particular table layout:\n\n- Distributed and sharded KNN queries with a local shard no longer rescore merged 1-bit-quantized results twice, which could crash the coordinator or return the wrong nearest neighbor. ([Issue #4791](https://github.com/manticoresoftware/manticoresearch/issues/4791) )\n- KNN queries with additional filters avoid a redundant `knn_dist` prefilter when HNSW already excludes documents without vectors. ([PR #4861](https://github.com/manticoresoftware/manticoresearch/pull/4861) )\n- `LENGTH()` on a`float_vector_array` now reports the number of vectors rather than its internal storage-word count. ([PR #4879](https://github.com/manticoresoftware/manticoresearch/pull/4879) )\n- Hybrid search with `GROUP BY` retains all buckets, including MVA groups, and follows both final and within-group ordering. ([Issue #4639](https://github.com/manticoresoftware/manticoresearch/issues/4639) )\n- Hybrid filters on `weight()` and expressions or aliases derived from it now run after fusion against the final text weight instead of being ignored. Weight-dependent filters inside`OR` trees remain unsupported and return an explicit error. ([Issue #4889](https://github.com/manticoresoftware/manticoresearch/issues/4889) )\n- Multi-chunk RT grouping no longer risks duplicate groups, incorrect split counts, or a hang while ordering `COUNT(DISTINCT ...)` results. ([Issue #4856](https://github.com/manticoresoftware/manticoresearch/issues/4856) )\n- Document-ID filters whose signed representation is negative now follow the lookup index's unsigned ordering. ([Issue #4774](https://github.com/manticoresoftware/manticoresearch/issues/4774) )\n\nThere are crash fixes here too: a second hybrid-search statement in a multi-statement request ([PR #4864](https://github.com/manticoresoftware/manticoresearch/pull/4864)\n), distributed JSON aggregation sorted by a string attribute ([Issue #4822](https://github.com/manticoresoftware/manticoresearch/issues/4822)\n), and dropping a table during auto-embedding precommit ([Issue #4860](https://github.com/manticoresoftware/manticoresearch/issues/4860)\n) are all handled safely now.\n\n## Bulk ingestion behaves predictably\n\nElasticsearch-compatible `/_bulk` requests now return HTTP `200` once a batch has been processed, while individual failures remain visible through `errors: true` and per-item statuses. Duplicate `create` actions return per-item `409` `version_conflict_engine_exception` errors, including duplicates within the same batch. This prevents clients such as Fluent Bit from retrying writes that already succeeded.\n\nFixed-length gzip-compressed `/bulk` bodies are also decoded correctly when they arrive across multiple socket reads. And if native bulk processing fails because the target table does not exist, the request can again reach Manticore's auto-schema fallback with valid NDJSON while preserving the expected bulk response envelope.\n\n## More reliability fixes\n\nThe rest of the release closes a broad set of operational and compatibility problems:\n\n- `searchd --stopwait` no longer hangs while a sharded table is being rebalanced after a node rejoins. ([Issue #3905](https://github.com/manticoresoftware/manticoresearch/issues/3905) )\n- Compatible older binlogs replay safely during upgrade and completed RT chunks are published before clean shutdown. ([Issue #4808](https://github.com/manticoresoftware/manticoresearch/issues/4808) ) Fatal replay diagnostics also name the relevant recovery flag. ([Issue #4811](https://github.com/manticoresoftware/manticoresearch/issues/4811) )\n- `indexer` creates missing parent directories for plain-table paths when the nearest existing parent is writable. ([Issue #4793](https://github.com/manticoresoftware/manticoresearch/issues/4793) )\n- UUID document IDs no longer cause stored text fields to come back empty. ([Issue #4833](https://github.com/manticoresoftware/manticoresearch/issues/4833) )\n- `ALTER TABLE ... RENAME` preserves hidden remote embedding API keys without exposing them in`SHOW CREATE TABLE` . ([Issue #4842](https://github.com/manticoresoftware/manticoresearch/issues/4842) )\n- Sequel Ace 5.3.1+ compatibility probes work again. ([Issue #4828](https://github.com/manticoresoftware/manticoresearch/issues/4828) )\n- JSON `/search` keeps distances for negated`NEAR` and proximity operators. ([Issue #4784](https://github.com/manticoresoftware/manticoresearch/issues/4784) )\n- Internal string-sort helper columns no longer leak from `LEFT JOIN` results. ([Issue #4788](https://github.com/manticoresoftware/manticoresearch/issues/4788) )\n- Malformed binary API `SEARCH` element counts are rejected instead of terminating`searchd` . ([PR #4790](https://github.com/manticoresoftware/manticoresearch/pull/4790) )\n\nFor the complete list, see the [Version 29.9.0 changelog](https://manual.manticoresearch.com/Changelog#Version-29.9.0)\n.\n\n## Get Manticore Search 29.9.0\n\nInstall or upgrade Manticore Search with the [installation guide](/install/)\n. Review the upgrade notes above if you use columnar attributes, German AOT morphology, or authenticated backups.\n\n## Need help or want to connect?\n\n- Join our [Slack](https://slack.manticoresearch.com)\n- Visit the [Forum](https://forum.manticoresearch.com)\n- Report issues or suggest features on [GitHub](https://github.com/manticoresoftware/manticoresearch/issues)\n- Email us at [\\[email protected\\]](/cdn-cgi/l/email-protection)", "url": "https://wpnews.pro/news/manticore-search-29-9-0-chunked-auto-embeddings-and-mmap-columnar-access", "canonical_source": "https://manticoresearch.com/blog/manticore-search-29-9-0/", "published_at": "2026-09-11 00:00:00+00:00", "updated_at": "2026-09-11 14:42:50.841613+00:00", "lang": "en", "topics": ["ai-products", "ai-tools", "natural-language-processing", "ai-infrastructure", "developer-tools"], "entities": ["Manticore Search", "Manticore Search 29.9.0", "tudorvasinca", "Xenova/all-MiniLM-L6-v2"], "alternates": {"html": "https://wpnews.pro/news/manticore-search-29-9-0-chunked-auto-embeddings-and-mmap-columnar-access", "markdown": "https://wpnews.pro/news/manticore-search-29-9-0-chunked-auto-embeddings-and-mmap-columnar-access.md", "text": "https://wpnews.pro/news/manticore-search-29-9-0-chunked-auto-embeddings-and-mmap-columnar-access.txt", "jsonld": "https://wpnews.pro/news/manticore-search-29-9-0-chunked-auto-embeddings-and-mmap-columnar-access.jsonld"}}