Files
nexarch/mail/docs/SRC-03-PRUEFPROTOKOLL.md
sysopsandClaude Sonnet 5 9748307f12 SRC-03: such-api-mit-ranking
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
2026-08-31 10:05:27 +02:00

3.3 KiB
Raw Permalink Blame History

SRC-03 Prüfprotokoll: Such-API mit Ranking

Voraussetzung SRC-01 (Fertig).

Umsetzung

  • mail/internal/search/client.goSearch 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.