index

package
v1.0.0 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Aug 21, 2026 License: Apache-2.0 Imports: 8 Imported by: 0

Documentation

Overview

Package index는 위키 검색 색인을 만들고 질의에 BM25 순위로 답한다. 순수 Go로 두어 코어의 CGO_ENABLED=0 을 지킨다. ADR 0010, 0061.

token.go는 한국어 검색을 위한 토크나이저다. ADR 0010의 확정 결정을 그대로 구현한다. 문자 bigram 과 라틴 통짜 토큰을 구간 종류별로 갈라 낸다. 형태소 사전을 쓰지 않는다.

Index

Constants

View Source
const IndexDirName = ".engram"

IndexDirName은 색인이 놓이는 위키 루트의 캐시 디렉토리다. gitignore 대상이다.

View Source
const IndexFileName = "index.json"

IndexFileName은 색인 파일 이름이다.

View Source
const SchemaVersion = 2

SchemaVersion는 색인 JSON의 스키마 버전이다. 다르면 색인을 무시하고 낡은 것으로 취급한다. 가중치가 바뀌면 같은 문서의 TF 값이 달라지므로 올린다. 2는 필드 가중치 도입이다(ADR 0061).

Variables

This section is empty.

Functions

func Tokenize

func Tokenize(s string) []string

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

type FieldWeights struct {
	Title  float64
	Body   float64
	Topics float64
	Tags   float64
}

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 Build

func Build(wikiRoot string, walked []walk.Doc, w FieldWeights) (*Index, error)

Build는 순회 결과로 색인을 만든다. 파싱에 실패한 문서는 건너뛴다. 수정 시각은 파일에서 읽는 값이며 시계를 읽지 않는다.

func Load

func Load(wikiRoot string) *Index

Load는 위키 루트의 색인을 읽는다. 파일이 없거나 파싱에 실패하거나 스키마 버전이 다르면 nil을 반환한다. 낡은 색인은 에러가 아니라 다시 만들 대상이므로 죽지 않는다.

func (*Index) Fresh

func (ix *Index) Fresh(walked []walk.Doc, wikiRoot string) bool

Fresh는 색인이 현재 문서 파일과 일치하는지 판정한다. 파싱에 실패한 문서는 Build가 건너뛰므로 여기서도 제외한다. 경로 집합이 다르거나 크기나 수정 시각이 다르면 낡았다.

func (*Index) Save

func (ix *Index) Save(wikiRoot string) error

Save는 색인을 위키 루트의 .engram/index.json 에 쓴다. 맵 키는 encoding/json 이 정렬해서 쓰고 문서는 경로순이므로 같은 색인의 저장은 항상 바이트까지 같다.

func (*Index) Search

func (ix *Index) Search(query string, limit int) []SearchResult

Search는 질의를 BM25 순위로 검색해 상위 결과를 반환한다. 동점인 문서의 순위는 슬러그 순으로 고정한다. 같은 위키와 같은 질의는 언제나 같은 순서를 내야 골든 스냅샷과 교재의 실측 출력이 성립한다.

type SearchResult

type SearchResult struct {
	Path  string  `json:"path"`
	Slug  string  `json:"slug"`
	Title string  `json:"title"`
	Score float64 `json:"score"`
}

SearchResult는 질의에 대한 문서 하나의 결과다.

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL