feat(sok): bredare sok - hogtidsnamn, ingredienser och kock

Soket matchar nu aven hogtidsnamn (julafton -> julmat), ingredienser (lax ->
alla laxrecept) och kocknamn (ramsay -> Gordon-recept), utover titel/trigram.
Fortfarande inga falska traffar (pannkakor ger bara pannkakor).
This commit is contained in:
Claude
2026-08-19 20:18:03 +00:00
parent 15e48c8704
commit b052d919cf
+7
View File
@@ -132,6 +132,13 @@ export async function recommendationRoutes(app: FastifyInstance) {
? or(
ilike(schema.recipes.titleSv, `%${q.search}%`),
sql`similarity(${schema.recipes.titleSv}, ${q.search}) > 0.3`,
// Högtidsnamn: "julafton"/"midsommar" → recept taggade med en högtid
// vars slug eller namn ryms i söktermen (man slipper kunna exakt slug).
sql`EXISTS (SELECT 1 FROM season_events se WHERE se.slug = ANY(${schema.recipes.holidayTags}) AND (lower(${q.search}) LIKE '%' || lower(se.slug) || '%' OR lower(${q.search}) LIKE '%' || lower(se.name_sv) || '%'))`,
// Ingrediens: "lax"/"kyckling" → recept som innehåller en matchande ingrediens.
sql`EXISTS (SELECT 1 FROM recipe_ingredients ri JOIN canonical_ingredients ci ON ci.id = ri.canonical_ingredient_id WHERE ri.recipe_id = ${schema.recipes.id} AND ci.name_sv ILIKE ${"%" + q.search + "%"})`,
// Kock/källa: "ramsay"/"ottolenghi" → recept krediterade den kocken.
ilike(schema.recipes.creatorDisplayName, `%${q.search}%`),
)
: q.holiday
? sql`${q.holiday} = ANY(${schema.recipes.holidayTags})`