kfind문서

기술 · 비용 모델

형태 검색의 비용 제어

형태 지식은 검색 계획anchor 주변의 제한된 판정에 사용하고, corpus 크기에 비례하는 경로는 byte scan과 streaming output으로 유지합니다.

비용의 분리

검색 비용은 검색 계획을 만드는 고정 비용과 corpus를 읽는 가변 비용으로 나뉩니다. 계획 단계는 사전 분석과 후보 프로그램 수를 제한합니다. scan 단계는 긴 고정 anchor로 형태 판정이 필요한 위치를 줄입니다.

여러 프로그램은 조사·어미 continuation을 공유합니다. component 근거가 필요한 계획만 해당 리소스를 초기화하며, 결과는 capacity가 제한된 channel로 출력합니다. 따라서 형태 규칙의 수, corpus 크기와 결과 수가 각각 별도의 경계에서 통제됩니다.

Anchor와 matcher

각 후보 프로그램은 판정 비용을 줄일 수 있는 가장 긴 고정 byte열을 anchor로 선택합니다. 어간 교체 뒤의 고정 부분과 다음 고정 요소를 함께 검토하며, 한 음절 anchor에는 반드시 boundary 또는 structural decision이 붙습니다.

걷다
├─ 걷고 · 걷는 · 걷지 · 걷겠
├─ 걸어 · 걸었
└─ 걸으 · 걸은 · 걸을

고유 anchor가 하나면 memmem::Finder를 사용합니다. 여러 anchor의 누적 검색량이 작으면 finder hit를 직접 병합하고, 검색량이 커지면 Aho-Corasick automaton을 한 번 만들어 재사용합니다. 두 경로는 같은 overlapping 후보 순서를 제공합니다.

계획 상한

검색 질의가 compile latency와 matcher 메모리를 무제한으로 사용하지 않도록 입력과 중간 표현에 상한을 둡니다.

대상상한단위
Query length256Unicode scalars
Atoms32per query
Analyses32per atom
Candidate programs4,096per plan
Estimated matcher memory64 MiBper plan
Continuation depth4state transitions

상한을 넘으면 일부 후보를 버리고 실행하지 않습니다. query compile 오류가 어떤 제한에 도달했는지 알리고, 호출자가 질의를 나누거나 확장 수준을 좁히게 합니다. 이 동작은 누락활용형을 성공 결과로 숨기지 않습니다.

리소스 초기화

후보 프로그램의 판정은 Boundary 또는 Structural입니다. compile된 계획에 structural program이 있을 때만 component resource를 읽습니다. literal, token, any 계획은 이 리소스를 사용하지 않습니다.

resource bytes는 schema, 릴리즈 버전, source SHA-256, section digest, offset과 component span 검증을 모두 통과한 뒤 engine에 설치됩니다. 검증된 리소스는 engine 수명 동안 공유합니다. 수동 교체가 실패하면 사용 중인 리소스를 유지합니다.

Scan 경로

경로기본 동작추가 비용의 조건
Anchor scanbyte 단위 검색anchor hit
Span match원문 byte 범위만 반환설명 정보 요청
Provenance일치 줄에서 계산JSON 또는 explain 출력
NormalizationNFC anchor 직접 검색canonical mapping 또는 suffix 소비
Phraseatom span을 한 번 수집모든 atom에 후보가 있음

겹치는 검증 후보는 core와 token span을 기준으로 leftmost-longest, non-overlapping 순서로 정리합니다. 설명 정보가 필요 없는 기본 출력은 provenance 객체를 만들지 않습니다.

성능 지표의 경계

startup, lexicon load, query compile, filesystem walk, scan, verification과 output은 별도의 workload로 측정합니다. fixture의 cases/s는 corpus 처리량이 아니며, 1 GiB literal scan은 형태 품질이나 component 초기화 비용을 설명하지 않습니다. 지연 시간, 처리량, RSS와 후보 프로그램 수는 단위가 다르므로 하나의 종합 점수로 합치지 않습니다.