# SearchAI Index Server 1.1.0 (2026-09-15)

Drop-in hardening release: validated against a production SearchBlox 12.2.2
stack end-to-end, Raft consensus clustering, memory guardrails proven on a
real crawl, and the installer now sets up vector/hybrid search out of the box.

## Platforms (all built natively)
- searchai-index-server-1.1.0-linux-arm64.tar.gz (Graviton/ARM servers)
- searchai-index-server-1.1.0-linux-amd64.tar.gz (x86_64 glibc servers)
- searchai-index-server-1.1.0-osx-arm64.tar.gz (Apple Silicon dev)

## Highlights
- **Raft consensus clustering** (`cluster.mode=raft`): leader election,
  quorum-committed writes (no acknowledged-write loss), automatic failover,
  snapshot bootstrap for late/restarted joiners, dynamic membership.
  Validated as a live 3-node cluster serving a real SearchBlox crawl.
  Recommended for HA; `single_primary` remains the default clustered mode
  (read replicas / scale-out reads).
- **Memory guardrails proven in production shape**: the per-doc segment-storm
  that previously drove 19 GB RSS at 114 docs is defeated — the emergency
  segment merge (default ceiling 16) bounded segments at
  ≤20 with 2.5–4.5 GB RSS on a real CNN crawl. Replicas now enforce the same
  guardrails as the primary (bytes trigger + capped optimize sweep).
- **Auto-create-on-write** (`index.auto-create`, default on): writing to a
  missing index creates it with a mapping inferred from the document, matching
  OpenSearch `action.auto_create_index`. Index templates win over inference.
  (`knn_vector`/geo/date still need an explicit mapping or template.)
- **Installer bundles the SearchAI Inference Server** (embed + rerank models)
  so vector, hybrid, and semantic search work natively after one install;
  `--no-inference` opts out.
- **SearchBlox drop-in fixes** (verified console + crawl + search end-to-end):
  HTTP Basic auth alongside Bearer; `_msearch` with index arrays; bodies on
  GET/DELETE requests (e.g. `GET _analyze`/`_search` with a body) no longer
  break keep-alive connections.
- **query_string upgrades**: fielded search (`field:term`, `field:"phrase"`,
  `field:(group)`), `+`/`-`, `AND`/`OR`/`NOT`, cross-field AND, and text
  `must_not`. (Boost `term^N` and slop `"p"~N` are parsed but not yet ranked.)
- Prometheus `/_metrics` endpoint (segments, FTS columns, RSS, breaker
  counters), aggregation bucket + per-request memory budgets, streamed
  `size:0` aggregations.

## Upgrade notes
- The background optimize sweep interval default changed 300 → 20 s (the sweep
  is cheap on idle indices; every cluster node should run the same guardrail
  config).
- Inter-node cluster TLS is a separate flag: set `cluster.tls=true` when node
  listeners are TLS-only, or replication silently fails.
- For multi-node HA use `cluster.mode=raft` (3 or 5 voters); single_primary
  does not replay history to late joiners.

## Verification
Each bundle built and smoke-tested natively on its platform with the patched
embedded engine (optimize/iterator exclusion, bounded per-column write buffers,
quiet null-vector logging). Full suites at 1.1.0: 93 zig unit/probe tests +
146 pytest (cluster, raft failover/membership/snapshot/chaos, crash-recovery,
TLS, security, dialects via real client libraries). Guardrail + drop-in
validation on a live SearchBlox 12.2.2 crawl (arm64, c8g.4xlarge).
