// 질의 언어
VQL: 작지만 한국어와 코드에 강합니다.
단어, 구절, 몇 가지 필터로 이뤄집니다. 한국어는 음절 바이그램으로, 코드는 camelCase·snake_case·경로 조각으로도 찾습니다.
| 쓰는 법 | 뜻 |
|---|---|
| 토큰 갱신 | 단어를 모두 포함 (--any면 하나라도) |
| "refresh race" | 구절이 그대로 있음, 대소문자 무시 |
| file:src/auth.js | 그 파일을 건드린 이벤트: 편집, 파일을 언급한 도구 호출, 커밋 파일 목록 |
| commit:abc1234 · session:ab12 | 커밋(7자 이상) 또는 세션 id 앞부분 |
| kind:decision,guard.* | 이벤트 종류. *로 묶음 |
| since:30d · until:2026-10-01 | 기간: 90m 12h 30d 8w, 날짜(UTC), 에폭 ms |
| status:active|superseded|all | 결정 상태 (플러그인 확장, 기본 active) |
| error:<지문> | 그 오류 지문의 이력 (플러그인 확장) |
순위는 이렇게 매깁니다
- BM25k1 = 1.2, b = 0.75
- × 종류 가중치결정 1.5 · 오류 1.4 · 커밋·계약 1.2 · 대화 1.0 · 편집·가드·검사 0.8 · 도구 0.6
- × 최신도0.3 + 0.7 × 0.5^(나이 / 30일) — 0.3 밑으로 내려가지 않아서 오래된 정확한 일치가 최근의 어정쩡한 일치를 이깁니다
의미 검색은 옵트인(--semantic)입니다. BM25 결과와 벡터 코사인 결과를 RRF(k = 60)로 합칩니다. 임베딩은 지금 해시 기반 대역이고 실제 모델이 아닙니다.
// 측정
수치는 조건과 함께.
합성 로그 100만 이벤트, 세그먼트 107개, 릴리스 빌드, 한 프로세스에서 반복한 warm p50입니다. 서버와 데몬은 이 상태로 오래 살기 때문에 실제에 가장 가깝습니다. 흔한 단어 w0은 전체 문서의 약 30%에 있어서 실제 로그보다 훨씬 흔합니다.
| 질의 | 최적화 전 | 지금 |
|---|---|---|
| w0 | 15.7 ms | 3.7 ms |
| w0 w2 | 24.9 ms | 7.8 ms |
| w3 w1 w0 | 30.3 ms | 8.3 ms |
| w3225 (드문 단어) | 13.7 ms | 6.9 ms |
| "w34 w95" (구절) | 38.5 ms | 23.5 ms |
| retry | 5.1 ms | 2.0 ms |
| w5000 w0 (없는 단어) | 20.9 ms | 0.0 ms |
저장과 서버
| 전체 검증, 100만 이벤트 | 약 0.17 초 |
| 첫 인제스트, 로그 188MB, 100만 이벤트 | 5.9 초 |
| 새 줄 없는 인제스트 | 약 7 ms |
| 서버 유휴 RSS, 110만 건 | 14 MB |
| 디스크, 110만 건 | 원본 로그 267 MB → 전체 약 475~525 MB |
| 서버, 12만 건 프로젝트, 인증 + 감사, 2 vCPU VM | 클라이언트 1 / 8 / 32에서 242 / 300 / 298 req/s |
“첫 인제스트”, “새 줄 없는 인제스트”는 세그먼트가 34개였던 옛 데이터로 잰 값이라 검색 시간 수치와 섞어 비교하지 마세요. 측정 방법과 아직 시도하지 않은 아이디어는 엔진의 HANDOFF.md에 있습니다.
세션에 기억을 주세요.
MIT 라이선스. 소스는 GitHub에 있습니다.