viettranx
2e869f4ece
feat(kg): add tsvector FTS, entity deduplication, and embedding fixes
...
- Replace ILIKE search with PostgreSQL tsvector/GIN full-text search
for KG entities (migration 000031)
- Add entity deduplication system with dual-threshold strategy:
auto-merge at 0.98+ similarity with Jaro-Winkler name match,
flag 0.90-0.98 as candidates for manual review
- Add ScanDuplicates for bulk on-demand duplicate detection
- Add MergeEntities with advisory lock and tenant-scoped relation
re-pointing (delete-then-update to avoid ON CONFLICT on UPDATE)
- Wire dedup inline after KG extraction pipeline
- Fix BackfillKGEmbeddings: was failing silently due to
context.Background() missing tenant_id; now runs cross-tenant
- Fix BackfillKGEmbeddings: break on error → continue with failed
ID tracking and max consecutive error cap
- Add EmbedEntity helper; UpsertEntity now generates embeddings
in background goroutine
- Add HTTP endpoints: POST /kg/dedup/scan, GET /kg/dedup,
POST /kg/merge, POST /kg/dedup/dismiss
- Add web UI: Dedup dialog with Scan All button, side-by-side
entity comparison, merge/dismiss actions
- Add Jaro-Winkler similarity algorithm with 34 unit tests
- Update IngestExtraction to return upserted entity IDs
- Bump RequiredSchemaVersion to 31
2026-03-29 12:15:21 +07:00
..
2026-03-23 08:08:23 +07:00
2026-03-23 08:08:23 +07:00
2026-03-24 20:40:59 +07:00
2026-03-19 13:35:57 +07:00
2026-03-27 22:45:40 +07:00
2026-03-27 22:45:40 +07:00
2026-03-10 00:09:15 +07:00
2026-03-10 00:09:15 +07:00
2026-03-08 20:10:00 +07:00
2026-03-27 09:28:42 +07:00
2026-03-10 00:09:15 +07:00
2026-03-10 00:09:15 +07:00
2026-03-27 09:28:42 +07:00
2026-03-10 00:09:15 +07:00
2026-03-27 09:28:42 +07:00
2026-03-15 20:13:18 +07:00
2026-03-15 20:13:18 +07:00
2026-03-20 07:32:23 +07:00
2026-03-23 08:08:23 +07:00
2026-03-16 08:14:03 +07:00
2026-03-20 07:32:23 +07:00
2026-02-22 22:49:22 +07:00
2026-03-28 17:25:59 +07:00
2026-03-20 07:32:23 +07:00
2026-03-21 07:29:48 +07:00
2026-03-21 07:29:48 +07:00
2026-03-20 07:32:23 +07:00
2026-03-21 07:29:48 +07:00
2026-03-12 09:35:04 +07:00
2026-03-19 17:21:38 +07:00
2026-03-18 13:11:44 +07:00
2026-03-29 12:15:21 +07:00
2026-03-28 12:19:52 +07:00
2026-03-25 13:40:44 +07:00
2026-03-23 08:08:23 +07:00
2026-03-27 22:45:40 +07:00
2026-03-27 22:45:40 +07:00
2026-03-27 22:45:40 +07:00
2026-03-25 13:23:46 +07:00
2026-03-28 17:35:51 +07:00
2026-03-10 00:09:15 +07:00
2026-03-04 23:14:31 +07:00
2026-03-20 09:14:28 +07:00
2026-03-28 17:25:59 +07:00
2026-03-26 18:00:09 +07:00
2026-03-10 00:09:15 +07:00
2026-02-22 14:58:07 +07:00
2026-03-23 08:08:23 +07:00
2026-03-10 00:09:15 +07:00
2026-03-10 00:09:15 +07:00
2026-03-23 08:08:23 +07:00
2026-03-11 16:59:03 +07:00
2026-03-27 15:59:42 +07:00
2026-03-23 08:08:23 +07:00
2026-03-10 00:09:15 +07:00
2026-03-24 21:09:16 +07:00
2026-03-27 09:28:42 +07:00
2026-03-08 14:00:34 +07:00
2026-03-20 07:32:23 +07:00
2026-03-20 07:32:23 +07:00
2026-03-20 07:32:23 +07:00
2026-03-20 07:32:23 +07:00
2026-03-04 20:08:59 +07:00
2026-03-02 20:34:25 +07:00
2026-03-15 20:13:18 +07:00
2026-03-28 18:25:03 +07:00
2026-03-28 18:25:03 +07:00
2026-03-28 18:25:03 +07:00
2026-03-28 18:25:03 +07:00
2026-03-23 10:59:26 +07:00
2026-03-23 10:59:26 +07:00
2026-03-23 08:08:23 +07:00
2026-03-26 18:00:09 +07:00
2026-03-24 20:40:59 +07:00
2026-03-13 13:51:37 +07:00
2026-02-25 23:24:52 +07:00
2026-03-28 17:25:59 +07:00
2026-03-24 20:40:59 +07:00
2026-03-23 08:08:23 +07:00
2026-03-23 08:08:23 +07:00
2026-03-18 11:04:45 +07:00
2026-03-27 09:28:42 +07:00
2026-03-23 13:51:28 +07:00
2026-03-28 17:25:59 +07:00
2026-03-20 17:51:40 +07:00
2026-03-28 17:25:59 +07:00
2026-03-27 22:26:36 +07:00
2026-03-20 17:51:40 +07:00
2026-03-17 14:29:52 +07:00
2026-03-24 08:56:10 +07:00
2026-03-27 22:26:36 +07:00
2026-03-28 17:25:59 +07:00
2026-03-27 22:26:36 +07:00
2026-03-28 17:25:59 +07:00
2026-03-27 22:26:36 +07:00
2026-03-28 17:25:59 +07:00
2026-03-27 22:26:36 +07:00
2026-03-28 17:25:59 +07:00
2026-03-27 22:26:36 +07:00
2026-03-28 17:25:59 +07:00
2026-03-27 22:26:36 +07:00
2026-03-27 22:26:36 +07:00
2026-03-27 22:26:36 +07:00
2026-03-27 22:26:36 +07:00
2026-03-28 17:25:59 +07:00
2026-03-28 17:25:59 +07:00
2026-03-28 17:25:59 +07:00
2026-03-27 22:26:36 +07:00
2026-03-28 17:25:59 +07:00
2026-03-27 21:03:34 +07:00
2026-03-25 16:03:40 +07:00
2026-03-25 13:23:46 +07:00
2026-03-10 00:09:15 +07:00
2026-03-10 00:09:15 +07:00
2026-03-03 17:10:55 +07:00
2026-03-07 19:35:19 +07:00
2026-03-10 00:09:15 +07:00
2026-03-20 14:21:46 +07:00
2026-03-20 14:21:46 +07:00
2026-03-20 14:21:46 +07:00
2026-03-20 22:26:48 +07:00
2026-03-10 00:09:15 +07:00
2026-03-20 17:55:51 +07:00
2026-02-28 17:27:28 +07:00
2026-03-10 00:09:15 +07:00
2026-03-10 00:09:15 +07:00
2026-03-07 19:31:56 +07:00
2026-03-24 23:17:51 +07:00
2026-03-23 08:08:23 +07:00
2026-03-18 13:02:07 +07:00
2026-03-25 16:03:31 +07:00
2026-03-25 16:03:31 +07:00