|
3 | 3 | * 흐름: 확장 활성화 → age_theme(제약/인덱스) → vocab_term(제약/인덱스) → ANALYZE |
4 | 4 | */ |
5 | 5 |
|
6 | | --- 확장 활성화 |
| 6 | +-- next 확장 활성화 |
7 | 7 | CREATE EXTENSION IF NOT EXISTS vector; |
8 | 8 |
|
9 | | --- age_theme 테이블 생성 |
| 9 | +-- next age_theme 테이블 생성 |
10 | 10 | CREATE TABLE IF NOT EXISTS age_theme ( |
11 | | - id BIGINT GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY, |
12 | | - min_age INT NOT NULL, |
13 | | - max_age INT NOT NULL, |
14 | | - category VARCHAR(32) NOT NULL |
| 11 | + id BIGINT GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY, |
| 12 | + min_age INT NOT NULL, |
| 13 | + max_age INT NOT NULL, |
| 14 | + category VARCHAR(32) NOT NULL |
15 | 15 | CHECK (category IN ('EDUCATION','CAREER','RELATIONSHIP','FINANCE','HEALTH','LOCATION','ETC')), |
16 | | - theme TEXT NOT NULL, |
17 | | - embedding VECTOR(768) NOT NULL, |
| 16 | + theme TEXT NOT NULL, |
| 17 | + embedding VECTOR(768) NOT NULL, |
18 | 18 | -- 무결성 검증 |
19 | 19 | CHECK (min_age >= 0 AND max_age >= min_age) |
20 | 20 | ); |
21 | 21 |
|
22 | | --- 범주/연령대 필터 인덱스 |
| 22 | +-- next 범주/연령대 필터 인덱스 |
23 | 23 | CREATE INDEX IF NOT EXISTS idx_age_theme_cat_age |
24 | 24 | ON age_theme(category, min_age, max_age); |
25 | 25 |
|
26 | | --- 코사인 KNN 인덱스(운영 저사양 고려 ivfflat 사용) |
| 26 | +-- next 코사인 KNN 인덱스(저사양 고려 ivfflat) |
27 | 27 | CREATE INDEX IF NOT EXISTS idx_age_theme_embedding_ivfflat |
28 | 28 | ON age_theme USING ivfflat (embedding vector_cosine_ops) |
29 | 29 | WITH (lists = 50); |
30 | 30 |
|
31 | | --- vocab_term 테이블 생성(용어 유니크) |
| 31 | +-- next vocab_term 테이블 생성 (term 유니크) |
32 | 32 | CREATE TABLE IF NOT EXISTS vocab_term ( |
33 | | - id BIGINT GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY, |
34 | | - term VARCHAR(128) NOT NULL UNIQUE, |
35 | | - embedding VECTOR(768) NOT NULL |
| 33 | + id BIGINT GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY, |
| 34 | + term VARCHAR(128) NOT NULL UNIQUE, |
| 35 | + embedding VECTOR(768) NOT NULL |
36 | 36 | ); |
37 | 37 |
|
38 | | --- 코사인 KNN 인덱스 |
| 38 | +-- next 코사인 KNN 인덱스 |
39 | 39 | CREATE INDEX IF NOT EXISTS idx_vocab_term_embedding_ivfflat |
40 | 40 | ON vocab_term USING ivfflat (embedding vector_cosine_ops) |
41 | 41 | WITH (lists = 50); |
42 | 42 |
|
43 | | --- 통계 수집(IVFFLAT 생성 후 권장) |
| 43 | +-- next 통계 수집(IVFFLAT 생성 후 권장) |
44 | 44 | ANALYZE age_theme; |
45 | 45 | ANALYZE vocab_term; |
46 | 46 |
|
47 | 47 | /* |
48 | | --- 무결성 검증 |
49 | | --- HNSW를 쓰고 싶다면 아래로 교체(메모리 여유 필요, PG ≥ 16 권장) |
| 48 | +-- 옵션: 메모리 여유 & PG ≥ 16이면 HNSW 사용 |
50 | 49 | -- CREATE INDEX IF NOT EXISTS idx_age_theme_embedding_hnsw |
51 | 50 | -- ON age_theme USING hnsw (embedding vector_cosine_ops); |
52 | 51 | -- CREATE INDEX IF NOT EXISTS idx_vocab_term_embedding_hnsw |
|
0 commit comments