From c86cda00aec5ba448a93d5d3cff4cdc684b078c7 Mon Sep 17 00:00:00 2001 From: caadiq Date: Sun, 8 Feb 2026 09:50:54 +0900 Subject: [PATCH] =?UTF-8?q?fix(meilisearch):=20=EC=A0=84=EC=B2=B4=20?= =?UTF-8?q?=EB=8F=99=EA=B8=B0=ED=99=94=20=EC=8B=9C=20DB=EC=97=90=20?= =?UTF-8?q?=EC=97=86=EB=8A=94=20=EB=AC=B8=EC=84=9C=20=EC=82=AD=EC=A0=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - syncAllSchedules()에서 Meilisearch의 모든 문서 ID 조회 - DB에 없는 문서는 Meilisearch에서 삭제 - 삭제된 일정이 검색에 계속 나타나는 문제 해결 Co-Authored-By: Claude Opus 4.5 --- backend/src/services/meilisearch/index.js | 22 +++++++++++++++++++++- 1 file changed, 21 insertions(+), 1 deletion(-) diff --git a/backend/src/services/meilisearch/index.js b/backend/src/services/meilisearch/index.js index f0552a7..3b87913 100644 --- a/backend/src/services/meilisearch/index.js +++ b/backend/src/services/meilisearch/index.js @@ -271,7 +271,7 @@ export async function deleteSchedule(meilisearch, scheduleId) { } /** - * 전체 일정 동기화 + * 전체 일정 동기화 (DB에 없는 문서는 삭제) */ export async function syncAllSchedules(meilisearch, db) { try { @@ -303,6 +303,26 @@ export async function syncAllSchedules(meilisearch, db) { `); const index = meilisearch.index(INDEX_NAME); + const dbIds = new Set(schedules.map(s => s.id)); + + // Meilisearch에서 모든 문서 ID 조회 + let meiliIds = []; + let offset = 0; + const limit = 1000; + while (true) { + const docs = await index.getDocuments({ offset, limit, fields: ['id'] }); + if (docs.results.length === 0) break; + meiliIds.push(...docs.results.map(d => d.id)); + if (docs.results.length < limit) break; + offset += limit; + } + + // DB에 없는 문서 삭제 + const idsToDelete = meiliIds.filter(id => !dbIds.has(id)); + if (idsToDelete.length > 0) { + await index.deleteDocuments(idsToDelete); + logger.info(`${idsToDelete.length}개 문서 삭제`); + } // 문서 변환 (addDocuments는 같은 ID면 자동 업데이트) const documents = schedules.map(s => ({