diff --git a/src/plugins/built-in/globalSearch/src/components/items/SubjectItem.svelte b/src/plugins/built-in/globalSearch/src/components/items/SubjectItem.svelte index 776960de..b6063505 100755 --- a/src/plugins/built-in/globalSearch/src/components/items/SubjectItem.svelte +++ b/src/plugins/built-in/globalSearch/src/components/items/SubjectItem.svelte @@ -46,7 +46,7 @@ >
- {item.metadata?.type === 'assessments' ? '\uebee' : '\uec0a'} + {item.metadata?.type === 'assessments' ? '\ueac3' : '\ueb4d'}
{@html stripHtmlButKeepHighlights(highlightMatch(item.text, searchTerm, matches))} diff --git a/src/plugins/built-in/globalSearch/src/indexing/jobs/subjects.ts b/src/plugins/built-in/globalSearch/src/indexing/jobs/subjects.ts index f8e7e173..0150f66e 100755 --- a/src/plugins/built-in/globalSearch/src/indexing/jobs/subjects.ts +++ b/src/plugins/built-in/globalSearch/src/indexing/jobs/subjects.ts @@ -63,6 +63,10 @@ export const subjectsJob: Job = { const id = `${semester.code}-${subject.code}-${subject.metaclass}`; if (existingIds.has(id)) continue; + // Extract year level from subject code (assuming format like "YEAR10" or "10ENG") + const yearLevel = subject.code.match(/^YEAR(\d+)|^(\d+)/i)?.[1] || subject.code.match(/^(\d+)/)?.[1] || 0; + const isActive = subject.active === 1; + // Create two items for each subject - one for assessments and one for course items.push( { @@ -78,7 +82,9 @@ export const subjectsJob: Job = { programme: subject.programme, semesterCode: semester.code, semesterDescription: semester.description, - type: "assessments" + type: "assessments", + yearLevel: Number(yearLevel), + isActive }, actionId: "subject-assessments", renderComponentId: "subject", @@ -96,7 +102,9 @@ export const subjectsJob: Job = { programme: subject.programme, semesterCode: semester.code, semesterDescription: semester.description, - type: "course" + type: "course", + yearLevel: Number(yearLevel), + isActive }, actionId: "subject-course", renderComponentId: "subject", diff --git a/src/plugins/built-in/globalSearch/src/search/searchUtils.ts b/src/plugins/built-in/globalSearch/src/search/searchUtils.ts index 17cc86ad..68c3d650 100644 --- a/src/plugins/built-in/globalSearch/src/search/searchUtils.ts +++ b/src/plugins/built-in/globalSearch/src/search/searchUtils.ts @@ -25,15 +25,16 @@ export function createSearchIndexes() { { name: "content", weight: 1 }, { name: "category", weight: 1 }, { name: "metadata.subjectName", weight: 3 }, - { name: "metadata.subjectCode", weight: 2 }, - { name: "metadata.semesterDescription", weight: 1 } + { name: "metadata.subjectCode", weight: 2.5 }, + { name: "metadata.semesterDescription", weight: 1 }, + { name: "metadata.yearLevel", weight: 1.5 } ], includeScore: true, includeMatches: true, - threshold: 0.4, // Lower threshold to be more lenient + threshold: 0.4, minMatchCharLength: 2, - distance: 100, // Increased distance to allow for more fuzzy matches - useExtendedSearch: true, // Enable extended search for better matching + distance: 100, + useExtendedSearch: true, }; return { @@ -123,14 +124,15 @@ export function searchDynamicItems( if (hasSubjectMatch) { score += 20; // Boost score for direct subject matches } - // Boost for higher year levels - const yearMatch = /^Year (\d+)/i.exec(item.metadata?.subjectName || ""); - if (yearMatch) { - const yearNum = parseInt(yearMatch[1], 10); - if (!isNaN(yearNum)) { - score += yearNum; // Boost by year number - } + + // Boost for active subjects + if (item.metadata?.isActive) { + score += 15; // Boost for active subjects } + + // Boost for year level + const yearLevel = item.metadata?.yearLevel || 0; + score += yearLevel; // Add year level to score } const ageInDays = (now - item.dateAdded) / (1000 * 60 * 60 * 24);