0.17.0 Release Notes
This documents the 0.17.0 release candidate. Publication of this manual is not a release tag, a merged-PR assertion or first-customer production approval.
0.17.0 optimizes initial fulltext index construction and reconstruction (#1261). It retains the existing posting-list storage format, analyzers, BM25 scoring and synchronous maintenance of subsequent document updates.
Grouped fulltext construction
Instead of loading and rewriting a growing posting list for every document, the builder stages document postings, sorts them and writes each complete term list once. Document encounter order is preserved within each list. Node and relationship indexes use the same builder; graph scan errors propagate rather than silently producing an incomplete index.
Sorting reuses PATINADB_SORTMERGE_RUN_BYTES (default 128 MiB) and temporary
files under the process temporary directory (TMPDIR on Unix). This bounds the
sort run buffer, not total process memory: merge readers, the largest posting
list, serialization and database caches need additional RAM. Provide temporary
disk space; ordinary completion, cancellation and errors remove scratch files,
but a hard process kill can leave temporary directories behind.
Index creation remains synchronous and uses the existing atomic DDL boundary. No thread-pool setting, asynchronous update mode or on-disk migration is added. Existing indexes need not be rebuilt for compatibility.
Validation and scope
On 334,770 real Apache Jira summaries, standard analyzer, one summary property, local Ryzen 7 3800X/NVMe, the paired 2026-09-10 runs under #1261 measured:
| Metric | 0.16.0 baseline | 0.17.0 |
|---|---|---|
| Complete initial index build | 1727.563 s | 7.950 s |
| Peak build RSS | 876.578 MiB | 464.113 MiB |
| Allocated database directory after build | 1375772672 bytes | 477433856 bytes |
| Mixed 2 reads/s + 0.1 updates/s read p90 | 74.563 ms | 66.816 ms |
The measured build is 217.31 times faster; this is one complete build per implementation, not a hardware-independent guarantee. Warm Top-10/20 p90 across the tested forms is 2.173–63.868 ms. No search algorithm change is claimed.
Differential tests cover all four analyzers, in-memory and spilled construction,
posting bytes, query scores, subsequent updates and deletion. A regression guard
checks one final write per distinct term list. The Jira benchmark checks exact
hit sets, independent single-term BM25, Top-10/20, update visibility and reopen.
Measured results are recorded in docs/fulltext-benchmark-1261.md under #1261.
This is not a qualification of 10M tickets, large ticket bodies, WAN fan-out, high-rate writes or concurrent queries during initial construction. Subsequent updates still rewrite affected lists. See Full-Text Search.