Files
job-search/internal/store/migrations/00011_create_general_search.sql
T
bwilliams b0230e6847 Replaced the Title filter with a general search, run by the backend
GET /api/opportunities/search?q= returns the UUIDs of the matching
opportunities, and the frontend filters its list by them. Words without
a prompt search the title and description; title:, buyer:, buyer_id:
and cpv: search only their own field, and a leading ! leaves out what a
term matches. Repeats of one prompt are OR, everything else AND. CPV
terms are checked per code: cpv:72 !cpv:7221 needs a code starting 72
that doesn't start 7221.

Unknown prompts are reported, and every response carries the help that
the search box's "?" panel shows. Migration 00011 adds the description
and buyer name to the full-text index, and indexes CPV descriptions.
2026-10-22 13:10:25 +01:00

120 lines
4.2 KiB
SQL

-- +goose Up
-- +goose StatementBegin
-- The general search: opportunities_fts (migration 00006) now also indexes
-- the description and the buyer's name, and classification_codes_fts
-- indexes classification descriptions. Both are kept in sync by triggers.
DROP TRIGGER IF EXISTS "opportunities_fts_update";
DROP TRIGGER IF EXISTS "opportunities_fts_delete";
DROP TRIGGER IF EXISTS "opportunities_fts_insert";
DROP TABLE IF EXISTS "opportunities_fts";
CREATE VIRTUAL TABLE "opportunities_fts" USING fts5(
"title",
"description",
"buyer_name",
content = 'opportunities',
content_rowid = 'id',
tokenize = 'porter unicode61 remove_diacritics 2'
);
CREATE TRIGGER "opportunities_fts_insert" AFTER INSERT ON "opportunities"
BEGIN
INSERT INTO "opportunities_fts" ("rowid", "title", "description", "buyer_name")
VALUES (new."id", new."title", new."description", new."buyer_name");
END;
CREATE TRIGGER "opportunities_fts_delete" AFTER DELETE ON "opportunities"
BEGIN
INSERT INTO "opportunities_fts"
("opportunities_fts", "rowid", "title", "description", "buyer_name")
VALUES ('delete', old."id", old."title", old."description", old."buyer_name");
END;
CREATE TRIGGER "opportunities_fts_update"
AFTER UPDATE OF "title", "description", "buyer_name" ON "opportunities"
BEGIN
INSERT INTO "opportunities_fts"
("opportunities_fts", "rowid", "title", "description", "buyer_name")
VALUES ('delete', old."id", old."title", old."description", old."buyer_name");
INSERT INTO "opportunities_fts" ("rowid", "title", "description", "buyer_name")
VALUES (new."id", new."title", new."description", new."buyer_name");
END;
INSERT INTO "opportunities_fts" ("opportunities_fts") VALUES ('rebuild');
CREATE VIRTUAL TABLE "classification_codes_fts" USING fts5(
"classification",
content = 'classification_codes',
content_rowid = 'id',
tokenize = 'porter unicode61 remove_diacritics 2'
);
CREATE TRIGGER "classification_codes_fts_insert"
AFTER INSERT ON "classification_codes"
BEGIN
INSERT INTO "classification_codes_fts" ("rowid", "classification")
VALUES (new."id", new."classification");
END;
CREATE TRIGGER "classification_codes_fts_delete"
AFTER DELETE ON "classification_codes"
BEGIN
INSERT INTO "classification_codes_fts"
("classification_codes_fts", "rowid", "classification")
VALUES ('delete', old."id", old."classification");
END;
CREATE TRIGGER "classification_codes_fts_update"
AFTER UPDATE OF "classification" ON "classification_codes"
BEGIN
INSERT INTO "classification_codes_fts"
("classification_codes_fts", "rowid", "classification")
VALUES ('delete', old."id", old."classification");
INSERT INTO "classification_codes_fts" ("rowid", "classification")
VALUES (new."id", new."classification");
END;
INSERT INTO "classification_codes_fts" ("classification_codes_fts")
VALUES ('rebuild');
-- +goose StatementEnd
-- +goose Down
-- +goose StatementBegin
DROP TRIGGER IF EXISTS "classification_codes_fts_update";
DROP TRIGGER IF EXISTS "classification_codes_fts_delete";
DROP TRIGGER IF EXISTS "classification_codes_fts_insert";
DROP TABLE IF EXISTS "classification_codes_fts";
DROP TRIGGER IF EXISTS "opportunities_fts_update";
DROP TRIGGER IF EXISTS "opportunities_fts_delete";
DROP TRIGGER IF EXISTS "opportunities_fts_insert";
DROP TABLE IF EXISTS "opportunities_fts";
CREATE VIRTUAL TABLE "opportunities_fts" USING fts5(
"title",
content = 'opportunities',
content_rowid = 'id',
tokenize = 'porter unicode61 remove_diacritics 2'
);
CREATE TRIGGER "opportunities_fts_insert" AFTER INSERT ON "opportunities"
BEGIN
INSERT INTO "opportunities_fts" ("rowid", "title") VALUES (new."id", new."title");
END;
CREATE TRIGGER "opportunities_fts_delete" AFTER DELETE ON "opportunities"
BEGIN
INSERT INTO "opportunities_fts" ("opportunities_fts", "rowid", "title")
VALUES ('delete', old."id", old."title");
END;
CREATE TRIGGER "opportunities_fts_update" AFTER UPDATE OF "title" ON "opportunities"
BEGIN
INSERT INTO "opportunities_fts" ("opportunities_fts", "rowid", "title")
VALUES ('delete', old."id", old."title");
INSERT INTO "opportunities_fts" ("rowid", "title") VALUES (new."id", new."title");
END;
INSERT INTO "opportunities_fts" ("opportunities_fts") VALUES ('rebuild');
-- +goose StatementEnd