Suche: combinedCache, ngram.inMemory und Restore-Verhalten dokumentieren

- projekt/suche.mdx: neuer Abschnitt "Performance-Optionen" (Combined-Cache mit
  TTL/Key/Header-Verhalten, In-Memory-ngram-Index mit zwei Flags, Fallback-
  Zuständen, Restore-Neuaufbau, Messwerten), drei neue Fehlerbilder, Verifikation
  auf tibi-server 63a2848c ergänzt.
- server/konfiguration.mdx: Bereich search.inMemory in der Übersichtstabelle plus
  eigener Abschnitt (Kill-Switch, Budget pro Index, Reload-Pflicht, Restore).
- projekt/audit-backup.mdx: Hinweis, dass Snapshot- und Backup-Restore alle
  In-Memory-Zustände neu aufbauen (auch bei Teilabbrüchen).

Build geprüft: npx astro build (71 Seiten, ohne Fehler).
This commit is contained in:
apairon committed 2026-10-19 18:13:44 +00:00
1 parent 15c1976c60
commit 41fe424352
3 files changed
+78 -2

No files matched your search

+60 -1
View File
@@ -108,6 +108,62 @@ Alle Modi aus `collection.go:314` — `fields` gilt für `regex` und `ngram`, `v
Aus Projektsicht musst du nichts einrichten — lass `autoRegenerate: true` in der YAML stehen, dann pflegen sich `fuzzy`- und `semantic`-Indizes selbst. Der Regenerate-Flow im tibi-admin (Test-Plan `41-search-index-status`) nutzt genau den Endpunkt aus Schritt 4.
</Aside>
## Performance-Optionen (Cache und In-Memory-Index)
Beide Optionen sind **standardmäßig aus** und ändern ohne Konfiguration nichts.
### Ergebnis-Cache für `combined` (`combinedCache`)
Wiederholte Combined-Queries (Katalog-Filter, Blättern durch dieselbe Treffermenge) können die gemergte Rangliste kurzzeitig wiederverwenden:
```yaml
search:
- name: combined
mode: combined
rrf: { k: 60, topK: 100, weights: { semantic: 1.5, fuzzy: 1.0 } }
combinedCache:
enabled: true # Default: false
ttl: 45s # Default: 45s
maxEntries: 1000 # LRU-Cap, Default: 1000
```
- Gecacht werden nur die gemergten **IDs + Scores**; die Dokumente der Seite werden immer frisch geladen.
- Der Key enthält Query, Config, den effektiven Filter (inkl. Rollen-`preFilter` und Hook-Filter) und alle Fusionsparameter — Ergebnisse können nicht zwischen Rollen oder Sammlungen wandern.
- Aktiv: `X-Cache: HIT|MISS` im Response-Header. Bei `HIT` bleiben `X-Search-Sources`/`X-Search-Config` leer (es lief keine Subsearch).
- Grenzen: `ttl` kurz halten (≤30s bei mehreren Server-Instanzen, die Invalidierung ist node-lokal); nach einem Restore wird der Cache verworfen.
### In-Memory-Index für `ngram` (`ngram.inMemory`)
Für große Sammlungen kann der ngram-Anteil einer Combined-Suche aus dem RAM beantwortet werden statt aus MongoDB:
```yaml
# Server-config.yml — globaler Schalter, ohne ihn passiert nichts
search:
inMemory:
enabled: true
maxMemoryMB: 1024
# Projekt-YAML
search:
- name: fuzzy
mode: ngram
fields: [title, context]
ngram:
sizes: [3]
queryFilter: { minMatchRatio: 0.4 }
inMemory:
enabled: true # Default: false
maxDocs: 150000 # mehr Dokumente → MongoDB
maxMemoryMB: 512 # Budget pro Index
```
- Gebaut wird der Index beim Projekt-(Re-)Load aus den **gespeicherten** `_search`-Ngrammen (nie aus den Quellfeldern), damit er nicht vom MongoDB-Pfad abweichen kann.
- Genutzt nur für ngram-Quellen von `combined`-Suchen, und nur wenn er fertig geladen und im Budget ist. Sonst — und immer bei Einzel-ngram-Suchen sowie `_count` — läuft die Suche über MongoDB. Der Debug-Header zeigt `inMemory=ram|mongo(loading)|mongo(budget)|mongo(candidates)`.
- Rollen-`preFilter`, `?filter=` und Hook-Filter gelten weiter: der Index liefert Kandidaten-IDs, die danach gegen den effektiven Filter geprüft werden.
- Schreibvorgänge (Anlegen/Ändern/Löschen/Bulk/Worker/Regenerate) halten den Index aktuell; **Snapshot- und Backup-Restore bauen alle In-Memory-Zustände neu auf** (Indizes + Cache) — alte Treffer können einen Restore nicht überleben. Während des Neuaufbaus laufen Suchen auf MongoDB.
- Budget-Abbruch (zu viele Dokumente, Speicher- oder RSS-Grenze) lässt den Index leer und dauerhaft auf MongoDB; ein Reload startet einen neuen Versuch.
- Gemessen (91k Dokumente, ~197 KB/Doc): Die ngram-Subsearch von „blauer pullover" fällt von ~1,3 s auf wenige Millisekunden, Einzelwort-Suchen von ~1,7 s auf 30–80 ms (jeweils vor dem Rollen-/Katalogfilter).
## Was der Vektor-Pfad zusätzlich braucht
- **Provider-Name:** `vector.provider` (z. B. `bge_m3`) muss mit einem Servernamen aus der Embedding-Registry übereinstimmen (`collection.go:377`) — sonst löst die Config nicht auf. Unbekannte Provider-Typen brechen ab, defekte einzelne Provider werden übersprungen (`registry.go:58-70`).
@@ -125,8 +181,11 @@ Aus Projektsicht musst du nichts einrichten — lass `autoRegenerate: true` in d
| `404 collection "…" not found` | Regenerate mit falschem `collection`-Namen | Namen gegen `api/collections/*.yml` prüfen |
| Worker-Queue steht | Provider defekt oder überlastet | `search-worker/status` und `embedding/status` lesen, dann Regenerate mit `force: true` |
| Suche über `tag`/`navigation` unscharf | `default` ist `regex`, kein Fuzzy | Erwartung anpassen oder `content`-Indexe nutzen |
| `inMemory=ram` erscheint nie im Debug-Header | Globaler Schalter aus, Config ohne `inMemory`, Index noch nicht fertig oder Budget-Abbruch | `search.inMemory.enabled`, `ngram.inMemory.enabled` prüfen, Reload, Budget-Logs lesen |
| Nach Restore kurz alte Treffer | Restore erfolgt, Index-Neuaufbau läuft noch | Warten bis `inMemory=ram` wieder erscheint (bis dahin MongoDB-Fallback) |
| Combined-Suche liefert kurz eine ältere Reihenfolge | `combinedCache` aktiv, TTL noch nicht abgelaufen | TTL senken oder Cache für kritische Daten abschalten |
| `?facet=` an der Suche wirkungslos | Facetten sind eigene Route (`…/_facet`) | [Lesen und suchen](/projekt/abfragen-lesen/) beachten |
Weiter: [Lesen und suchen](/projekt/abfragen-lesen/), [Sammlungen anlegen](/projekt/sammlungen-anlegen/), [Felder und Widgets](/projekt/felder-widgets/).
Verifiziert am e3f92eb 2026-10-14 (tibi-svelte-starter), am 68b4278 2026-10-15 (tibi-server, rankfusion), am 2b091d8 2026-10-13 (tibi-admin-nova, Test-Plan 41-search-index-status)
Verifiziert am e3f92eb 2026-10-14 (tibi-svelte-starter), am 68b4278 2026-10-15 (tibi-server, rankfusion), am 2b091d8 2026-10-13 (tibi-admin-nova, Test-Plan 41-search-index-status), am 63a2848c 2026-10-19 (tibi-server: combinedCache, ngram.inMemory, _count-Fast-Path, Restore-Rebuild)