Documentation
¶
Overview ¶
Package index는 위키 검색 색인을 만들고 질의에 BM25 순위로 답한다. 순수 Go로 두어 코어의 CGO_ENABLED=0 을 지킨다. ADR 0010, 0061.
token.go는 한국어 검색을 위한 토크나이저다. ADR 0010의 확정 결정을 그대로 구현한다. 문자 bigram 과 라틴 통짜 토큰을 구간 종류별로 갈라 낸다. 형태소 사전을 쓰지 않는다.
Index ¶
Constants ¶
const IndexDirName = ".engram"
IndexDirName은 색인이 놓이는 위키 루트의 캐시 디렉토리다. gitignore 대상이다.
const IndexFileName = "index.json"
IndexFileName은 색인 파일 이름이다.
const SchemaVersion = 2
SchemaVersion는 색인 JSON의 스키마 버전이다. 다르면 색인을 무시하고 낡은 것으로 취급한다. 가중치가 바뀌면 같은 문서의 TF 값이 달라지므로 올린다. 2는 필드 가중치 도입이다(ADR 0061).
Variables ¶
This section is empty.
Functions ¶
func Tokenize ¶
Tokenize는 문자열을 검색 토큰으로 나눈다. 결과에 중복이 있을 수 있으며 빈도 계산은 호출자 몫이다.
구간은 문자 종류가 바뀌는 지점에서 갈린다.
- 한글 구간은 문자 bigram으로 자른다. "게이트웨이"는 게이, 이트, 트웨, 웨이다. 1글자 구간은 그 글자 하나를 토큰으로 둔다
- 라틴 문자와 숫자 구간은 소문자로 내린 통짜 토큰을 유지한다. min_wikilinks 같은 식별자가 bigram으로 쪼개지면 검색이 무너지기 때문이다. 언더스코어와 하이픈으로 나눈 조각을 추가로 낸다
- 공백과 문장부호 등 나머지는 구분자다. 토큰이 되지 않는다
Types ¶
type DocEntry ¶
type DocEntry struct {
Path string `json:"path"`
Slug string `json:"slug"`
Title string `json:"title"`
TF map[string]float64 `json:"tf"`
Length float64 `json:"length"`
Size int64 `json:"size"`
ModTime int64 `json:"modTime"`
}
DocEntry는 문서 하나의 색인 항목이다. 크기와 수정 시각은 신선도 판정용으로 실제 파일과 대조할 때 쓴다.
type FieldWeights ¶
FieldWeights는 색인 대상 필드별 가중치다. 값은 본문을 1로 둔 배수이며 근거는 ADR 0061에 있다.
슬러그는 필드가 아니다. 기본 슬러그가 제목에서 파생되므로 같은 낱말이 이미 제목에 있고, 슬러그 토큰은 문서마다 고유해 bridge 의 코사인 유사도를 무너뜨린다. 두 결과 모두 실측했다(ADR 0061).
func DefaultWeights ¶
func DefaultWeights() FieldWeights
DefaultWeights는 기본 가중치다. 본문을 1로 두고 나머지를 올린다.
type Index ¶
type Index struct {
SchemaVersion int `json:"schemaVersion"`
Docs []DocEntry `json:"docs"`
AvgLength float64 `json:"avgLength"`
DF map[string]int `json:"df"`
}
Index는 위키 전체의 색인이다. 문서 수가 수백에서 2000개 규모이므로 사람이 열어 볼 수 있는 JSON으로 저장한다.
func Load ¶
Load는 위키 루트의 색인을 읽는다. 파일이 없거나 파싱에 실패하거나 스키마 버전이 다르면 nil을 반환한다. 낡은 색인은 에러가 아니라 다시 만들 대상이므로 죽지 않는다.
func (*Index) Fresh ¶
Fresh는 색인이 현재 문서 파일과 일치하는지 판정한다. 파싱에 실패한 문서는 Build가 건너뛰므로 여기서도 제외한다. 경로 집합이 다르거나 크기나 수정 시각이 다르면 낡았다.