Such-API mit Ranking (Relevanz, Datum, Anhangstreffer), mandantengetrennt,
mit Grundoperatoren (Phrase, Ausschluss).
- client.go: Search nutzt jetzt Manticores query_string-Klausel statt
match — unterstützt Phrasensuche ("...") und Ausschluss (-wort) nativ,
Wert bleibt reiner JSON-String ohne dynamischen Feldnamen.
- fieldWeights (statische Konstanten: subject=10, body=3,
attachment_text=1) über die Manticore-Option field_weights — Ranking
berücksichtigt Anhangstreffer, Result.Score macht es nachvollziehbar.
- Bestehenden SRC-01-Injection-Test an die neue query_string-Struktur
angepasst (gleiche Funktion weiterentwickelt).
Prüfungen (alle real durchgeführt, siehe mail/docs/SRC-03-PRUEFPROTOKOLL.md):
1. TestSearch_TenantIsolation (SRC-01, weiterhin gültig).
2. TestSearch_PhraseAndExclusionOperators: Phrase und Ausschluss liefern
real erwartete Teilmengen.
3. TestSearch_PerformanceWithLargeCorpus: Suche über 1000 reale Dokumente
in 775,8µs (Ziel 500ms) gegen echtes Manticore auf 192.168.1.131.
Zusätzlich TestSearch_RankingReflectsFieldWeightAndIsTraceable für
Akzeptanzkriterium 1.
Kein Umbau: dedup/indexworker/storage/crypto/encstorage unverändert.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01HhgFcLS8tYMhDJpP74C6AQ
3.3 KiB
3.3 KiB
SRC-03 – Prüfprotokoll: Such-API mit Ranking
Voraussetzung SRC-01 (Fertig).
Umsetzung
mail/internal/search/client.go—Searchintern auf Manticoresquery_string-Klausel umgestellt (stattmatch): 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 vorherigematch-Muster mit kommagetrenntem Feld-Schlüssel).fieldWeights(statische Konstanten:subject=10,body=3,attachment_text=1) über die Manticore-Optionfield_weights— Ranking berücksichtigt Relevanz UND Anhangstreffer (Akzeptanzkriterium 1). Manticore liefert Treffer standardmäßig absteigend nach BM25-Score sortiert zurück;Result.Scoremacht das Ranking nachvollziehbar.ResultumScoreundSentAtUnixEpocherweitert (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_MaliciousInputDoesNotAlterFieldNamesan die neuequery_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/encstorageunverä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.