test(A4): korean + english trigram matching at FTS level

3개 신규 unit tests in tests/fts.rs §7:

1. fts_trigram_korean_3char_substring_hits — Codex sqlite 3.45.1 검증
   동작 5개 assert pin: raw 3자 substring hit (충돌은/발생한),
   quoted phrase hit (\"해시 충돌\"/\"시 충\"), raw 해시충 0-hit (원문
   미존재).
2. fts_trigram_korean_short_query_zero_hit_pinned — 2자 한국어 query
   (충돌·키) 0-hit 회귀 감지. trigram 구조 변경 시 먼저 fail.
3. fts_trigram_english_substring_hits — substring recall 동작 변경
   pin (token→tokenizer, to 0-hit).

검증: cargo test -p kebab-store-sqlite --test fts → 13/13 PASS
(신규 3 + 기존 10).

Step 1c (multi-token 한국어 query e.g. \"해시 충돌\") 와 Step 5
(lexical BM25 snapshot 갱신) 는 Task A5 의 build_match_string()
재설계 후 진행.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-05-23 00:57:37 +00:00
parent 753b1ff5e5
commit fe123c0c6d
2 changed files with 117 additions and 11 deletions

View File

@@ -150,21 +150,15 @@ INSERT INTO chunks_fts(chunk_id, doc_id, heading_path, text)
- raw `MATCH '충돌'` (2자) → 0-hit (trigram 구조)
실 위키 문서 fixture 가 필요한 후속 검증은 별도 task 로 deferral.
- [ ] **Step 1: 한국어 trigram 매칭 테스트 (실패 확인)** — fixture chunk text `"해시 충돌은 키와 값을 매핑할 때 발생한다"` (V007 적용 store). Codex sqlite 3.45.1 검증 기준 동작:
- raw `MATCH '충돌은'` (공백 없는 3자 연속 substring) → hit. ✓
- quoted `MATCH '"해시 충돌"'` (whole phrase) → hit. ✓
- quoted `MATCH '"시 충"'` (phrase 2 chars + space + 1 char) → hit. ✓
- raw `MATCH '해시충'` → 0-hit (원문에 "해시충" 3-gram 이 연속으로 없음 — "해시" 공백 "충돌").
- raw `MATCH '시 충'` (공백 포함 unquoted) → 0-hit (FTS5 가 공백을 토큰 경계로 처리).
위 5개 assert. Expected: V007 적용 store 에서 PASS. store 테스트가 migration 을 V006 까지만 적용한다면 V007 까지 적용되도록 수정.
- [x] **Step 1: 한국어 trigram 매칭 테스트**`fts_trigram_korean_3char_substring_hits` (fts.rs §7). 5개 assert (raw 3자 hit, quoted phrase hit, `해시충` 0-hit) 모두 통과.
- [ ] **Step 1b: 2자 query 0-hit 핀 (회귀 감지)**`MATCH '충돌'` (2 Unicode chars) 이 반드시 0 결과를 반환. trigram 구조 변경 감지 회귀 테스트.
- [x] **Step 1b: 2자 query 0-hit 핀**`fts_trigram_korean_short_query_zero_hit_pinned` (`충돌`/`키` 0-hit).
- [ ] **Step 1c: multi-token 한국어 query 테스트**`crates/kebab-search` 또는 `crates/kebab-app` 통합 레벨. 사용자 query `해시 충돌``build_match_string()` 을 통해 hit 하는지. Expected: A4 시점 FAIL (현재 builder 가 `"해시" "충돌"` AND 로 trigram 0-hit), Task A5 builder 재설계 후 PASS.
- [ ] **Step 1c: multi-token 한국어 query 테스트**`crates/kebab-search` 또는 `crates/kebab-app` 통합 레벨. 사용자 query `해시 충돌``build_match_string()` 을 통해 hit. Expected: A4 시점 FAIL (현재 builder 가 `"해시" "충돌"` AND 로 trigram 0-hit), Task A5 builder 재설계 후 PASS.
- [ ] **Step 2: 영어 substring 동작 핀**영어 텍스트에 대해 trigram substring 매칭 (예: `tokenizer` 텍스트가 `MATCH 'token'` hit) 을 명시적으로 문서화·고정.
- [x] **Step 2: 영어 substring 동작 핀**`fts_trigram_english_substring_hits` (`token``tokenizer`, `to` 0-hit).
- [ ] **Step 3: 통과 확인 (부분)**`cargo test -p kebab-store-sqlite` → Step 1 / 1b / 2 PASS. Step 1c 는 A5 후.
- [x] **Step 3: 통과 확인 (부분)**`cargo test -p kebab-store-sqlite --test fts` → 13/13 PASS (Step 1/1b/2 + 기존 10). Step 1c 는 A5 후.
- [ ] **Step 4: 통합 회귀 확인**`cargo test -p kebab-app search_korean` (`러스트` 3자라 trigram 으로도 통과). `search_korean.rs``해시 충돌` multi-token assert 추가 (A5 후 통과).