From 081a14d6f3ca3664aabdd06aaf06080dcba17c25 Mon Sep 17 00:00:00 2001 From: syuilo Date: Sat, 8 Jul 2023 16:53:07 +0900 Subject: perf(backend): use limit() instead of take() --- packages/backend/src/core/SearchService.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'packages/backend/src/core/SearchService.ts') diff --git a/packages/backend/src/core/SearchService.ts b/packages/backend/src/core/SearchService.ts index 9502afcc9b..956c4cc09c 100644 --- a/packages/backend/src/core/SearchService.ts +++ b/packages/backend/src/core/SearchService.ts @@ -174,7 +174,7 @@ export class SearchService { if (me) this.queryService.generateMutedUserQuery(query, me); if (me) this.queryService.generateBlockedUserQuery(query, me); - return await query.take(pagination.limit).getMany(); + return await query.limit(pagination.limit).getMany(); } } } -- cgit v1.2.3-freya From 60366a45585654115d5178486cc747cf0ee9450a Mon Sep 17 00:00:00 2001 From: Caipira Date: Sat, 8 Jul 2023 21:31:38 +0900 Subject: fix(backend): Remove Meilisearch index when notes are deleted (#10988) * fix(backend): Include feature to delete Meilisearch index notes * Update variable name `cascadingNotesFilter` -> `federatedLocalCascadingNotes` * tweak --------- Co-authored-by: syuilo --- packages/backend/src/core/NoteDeleteService.ts | 14 +++++++++++--- packages/backend/src/core/SearchService.ts | 9 +++++++++ .../src/queue/processors/DeleteAccountProcessorService.ts | 6 ++++++ 3 files changed, 26 insertions(+), 3 deletions(-) (limited to 'packages/backend/src/core/SearchService.ts') diff --git a/packages/backend/src/core/NoteDeleteService.ts b/packages/backend/src/core/NoteDeleteService.ts index 10381c7e65..f77ea8aab4 100644 --- a/packages/backend/src/core/NoteDeleteService.ts +++ b/packages/backend/src/core/NoteDeleteService.ts @@ -17,6 +17,7 @@ import { UserEntityService } from '@/core/entities/UserEntityService.js'; import { NoteEntityService } from '@/core/entities/NoteEntityService.js'; import { bindThis } from '@/decorators.js'; import { MetaService } from '@/core/MetaService.js'; +import { SearchService } from '@/core/SearchService.js'; @Injectable() export class NoteDeleteService { @@ -41,6 +42,7 @@ export class NoteDeleteService { private apRendererService: ApRendererService, private apDeliverManagerService: ApDeliverManagerService, private metaService: MetaService, + private searchService: SearchService, private notesChart: NotesChart, private perUserNotesChart: PerUserNotesChart, private instanceChart: InstanceChart, @@ -53,6 +55,7 @@ export class NoteDeleteService { */ async delete(user: { id: User['id']; uri: User['uri']; host: User['host']; isBot: User['isBot']; }, note: Note, quiet = false) { const deletedAt = new Date(); + const cascadingNotes = await this.findCascadingNotes(note); // この投稿を除く指定したユーザーによる指定したノートのリノートが存在しないとき if (note.renoteId && (await this.noteEntityService.countSameRenotes(user.id, note.renoteId, note.id)) === 0) { @@ -88,8 +91,8 @@ export class NoteDeleteService { } // also deliever delete activity to cascaded notes - const cascadingNotes = (await this.findCascadingNotes(note)).filter(note => !note.localOnly); // filter out local-only notes - for (const cascadingNote of cascadingNotes) { + const federatedLocalCascadingNotes = (cascadingNotes).filter(note => !note.localOnly && note.userHost == null); // filter out local-only notes + for (const cascadingNote of federatedLocalCascadingNotes) { if (!cascadingNote.user) continue; if (!this.userEntityService.isLocalUser(cascadingNote.user)) continue; const content = this.apRendererService.addContext(this.apRendererService.renderDelete(this.apRendererService.renderTombstone(`${this.config.url}/notes/${cascadingNote.id}`), cascadingNote.user)); @@ -114,6 +117,11 @@ export class NoteDeleteService { } } + for (const cascadingNote of cascadingNotes) { + this.searchService.unindexNote(cascadingNote); + } + this.searchService.unindexNote(note); + await this.notesRepository.delete({ id: note.id, userId: user.id, @@ -140,7 +148,7 @@ export class NoteDeleteService { const cascadingNotes: Note[] = await recursive(note.id); - return cascadingNotes.filter(note => note.userHost === null); // filter out non-local users + return cascadingNotes; } @bindThis diff --git a/packages/backend/src/core/SearchService.ts b/packages/backend/src/core/SearchService.ts index 956c4cc09c..28b8ee8073 100644 --- a/packages/backend/src/core/SearchService.ts +++ b/packages/backend/src/core/SearchService.ts @@ -115,6 +115,15 @@ export class SearchService { } } + @bindThis + public async unindexNote(note: Note): Promise { + if (!['home', 'public'].includes(note.visibility)) return; + + if (this.meilisearch) { + this.meilisearchNoteIndex!.deleteDocument(note.id); + } + } + @bindThis public async searchNote(q: string, me: User | null, opts: { userId?: Note['userId'] | null; diff --git a/packages/backend/src/queue/processors/DeleteAccountProcessorService.ts b/packages/backend/src/queue/processors/DeleteAccountProcessorService.ts index 39dd801af0..65ded170b7 100644 --- a/packages/backend/src/queue/processors/DeleteAccountProcessorService.ts +++ b/packages/backend/src/queue/processors/DeleteAccountProcessorService.ts @@ -12,6 +12,7 @@ import { bindThis } from '@/decorators.js'; import { QueueLoggerService } from '../QueueLoggerService.js'; import type * as Bull from 'bullmq'; import type { DbUserDeleteJobData } from '../types.js'; +import { SearchService } from "@/core/SearchService.js"; @Injectable() export class DeleteAccountProcessorService { @@ -36,6 +37,7 @@ export class DeleteAccountProcessorService { private driveService: DriveService, private emailService: EmailService, private queueLoggerService: QueueLoggerService, + private searchService: SearchService, ) { this.logger = this.queueLoggerService.logger.createSubLogger('delete-account'); } @@ -71,6 +73,10 @@ export class DeleteAccountProcessorService { cursor = notes[notes.length - 1].id; await this.notesRepository.delete(notes.map(note => note.id)); + + for (const note of notes) { + await this.searchService.unindexNote(note); + } } this.logger.succ('All of notes deleted'); -- cgit v1.2.3-freya From 9e330c9e38175012e4ca8f81ce9d3f05b7db7510 Mon Sep 17 00:00:00 2001 From: まっちゃとーにゅ <17376330+u1-liquid@users.noreply.github.com> Date: Sat, 15 Jul 2023 09:59:19 +0900 Subject: feat: MeilisearchにIndexするノートの範囲を設定できるように (#11282) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .config/example.yml | 1 + packages/backend/src/config.ts | 1 + packages/backend/src/core/SearchService.ts | 22 +++++++++++++++++++++- 3 files changed, 23 insertions(+), 1 deletion(-) (limited to 'packages/backend/src/core/SearchService.ts') diff --git a/.config/example.yml b/.config/example.yml index c179395966..c8735bf699 100644 --- a/.config/example.yml +++ b/.config/example.yml @@ -104,6 +104,7 @@ redis: # apiKey: '' # ssl: true # index: '' +# scope: local # ┌───────────────┐ #───┘ ID generation └─────────────────────────────────────────── diff --git a/packages/backend/src/config.ts b/packages/backend/src/config.ts index 9d1945e4d4..23ed6e59bc 100644 --- a/packages/backend/src/config.ts +++ b/packages/backend/src/config.ts @@ -63,6 +63,7 @@ export type Source = { apiKey: string; ssl?: boolean; index: string; + scope?: 'local' | 'global' | string[]; }; proxy?: string; diff --git a/packages/backend/src/core/SearchService.ts b/packages/backend/src/core/SearchService.ts index 28b8ee8073..392799da75 100644 --- a/packages/backend/src/core/SearchService.ts +++ b/packages/backend/src/core/SearchService.ts @@ -52,6 +52,7 @@ function compileQuery(q: Q): string { @Injectable() export class SearchService { + private readonly meilisearchIndexScope: 'local' | 'global' | string[] = 'local'; private meilisearchNoteIndex: Index | null = null; constructor( @@ -92,6 +93,10 @@ export class SearchService { }, }); } + + if (config.meilisearch?.scope) { + this.meilisearchIndexScope = config.meilisearch.scope; + } } @bindThis @@ -100,7 +105,22 @@ export class SearchService { if (!['home', 'public'].includes(note.visibility)) return; if (this.meilisearch) { - this.meilisearchNoteIndex!.addDocuments([{ + switch (this.meilisearchIndexScope) { + case 'global': + break; + + case 'local': + if (note.userHost == null) break; + return; + + default: { + if (note.userHost == null) break; + if (this.meilisearchIndexScope.includes(note.userHost)) break; + return; + } + } + + await this.meilisearchNoteIndex?.addDocuments([{ id: note.id, createdAt: note.createdAt.getTime(), userId: note.userId, -- cgit v1.2.3-freya