C.W.K.
Stream
Lesson 03 of 04 · published

segment 위의 FTS

~11 min · fts, segments, inverted-index, derived

Level 0Empty Shelf
0 XP0/35 lessons0/12 achievements
0/100 XP to next level100 XP to go0% complete
"구조화된 진실을 색인해. export 는 절대 색인하지 마 — export 는 틀려도 되는 거야."

솔깃한 지름길

Recall 은 읽을 수 있는 Markdown transcript 를 생성해. 바로 거기 있어, 영상당 파일 하나, 네가 검색하고 싶은 정확한 텍스트로 가득. 그러니 지름길이 스스로 쓰여: 검색 index 를 Markdown 폴더에 겨누면 끝. 모든 본능이 그러라고 해. Recall 은 아니라고 하고, 이유가 빠르게 쌓여.

  • Markdown 은 mutable 해. 사람이 손으로 편집할 수 있고, 동기화가 stale 하게 만들 수 있고, 재생성이 교체할 수 있는 디스크의 파일이야. 그걸 색인하면 export 가 입력이 되게 둔 거야 — 트랙 2 가 금지한 바로 그 loop. 손 편집된 파일이 네 검색이 믿는 걸 조용히 다시 쓸 거야.
  • Markdown 은 구조를 잃었어. 여기선 검색이 제품이 아냐; 영상으로 돌아가는 문이 제품이야. 그 문엔 segment 당 절대 타임스탬프가 필요해. release 를 산문으로 납작하게 만들면 타임스탬프가 사라져 — 단어는 찾는데 두 시간짜리 영상 어디 사는지는 여전히 몰라.
  • index 는 재구축 가능해야 해. 파생 index 엔 purge 하고 replay 할 수 있는 canonical 소스가 필요해. 그 소스는 누가 건드렸을지 모르는 파일이 아니라 DB 의 release 야.

release 가 실제로 뭔지를 색인해

그래서 Recall 은 current release 에서 DB 안의 전문 index 로 투영된, 순서 있는 타임스탬프 segment 를 색인해. 각 hit 이 문에 필요한 걸 지녀: 자기가 나온 current release, 절대 영상 타임스탬프, 주변 텍스트, source identity 랑 경로, release 의 content hash, 그리고 rank. 그게 행동할 수 있는 검색 결과야 — 클릭하면 엔진이 정확히 어느 영상, 정확히 어느 초인지 알아.

Markdown 은 여전히 존재하고, 여전히 쓸모 있어 — 사람이 읽기에. 그냥 엄격히 하류에 살아, 권위 없는 export 로, 아무 데도 참여 안 하며: index 도, queue 완료도, 요약 진실도 아니고. 레거시 corpus 조차 이 규칙을 따랐어: 그 옛 Markdown 은 명확히 라벨된 구조화 증거로 한 번 import 됐고, 그때부터 검색은 파일이 아니라 구조화된 segment 위에서 돌았어.

세심함을 드러내는 디테일 둘

첫째: 제품 검색은 hit 을 영상별로 묶되 나중 것들을 버리지 않아. 순진한 묶기 — 영상당 행 하나, 최고 hit 만 — 는 그 영상의 다른 모든 match 를 조용히 버리는데, 그게 종종 정확히 네가 사냥하던 순간이야. 묶기는 표현 선택이야; 절대 데이터 손실 선택이 되면 안 돼.

둘째: 유사 영상 결과는 현재 lexical 이고, vector index 는 일부러 canonical 상태가 아냐. 나중에 더해지면, 규칙이 이미 있어: release-addressed 하고 재구축 가능하게 남아야 해 — 같은 버전 있는 진실에서 파생되고, purge 하고 replay 할 수 있고, 절대 두 번째 권위의 원천이 아니게. 파생된 건 아무리 영리해져도 파생된 채 남아.

Code

index 는 current release segment 의 투영이다·sql
-- release 의 순서 있는 타임스탬프 segment: 구조화된 진실.
CREATE TABLE transcript_segments (
  release_id   TEXT NOT NULL,
  seq          INTEGER NOT NULL,
  start_ms     INTEGER NOT NULL,   -- 절대 영상 타임스탬프
  end_ms       INTEGER NOT NULL,
  text         TEXT NOT NULL
);

-- 검색 가능한 투영. 파생됨 -> purge 하고 replay 해서 재구축.
CREATE VIRTUAL TABLE transcript_segment_fts USING fts5(
  text,
  content='transcript_segments'
);

-- hit 이 영상으로 돌아가는 문을 지닌다:
--   video_id + start_ms  -> 그 정확한 초에서 원본 열기
--   content_sha256       -> 어느 release 버전에서 왔나
--
-- 생성된 Markdown 은 아무것도 색인 안 한다. 그건 export.

External links

Exercise

네 일의 검색 index, cache, 파생 뷰를 찾아 실제로 뭘 읽는지 추적해. 소스가 canonical 구조화 record 야, 아니면 렌더된/export 된 산물(Markdown 파일, CSV dump, HTML 페이지, 생성된 리포트) 이야? export 면, 실패를 대: 누가 그 파일을 편집하면, 또는 stale 되면 어떻게 돼? 그다음 구조화 소스로 다시 겨누고, index 전체를 처음부터 purge 하고 재구축할 수 있는지 확인해.
Hint
질문 둘: (1) index 를 통째로 지우면, canonical 소스에서 재구축할 수 있어, 아니면 index 에만 있는 뭔가를 잃어? 두 번째 범주의 건 파생이 아냐 — 선언 안 된 진실이야. (2) index 가 사람이 손으로 편집할 수 있는 뭐라도 읽어? 그렇다면 export 가 입력이 됐고, 시스템의 믿음이 이제 텍스트 편집기로 편집 가능해.

Progress

Progress is local-only — sign in to sync across devices.
이 페이지에서 버그를 발견하셨거나 피드백이 있으세요?문제 신고

댓글 0

🔔 답글 알림 (로그인 필요)
로그인댓글을 남기려면 로그인해 주세요.

아직 댓글이 없어요. 첫 댓글을 남겨보세요.