-- 문서 chunk 단위 검색 테이블 (chunk 중심 retrieval) -- Phase 0.1: 문서를 의미 단위(조항/문단/슬라이딩 윈도우)로 쪼개어 별도 테이블에 저장 -- 검색 품질 승부처는 chunk 품질 + reranker 입력 품질 CREATE TABLE document_chunks ( id BIGSERIAL PRIMARY KEY, doc_id BIGINT REFERENCES documents(id) ON DELETE CASCADE NOT NULL, chunk_index INTEGER NOT NULL, -- 문서 내 순서 -- chunking 전략 메타 chunk_type VARCHAR(30) NOT NULL, -- legal_article | paragraph | section | window | email_body section_title TEXT, -- "제80조", "3.1 Methods" 등 heading_path TEXT, -- "Chapter 3 > Section 2" page INTEGER, -- PDF 페이지 번호 -- 다국어 및 domain-aware retrieval 메타 language VARCHAR(10), -- ko | en | ja | zh | fr | de country VARCHAR(10), -- KR | US | JP | CN | FR | DE (뉴스 필수) source VARCHAR(100), -- 경향신문 | NYT | ... (뉴스 필수) domain_category VARCHAR(20) NOT NULL, -- document | news (파이프라인 분기 키) -- 본문 + 임베딩 text TEXT NOT NULL, embedding vector(1024), -- bge-m3 created_at TIMESTAMPTZ DEFAULT NOW(), updated_at TIMESTAMPTZ DEFAULT NOW(), UNIQUE (doc_id, chunk_index) ); -- 벡터 유사도 인덱스 (IVFFlat, cosine) -- lists는 데이터 증가에 따라 조정 필요. 초기 500-5000 chunks 기준. CREATE INDEX idx_chunks_embedding ON document_chunks USING ivfflat (embedding vector_cosine_ops) WITH (lists = 100); -- FTS 인덱스 (simple tokenizer — 한국어는 trigram 보조) CREATE INDEX idx_chunks_fts ON document_chunks USING GIN (to_tsvector('simple', text)); -- Trigram 인덱스 (한국어/부분매치 보조) CREATE EXTENSION IF NOT EXISTS pg_trgm; CREATE INDEX idx_chunks_trgm ON document_chunks USING GIN (text gin_trgm_ops); -- 필터용 B-tree 인덱스 CREATE INDEX idx_chunks_doc_id ON document_chunks (doc_id); CREATE INDEX idx_chunks_domain_category ON document_chunks (domain_category); CREATE INDEX idx_chunks_country ON document_chunks (country) WHERE country IS NOT NULL; CREATE INDEX idx_chunks_source ON document_chunks (source) WHERE source IS NOT NULL; CREATE INDEX idx_chunks_language ON document_chunks (language) WHERE language IS NOT NULL; -- chunk stage 추가 (processing_queue에서 chunk 단계로 처리) ALTER TYPE process_stage ADD VALUE IF NOT EXISTS 'chunk';