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 => ({