Compare commits

..

2 Commits

Author SHA1 Message Date
cesnimda 18acd9f6e8 feat(search): 'why this matched' highlights (ts_headline)
CI / backend (pull_request) Successful in 49s
CI / frontend (pull_request) Successful in 13s
Security / secrets (pull_request) Successful in 3s
Security / dependencies (pull_request) Successful in 51s
Slice 3 of search-core. Search results now show WHY they matched: a ts_headline
body fragment with matched terms highlighted. The API returns U+E000/U+E001
sentinels around matches (NOT HTML); the client tokenises them into escaped
<mark> React elements, so untrusted email content can never inject markup (no
dangerouslySetInnerHTML). Subtle accent tint. Only when there's a free-text query
(browse unchanged); projection branched (no DB function in a ternary) for
unambiguous EF translation.

Verified: build + all 40 tests; ts_headline output shape in raw Postgres; and the
ranked+headline EF query proven to translate + execute against a live Postgres via
a throwaway test (removed).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-01 22:14:15 +02:00
cesnimda 9545f94461 feat(search): weight subject above body in the FTS vector
CI / backend (pull_request) Successful in 1m16s
CI / frontend (pull_request) Successful in 27s
Security / secrets (pull_request) Successful in 5s
Security / dependencies (pull_request) Successful in 1m14s
Slice 2 of search-core: the generated SearchVector now applies setweight 'A' to
the subject and 'B' to the body, so ts_rank_cd (added last slice) ranks a subject
match above a body-only mention -- what users expect. Adds an EF migration that
drops/recreates the stored generated column + GIN index (Npgsql emits this
correctly and transactionally).

Verified: the migration DDL was dry-run against the live staging Postgres
(schema + real data) inside a rolled-back transaction -- applies cleanly; and the
weighted ranking (subject 1.0 vs body 0.4 for the same term) was confirmed
directly in Postgres. Build + all 40 tests pass.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-01 21:24:03 +02:00

Diff Content Not Available