From 34024d70c28155d266c07ef85e430d03ce583d3c Mon Sep 17 00:00:00 2001 From: SethBurkart123 Date: Mon, 26 May 2025 21:45:17 +1000 Subject: [PATCH] feat: performance and visual improvements --- .../src/components/SearchBar.svelte | 5 --- .../src/components/items/ForumItem.svelte | 2 +- .../globalSearch/src/indexing/actions.ts | 4 ++ .../globalSearch/src/indexing/jobs/forums.ts | 7 ++-- .../src/indexing/jobs/subjects.ts | 2 +- .../globalSearch/src/search/searchUtils.ts | 41 +------------------ .../src/search/vector/vectorSearch.ts | 8 +++- 7 files changed, 17 insertions(+), 52 deletions(-) diff --git a/src/plugins/built-in/globalSearch/src/components/SearchBar.svelte b/src/plugins/built-in/globalSearch/src/components/SearchBar.svelte index 98d18ab8..9b1c62f0 100644 --- a/src/plugins/built-in/globalSearch/src/components/SearchBar.svelte +++ b/src/plugins/built-in/globalSearch/src/components/SearchBar.svelte @@ -18,11 +18,9 @@ const { transparencyEffects, - showRecentFirst, searchHotkey: initialSearchHotkey } = $props<{ transparencyEffects: boolean, - showRecentFirst: boolean, searchHotkey: string }>(); @@ -170,10 +168,7 @@ combinedResults = await doSearch( term, commandsFuse, - dynamicContentFuse, commandIdToItemMap, - dynamicIdToItemMap, - showRecentFirst ); } else { combinedResults = []; diff --git a/src/plugins/built-in/globalSearch/src/components/items/ForumItem.svelte b/src/plugins/built-in/globalSearch/src/components/items/ForumItem.svelte index 6a43833e..ed0283f2 100644 --- a/src/plugins/built-in/globalSearch/src/components/items/ForumItem.svelte +++ b/src/plugins/built-in/globalSearch/src/components/items/ForumItem.svelte @@ -19,7 +19,7 @@ >
{item.metadata?.icon || '\uebe7'}
- + diff --git a/src/plugins/built-in/globalSearch/src/indexing/actions.ts b/src/plugins/built-in/globalSearch/src/indexing/actions.ts index 9d43071a..ddf28387 100644 --- a/src/plugins/built-in/globalSearch/src/indexing/actions.ts +++ b/src/plugins/built-in/globalSearch/src/indexing/actions.ts @@ -80,4 +80,8 @@ export const actionMap: Record> = { subjectcourse: ((item: IndexItem) => { window.location.href = `/#?page=/courses/${item.metadata.programme}:${item.metadata.subjectId}`; }) as ActionHandler, + + forum: ((item: IndexItem) => { + window.location.href = `/#?page=/forums/${item.metadata.forumId}`; + }) as ActionHandler, }; diff --git a/src/plugins/built-in/globalSearch/src/indexing/jobs/forums.ts b/src/plugins/built-in/globalSearch/src/indexing/jobs/forums.ts index 708eaa62..24541831 100644 --- a/src/plugins/built-in/globalSearch/src/indexing/jobs/forums.ts +++ b/src/plugins/built-in/globalSearch/src/indexing/jobs/forums.ts @@ -51,6 +51,7 @@ export const forumsJob: Job = { forumId: forum.id, owner: forum.owner, title: forum.title, + closed: forum.closed, }, actionId: "forum", renderComponentId: "forum", @@ -60,9 +61,9 @@ export const forumsJob: Job = { return items; }, - /** Keep only forums from the last 2 years. */ + /** Keep only forums from the last year. */ purge: (items) => { - const twoYearsAgo = Date.now() - 2 * 365 * 24 * 60 * 60 * 1000; - return items.filter((i) => i.dateAdded >= twoYearsAgo); + const oneYearAgo = Date.now() - 365 * 24 * 60 * 60 * 1000; + return items.filter((i) => i.dateAdded >= oneYearAgo); }, }; \ No newline at end of file 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 f419c3d6..5f41272f 100755 --- a/src/plugins/built-in/globalSearch/src/indexing/jobs/subjects.ts +++ b/src/plugins/built-in/globalSearch/src/indexing/jobs/subjects.ts @@ -27,7 +27,7 @@ export const subjectsJob: Job = { let score = 0; if (item.metadata.isActive) { - score += 1; // Boost for active subjects + score += 0.01; // Boost for active subjects } else { score -= 50; // Penalty for inactive subjects } diff --git a/src/plugins/built-in/globalSearch/src/search/searchUtils.ts b/src/plugins/built-in/globalSearch/src/search/searchUtils.ts index 3041829e..6982e286 100644 --- a/src/plugins/built-in/globalSearch/src/search/searchUtils.ts +++ b/src/plugins/built-in/globalSearch/src/search/searchUtils.ts @@ -130,10 +130,7 @@ export function searchDynamicItems( export async function performSearch( query: string, commandsFuse: Fuse, - dynamicContentFuse: Fuse, commandIdToItemMap: Map, - dynamicIdToItemMap: Map, - showRecentFirst: boolean, ): Promise { // Get all results first const commandResults = searchCommands( @@ -141,18 +138,11 @@ export async function performSearch( query, commandIdToItemMap, ); - const dynamicResults = searchDynamicItems( - dynamicContentFuse, - query, - dynamicIdToItemMap, - 10, - showRecentFirst, - ); // Get vector results in parallel let vectorResults: VectorSearchResult[] = []; try { - vectorResults = await searchVectors(query, 10); + vectorResults = await searchVectors(query); } catch (e) {} // Create a map to store our final results, using ID as key to avoid duplicates @@ -164,35 +154,6 @@ export async function performSearch( // Process dynamic results and vector results together const seenIds = new Set(); - // Add dynamic results first - dynamicResults.forEach((r) => { - seenIds.add(r.id); - - if (r.type === "dynamic") { - const dynamicItem = r.item as IndexItem; - const job = jobs[dynamicItem.category]; - if (job && typeof job.boostCriteria === 'function') { - const boost = job.boostCriteria(dynamicItem, query); - if (boost) { - r.score += boost; // Add the boost to the score - } - } - } - - const vectorMatch = vectorResults.find((v) => v.object.id === r.id); - if (vectorMatch) { - // If we found it in both searches, combine the scores - resultMap.set(r.id, { - ...r, - score: r.score + vectorMatch.similarity * 0.6, // Boost exact matches - }); - } else { - // If only in Fuse results, keep as is - resultMap.set(r.id, r); - } - }); - - // Now add any vector results we haven't seen yet vectorResults.forEach((v) => { const id = v.object.id; diff --git a/src/plugins/built-in/globalSearch/src/search/vector/vectorSearch.ts b/src/plugins/built-in/globalSearch/src/search/vector/vectorSearch.ts index a67fe405..e081ccaf 100644 --- a/src/plugins/built-in/globalSearch/src/search/vector/vectorSearch.ts +++ b/src/plugins/built-in/globalSearch/src/search/vector/vectorSearch.ts @@ -20,7 +20,7 @@ export interface VectorSearchResult extends SearchResult { export async function searchVectors( query: string, - topK: number = 10, + topK: number = 20, ): Promise { if (!vectorIndex) await initVectorSearch(); @@ -32,7 +32,11 @@ export async function searchVectors( dedupeEntries: true, }); - return results as VectorSearchResult[]; + // filter results with a similarity below 0.81 + const filteredResults = results.filter((r) => r.similarity > 0.81); + console.log("Vector search results", filteredResults); + + return filteredResults as VectorSearchResult[]; } export async function refreshVectorCache() {