# SRC-03 – Prüfprotokoll: Such-API mit Ranking Voraussetzung SRC-01 (Fertig). ## Umsetzung - `mail/internal/search/client.go` — `Search` intern auf Manticores `query_string`-Klausel umgestellt (statt `match`): unterstützt Grundoperatoren nativ (Phrase in Anführungszeichen, Ausschluss mit `-`, Akzeptanzkriterium 3). Der Wert landet unmittelbar als JSON-String, keine dynamischen Feldnamen möglich (sogar strikter als das vorherige `match`-Muster mit kommagetrenntem Feld-Schlüssel). - `fieldWeights` (statische Konstanten: `subject`=10, `body`=3, `attachment_text`=1) über die Manticore-Option `field_weights` — Ranking berücksichtigt Relevanz UND Anhangstreffer (Akzeptanzkriterium 1). Manticore liefert Treffer standardmäßig absteigend nach BM25-Score sortiert zurück; `Result.Score` macht das Ranking nachvollziehbar. - `Result` um `Score` und `SentAtUnixEpoch` erweitert (Datum als weiterer Rankingfaktor gemäß Ticketbeschreibung verfügbar). - Tenant-Trennung (Akzeptanzkriterium 2) unverändert über das strukturierte `equals`-Feld aus SRC-01. - Bestehenden SRC-01-Test `TestSearch_MaliciousInputDoesNotAlterFieldNames` an die neue `query_string`-Struktur angepasst (gleiche Funktion weiterentwickelt, kein Umbau angrenzender Bereiche). - Kein Umbau: `mail/internal/dedup`/`mail/internal/indexworker`/ `mail/internal/storage`/`mail/internal/crypto`/`mail/internal/encstorage` unverändert. ## Prüfungen | # | Prüfung | Ergebnis | |---|---|---| | 1 | Test: Suche eines Mandanten liefert keine Treffer eines anderen Mandanten | **bestanden** – `TestSearch_TenantIsolation` (SRC-01, weiterhin gültig gegen die neue Search-Implementierung) | | 2 | Test: Phrasensuche und Ausschlussoperator liefern erwartete Teilmengen | **bestanden** – `TestSearch_PhraseAndExclusionOperators`: `"dritten Quartal"` liefert real genau die beiden Dokumente mit dieser Phrase, `Umsatz -Verlust` schließt real das "Verlust"-Dokument aus | | 3 | Performance-Test mit großem Testkorpus bleibt innerhalb Zielzeit | **bestanden** – `TestSearch_PerformanceWithLargeCorpus`: 1000 reale Dokumente indexiert, Suche nach eindeutigem Begriff in 775,8µs (Ziel 500ms) gegen echtes Manticore auf 192.168.1.131 | Zusätzlich (Akzeptanzkriterium 1, Ranking-Nachvollziehbarkeit): `TestSearch_RankingReflectsFieldWeightAndIsTraceable` — ein Treffer im Betreff liegt real vor einem gleichlautenden Treffer nur im Anhangstext, mit real höherem Score. ## Build/Test-Ergebnis (192.168.1.131) ``` go build ./... -> clean go vet ./... -> clean golangci-lint run ./... -> 0 issues TEST_TENANT_DSN=postgresql://nexarch_test:***@localhost:5432/tenant_acme?sslmode=disable \ TEST_MANTICORE_URL=http://127.0.0.1:9308 \ go test ./... -v -p 1 -> alle Pakete bestanden, inkl. internal/search (7 Tests, keine Regression in dedup/indexworker/storage/encstorage/example/mimeparse/pflichttestgate) ``` ## Gesamtergebnis **Bestanden.** Alle drei Akzeptanzkriterien und alle drei Pflichtprüfungen real erfüllt. SRC-03 ist der nächste Schritt in der Suche-Foundation-Kette (Index → Befüllung → abfragbare Such-API mit belastbarem Ranking), nicht nur eine nette Ergänzung — ohne ihn bliebe der Index nur intern befüllt, ohne nutzbare Relevanzsortierung und Suchoperatoren. Entsperrt INT-01, SRC-04, SRC-05, SRC-08.