발행된 사이트에 업체별 SEO/AEO 키워드를 제공하는 서비스. - PostgreSQL 16 + pgvector/ltree/pg_trgm 단일 스토어 (정확·의미·계층 조회를 한 엔진에서 처리) - 키워드는 전역 사전 + merchant_keyword 연결 테이블 구조 - 4단계 계단식 중복제거: 금칙어 → normalized 완전일치 → pg_trgm → 코사인 유사도, 걸린 표기는 aliases[] 로 흡수 - BullMQ 생성 큐 (발행 즉시 / 일 1회 크론 / 성과 기반) - OpenAI Structured Outputs + mock provider (API 키 없이 로컬 전 구간 동작) - 서빙 API: /v1/sites/:id/seo, /aeo, /performance, /keywords/search - docs/architecture.html 설계 도식 JSON-LD 조립과 o2o-site-AEO 연동은 후속 작업. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
25 lines
656 B
TypeScript
25 lines
656 B
TypeScript
import { readFileSync, readdirSync } from 'node:fs';
|
|
import { join } from 'node:path';
|
|
import { createSql } from './db';
|
|
|
|
async function main() {
|
|
const sql = createSql();
|
|
const dir = join(process.cwd(), 'drizzle');
|
|
const files = readdirSync(dir).filter((f) => f.endsWith('.sql')).sort();
|
|
|
|
for (const file of files) {
|
|
const ddl = readFileSync(join(dir, file), 'utf8');
|
|
process.stdout.write(`▶ applying ${file} ... `);
|
|
await sql.unsafe(ddl);
|
|
process.stdout.write('done\n');
|
|
}
|
|
|
|
await sql.end();
|
|
console.log('✅ migration complete');
|
|
}
|
|
|
|
main().catch((e) => {
|
|
console.error('❌ migration failed:', e);
|
|
process.exit(1);
|
|
});
|