kfind문서

기술 · 구조

검색 엔진 구조

kfind는 형태 분석을 검색 질의와 실제 후보 주변에 한정하고, corpus 전체는 byte anchor와 bounded output 경로로 처리합니다.

검색 질의 경로와 corpus 경로

검색 질의 경로는 입력을 parse하고 정규화한 뒤 사전 분석과 형태 규칙으로 후보 프로그램을 만듭니다. 각 프로그램은 고정 anchor, 원문 core mapping, suffix consumption과 판정 제약을 가집니다. 같은 계획으로 여러 파일을 검색하는 동안 이 과정은 반복되지 않습니다.

corpus 경로는 파일을 병렬 순회하고 byte anchor를 찾습니다. anchor가 없는 구간에서는 형태소 분석이나 Unicode scalar 순회를 하지 않습니다. hit가 발생한 위치에서만 UTF-8 경계, 조사·어미, token boundary와 선택적 component 조건을 확인합니다.

query lane
  parse → normalize → analyze → compile programs
                                         │
corpus lane                              ▼
  walk files → byte scan → anchor hit → local verify
                                         │
                                         ▼
                              source span + provenance

후보 프로그램

모든 활용형을 완성 문자열로 열거하면 어미 연쇄에 따라 matcher 메모리가 증가합니다. CandidateProgram은 고정 부분과 가변 부분을 분리합니다. anchor는 byte 검색에 사용하고, consumption은 anchor 뒤의 조사·어미 상태를 소비합니다.

CandidateProgram
├─ anchor: "걸었"
├─ core_mapping: 걷다의 원문 span 투영
├─ consumption: 어미 continuation 시작 상태
├─ decision: boundary 또는 structural constraint
└─ origins: [ㄷ 불규칙, 과거 선어말어미]

조사와 어미 continuation은 전역 DFA 또는 trie로 공유합니다. 같은 surface가 여러 품사 분석이나 규칙에서 만들어지면 실행 span은 한 번만 반환하고 provenance는 합쳐서 보존합니다.

국소 검증

anchor hit는 일치가 아니라 검증 후보입니다. 엔진은 byte 위치의 UTF-8 경계, core 왼쪽 경계, suffix 상태 전이, 완성된 token의 오른쪽 경계와 구조 제약을 순서대로 검사합니다. 필요한 조건을 모두 통과한 후보만 원문 span이 됩니다.

smart 경계의 구조 제약은 token 전체를 다시 분석하지 않습니다. component resource에서 후보 token의 세부 품사와 정렬된 형태소 span을 읽고, 검색 질의가 요구한 lexical identity와 인접 component 관계만 판정합니다. 일반 형태소 분석기처럼 corpus의 모든 token에 전체 분석 그래프를 만드는 비용이 없습니다.

구 span 결합

구 검색atom의 모든 표면형을 곱해 거대한 정규식으로 만들지 않습니다. 각 atom을 독립적으로 검증한 뒤, span 목록을 검색 질의 순서와 max-gap 조건으로 결합합니다. 후보가 없는 atom이 있으면 결합을 중단합니다.

atom 0 spans ─┐
atom 1 spans ─┼─ ordered join ─ max-gap ─ phrase span
atom 2 spans ─┘

병렬 순회와 출력

ignore 규칙을 이해하는 parallel walker가 파일을 worker에 분배합니다. 각 worker는 자신의 searcher와 scratch buffer를 사용하고, 파일 단위 결과를 capacity가 제한된 channel로 단일 writer에 전달합니다. writer가 느리면 backpressure가 worker를 멈추므로 결과 수에 비례해 메모리가 계속 늘지 않습니다.

기본 출력은 파일 결과를 모으지 않습니다. --sort path만 결정적인 경로 순서를 위해 전체 file stream을 버퍼링합니다. 소비자가 pipe를 닫아 발생한 broken pipe는 정상 종료로 처리합니다.

실행 표면의 책임

표면담당 범위리소스 정책
CLI파일 순회, 입력 인코딩, locale, 출력설치 경로에서 버전이 맞는 리소스를 탐색
Rust libraryUTF-8 memory text의 query compile과 match호출자가 resource bytes를 전달
npm / WASMJavaScript 문자열과 UTF-16 offset호출자가 asset bytes를 전달