"코퍼스를 모으는 곳은 폴더가 아니라 목록이야. 비밀은 그 목록 하나에 있어."
manifest가 전체 지도를 맡아
흩어진 글을 한곳에서 찾게 해주는 것은 거대한 디렉토리가 아니라 작고 Git으로 추적되는 manifest야. 항목마다 코퍼스 id와 원본이 있는 root, 포함하거나 뺄 파일을 정하는 glob, 사용할 chunking profile을 적어. 내용은 한 줄도 복사하지 않고 주소만 모으는 거지. 그래서 10년 치 코퍼스의 범위를 한 페이지짜리 파일만 읽고도 파악할 수 있어.
등록은 가리키고, 수집은 찾아가 읽어
엔진은 manifest에 적힌 root와 glob을 따라 파일을 찾고, 바이트를 읽어 doc_sha256을 계산한 다음 텍스트를 chunk로 나누어 인덱스에 넣어. 문서 id는 코퍼스와 경로에서 내용 주소 방식으로 정해져서, 같은 파일은 언제나 같은 자리에 놓여. 파일은 원래 자리에서 한 번 읽힐 뿐 다른 곳으로 옮겨지지 않아. 수집기는 운반자가 아니라 독자야.
같은 일을 여러 번 시켜도 결과는 같아
재수집을 자주 돌릴 수 있는 건 작업이 멱등적이기 때문이야. 새로 계산한 파일 해시가 지난번 값과 같으면 아무 일도 하지 않아. 달라졌다면 그 문서의 옛 chunk를 모두 지우고 새 chunk 전체를 하나의 트랜잭션으로 넣어. 중간에 옛 조각과 새 조각이 섞인 상태를 보여주지 않지. 천 문서 가운데 둘만 바뀌었다면 실제 작업도 둘에만 들어가.
기계마다 가진 코퍼스가 달라도 괜찮아
노트북에는 일부 파일만 있고 작업실 기계에는 전부 있을 수 있어. 이 차이를 위해 별도 체계를 만들 필요는 없어. manifest에 가용성을 적고, 현재 기계에 없는 root는 건너뛰면 돼. 모든 원본을 가진 기계가 기준 인덱스를 만들고 다른 기계는 자신이 볼 수 있는 범위만 색인하지. 같은 지도라도 서 있는 곳에 따라 보이는 영토가 다르다는 사실을 솔직하게 기록하는 거야.
이 설계 덕분에 저장할 때마다 수집을 돌리는 일도 부담이 작아져. 모든 파일을 다시 변환하는 대신 해시가 달라진 문서만 원자적으로 교체하니까, 자주 실행할수록 안전하면서 비용은 실제 변경량에 비례해. 최신 상태를 유지하는 일이 별도 대형 작업이 되지 않는 거야.