From 942fc72590e7231fe722ee2c491746d836af35e0 Mon Sep 17 00:00:00 2001 From: Philipinho <16838612+Philipinho@users.noreply.github.com> Date: Tue, 29 Sep 2026 20:25:13 +0100 Subject: [PATCH] fix search limit and performance --- apps/server/src/core/search/dto/search.dto.ts | 5 ++++ apps/server/src/core/search/search.service.ts | 28 +++++++++++++++---- apps/server/src/ee | 2 +- 3 files changed, 28 insertions(+), 7 deletions(-) diff --git a/apps/server/src/core/search/dto/search.dto.ts b/apps/server/src/core/search/dto/search.dto.ts index b9d09d17d..e966dc8a5 100644 --- a/apps/server/src/core/search/dto/search.dto.ts +++ b/apps/server/src/core/search/dto/search.dto.ts @@ -6,11 +6,15 @@ import { IsOptional, IsString, IsUUID, + MaxLength, } from 'class-validator'; +export const SEARCH_QUERY_MAX_LENGTH = 200; + export class SearchDTO { @IsOptional() @IsString() + @MaxLength(SEARCH_QUERY_MAX_LENGTH) query?: string; @IsOptional() @@ -61,6 +65,7 @@ export class SearchPublicSpaceDTO extends SearchDTO { export class SearchSuggestionDTO { @IsString() + @MaxLength(SEARCH_QUERY_MAX_LENGTH) query: string; @IsOptional() diff --git a/apps/server/src/core/search/search.service.ts b/apps/server/src/core/search/search.service.ts index f8e8e5517..4e548dd9f 100644 --- a/apps/server/src/core/search/search.service.ts +++ b/apps/server/src/core/search/search.service.ts @@ -55,11 +55,6 @@ export class SearchService { : sql`ts_rank(tsv, to_tsquery('english', f_unaccent(${searchQuery})))`.as( 'rank', ); - const highlightColumn = browseByFilters || titleOnly - ? sql`''`.as('highlight') - : sql`ts_headline('english', text_content, to_tsquery('english', f_unaccent(${searchQuery})),'MinWords=9, MaxWords=10, MaxFragments=3')`.as( - 'highlight', - ); let queryResults = this.db .selectFrom('pages') @@ -73,7 +68,6 @@ export class SearchService { 'createdAt', 'updatedAt', rankColumn, - highlightColumn, ]) .$if(!browseByFilters && !titleOnly, (qb) => qb.where( @@ -189,10 +183,32 @@ export class SearchService { results = results.filter((r: any) => accessibleSet.has(r.id)); } + if (!browseByFilters && !titleOnly && results.length > 0) { + const highlights = await this.db + .selectFrom('pages') + .select([ + 'id', + sql`ts_headline('english', substring(text_content, 1, 100000), to_tsquery('english', f_unaccent(${searchQuery})),'MinWords=9, MaxWords=10, MaxFragments=3')`.as( + 'highlight', + ), + ]) + .where( + 'id', + 'in', + results.map((r: any) => r.id), + ) + .execute(); + const highlightById = new Map(highlights.map((h) => [h.id, h.highlight])); + for (const result of results) { + result.highlight = highlightById.get(result.id) ?? ''; + } + } + //@ts-ignore const searchResults = results.map((result: SearchResponseDto) => { result.wholeWord = true if (!result.highlight) { + result.highlight = ''; result.matchedText = []; return result; } diff --git a/apps/server/src/ee b/apps/server/src/ee index 5e7120dcc..9134679e3 160000 --- a/apps/server/src/ee +++ b/apps/server/src/ee @@ -1 +1 @@ -Subproject commit 5e7120dcc86a344f5af09ccda0a29d5784659938 +Subproject commit 9134679e37e8ccd0f79e6f6c05da8e238778420d