# 용어 사전

## **파일 (File)**

- **정의:** 코드 또는 텍스트의 단일 컨테이너.
- **특징:**
  - 원본 토큰(소스 코드)의 연속으로 구성됨.
  - 인덱싱, 후보 선정, 비교 단계에서는 직접 읽지 않음.
    - 오직 뷰어 인터페이스에서만 직접 읽음.

## **타겟 (Target)**

- **정의:** 분석을 위해 사용자가 제공한 데이터셋.
- **특징:**
  - 사용자가 제공한 파일들로 구성됨.
  - 수신 즉시 토큰화 및/또는 인덱싱 과정을 거침.
  - 소스(Source)와 별도로 관리되고, 소스에 추가하지 않음.

## **소스 (Source)**

- **정의:** 서비스 제공자가 유지 관리하는 데이터셋 저장소.
- **특징:**
  - 타겟과 매칭하기 위한 참조 풀 역할을 함.
  - 자주 업데이트 되지 않음. 일반적으로 주간 또는 월간 일정으로 이루어짐.
  - 사전 인덱싱되어 사용자가 접근할 때 즉시 사용 가능함.
  - 후보 인덱싱 주기는 데이터 구조 설계에 영향을 미치지 않음.

## **데이터셋 (Dataset)**

- **정의:** 파일의 집합적인 모음.
- **유형:**
  - **소스 데이터셋 (Source Dataset):** 소스로 유지 관리되는 포괄적인 파일 모음.
    - 이후, "소스(Source)"로 약칭.
  - **타겟 데이터셋 (Target Dataset):** 사용자가 제공한 완전한 파일 모음.
    - 이후, "타겟(Target)"로 약칭.

## **토큰 (Token)**

- **정의:** 파일의 내용에서 파생된 가장 작은 데이터 단위.
- **토큰화 생성 방법:**
  - **코드 데이터:** 코드의 구문을 기반으로 한 토크나이저에 의해 생성됨.
  - **텍스트 데이터 (자연어):**
    - **서양 언어:** 토큰은 공백으로 구분됨.
    - **중국어:** 각 문자(한자)를 개별 토큰으로 취급함.
    - **한국어:** 공백을 기준으로 토큰을 분할하고, 조사 및 접미사는 별도로 토큰화됨.
    - **일본어:** 형태소 분석을 통해 토큰이 결정되며, 문법과 문맥에 따라 단어를 분할함.
    - **특별 고려사항:** 한국어와 일본어 모두 형태와 구문의 복잡성을 정확히 처리하기 위해 전문 토크나이저가 필요함.

### **시퀀스 (Sequence)** 및 **부분 시퀀스 (Subsequence)**

- **정의:**
  - **시퀀스 (Sequence):** 파일 또는 세그먼트에서 파생된 토큰의 순서 있는 목록.
  - **부분 시퀀스 (Subsequence):** 전체 시퀀스 내에서 연속된 토큰의 하위 집합.

### **최소 토큰 시퀀스 (Minimum Token Sequence, MTS)** 및 **최소 토큰 시퀀스 유닛 (Mimimum Token Sequence Unit, MTSU)**

- **정의:**
  - **최소 토큰 시퀀스 (MTS):** 고정 크기 토큰으로부터 원본 시퀀스의 기본 부분 시퀀스 단위.
  - **최소 토큰 시퀀스 유닛 (MTSU):** 시스템 내에서 인덱싱, 후보 선정, 비교의 기본 단위.
- **특징:**
  - **MTSU**는 **MTS**를 해싱하여 계산됨.
  - **MTS**는 여러 토큰으로 구성되므로, 단일 토큰보다 **MTS**의 중복 가능성이 낮음.

### **토큰화된 파일 (Tokenized File)**

- **정의:** 파일의 토큰화된 버전.
- **특징:**
  - 토크나이저에 의해 생성됨.
  - 다음의 쌍으로 구성된 시퀀스로 이루어짐:
    - 토큰의 인덱스
    - 원본 문자(문자열)

### **쿼리 (Query)**, **쿼리 요청 (Query Request)**, 및 **쿼리 결과 (Query Result)**

!!TODO: 후보 쿼리(Candidate Query)와 쿼리(Query)를 명확히 정의

- **정의:**
  - **쿼리 (Query):** 타겟 내에서 공통 부분 시퀀스를 가진 소스의 후보 파일을 검색하는 과정.
  - **쿼리 요청 (Query Request):** 타겟에서 발견된 특정 부분 시퀀스를 포함하는 소스 파일을 찾기 위해 사용되는 검색 매개변수의 집합.
  - **쿼리 결과 (Query Result):** 쿼리의 출력으로, 타겟 파일과 후보 소스 파일 목록의 쌍.
- **구성 요소:**
  - 타겟 데이터셋 내의 모든 파일을 포함함.
  - 후보 쿼리를 사용하여 후보 소스 파일 및 관련 프로젝트 메타데이터를 검색함.
  - 타겟 파일 내의 어떤 부분 시퀀스와 일치하는 토큰 부분 시퀀스를 포함하는 소스 파일을 식별함.
- **유형:**
  - **정확한 쿼리 (Exact Query):** 소스와 타겟 간에 정확히 동일한 부분 시퀀스를 검색함.
  - **유사한 쿼리 (Similar Query):** 사전 정의된 유사성 매개변수에 기반하여 유사한 부분 시퀀스를 검색함.
- **결과:**
  - **소스 파일과 타겟 파일의 쌍:** 소스 파일을 해당 타겟 파일과 연결함.
  - **부분 시퀀스 인덱스의 쌍:** 소스 및 타겟 파일 모두에서 일치하는 부분 시퀀스의 시작 및 끝 인덱스를 나타냄.

### **후보 쿼리 (Candidate Query)**

!!TODO: 후보 쿼리(Candidate Query)와 쿼리(Query)를 명확히 정의

- **정의:** 쿼리와 유사한 사전 검색 메커니즘으로, 소스에서 파일 목록만 반환함.
- **특징:**
  - 전체 소스 데이터셋에 대해 작동함.
  - 허위 긍정을 허용하지만 허위 부정을 허용하지 않음.
  - 유사한 쿼리를 직접 지원하지 않음.
    - 그러나 더 작은 **MTS** 크기를 사용하여 유사한 기능을 달성할 수 있음.

### **배치 쿼리 (Batch Query)**

- **정의:** 효율성을 높이기 위해 여러 쿼리를 동시에 처리하는 방법.
- **특징:**
  - 단일 작업에서 2^16 ~ 2^24개의 MTS 배치 요청을 처리함.
  - 배치 쿼리를 실행하기 전에 키를 정렬하고 분할함.
  - RocksDB/LevelDB와 같은 데이터베이스의 MultiGet API를 사용하여 배치 쿼리 처리를 최적화함.

### **인덱스 (Index)**

!!TODO: 인덱스(Index)와 후보 인덱스(Candidate Index)를 명확히 정의

- **정의:** 후보 쿼리에 의해 반환된 파일 목록으로부터 구축된 데이터 구조.
- **특징:**
  - 정확한 쿼리 및 유사한 쿼리에 기반한 상세 검색 작업을 최적화함.
  - 인덱서(Indexer)에 의해 생성되며 인덱싱 후에는 변경 불가능함.
  - SSD와 같은 저장 장치에서의 효율적인 읽기 작업을 처리할 수 있도록 설계됨.

### **후보 인덱스 (Candidate Index)**

- **정의:** 전체 소스를 위한 초기 인덱싱.
- **특징:**
  - 파일 수준 목록을 제공하여 후보 쿼리를 지원함.
  - 쿼리 작업 중 잠재적 일치 파일에 대한 고속 접근을 용이하게 함.

### **파티셔닝 (Partitioning)**

- **정의:** **쿼리 요청(Query Request)** 내의 **MTSU**를 분할하여 **파인딩(Finding)**을 최적화하는 과정.
- **특징:**
  - **인덱스(Index)**는 **MTSU**의 순서에 따라 정렬됨.

### **파일 아카이버 (File Archiver)**

- **정의:** **소스 파일(Source File)**의 파일 ID로부터 **소스 파일**을 반환함.
- **특징:**
  - 파일 ID를 기반으로 소스 파일을 효율적으로 검색하고 반환함.
  - 아카이브된 파일 데이터를 관리하고 유지함.

### **인덱서 (Indexer)**

- **정의:** 소스 데이터셋으로부터 인덱스를 생성함.
- **특징:**
  - **소스 파일(Source Files)**을 처리함:
    - **소스 파일(Source Files)**으로부터 **토큰화된 파일(Tokenized Files)**을 생성함.
    - **토큰화된 파일(Tokenized Files)**과 소스 파일의 메타데이터로부터 **MTSU**와 메타데이터를 기반으로 **인덱스(Index)**를 생성함.

### **쿼리어 (Querier)**

- **정의:** **타겟 파일(Target Files)**로부터 쿼리를 생성함.
- **특징:**
  - **타겟 파일(Target Files)**을 처리함:
    - **타겟 파일(Target Files)**으로부터 **토큰화된 파일(Tokenized Files)**을 생성함.
    - **토큰화된 파일(Tokenized Files)**의 **MTSU**로부터 쿼리 요청을 생성함.
      - **MTSU** 목록과 관련된 **타겟 파일(Target Files)**의 메타데이터.
      - 쿼리 작업에 최적화된 그룹화/중복 제거된 **MTSU**.

### **파인더 (Finder)**

- **정의:** 쿼리 작업 중 후보 파일을 처리함.
- **특징:**
  - 쿼리 요청으로부터 각 **MTSU**에 대한 후보 파일 목록(또는 후보 파일 목록 ID)을 **인덱스(Index)**에서 가져옴.
  - 효율적인 후보 파일 검색을 지원함.

### **머저 (Merger)**

- **정의:** 쿼리 결과를 기반으로 후보 파일 목록을 병합함.
- **특징:**
  - 쿼리 결과를 기반으로 후보 파일 목록을 병합함.
  - 쿼리 요청에 대한 최종 후보 파일 목록을 생성함.

### **해시 함수 (Hash Function)**

- **정의:** 입력 데이터(**MTS**)를 고정 크기의 바이트 문자열(**MTSU**)로 변환하는 함수.
- **특징:**
  - 고속성과 효율성을 위해 비암호화 해시를 사용함.
  - **FarmHash**는 현재 MTS 키 생성을 위해 사용되는 비암호화 해시 함수의 예시임.
  - 해시 값의 균일한 분포를 보장하여 충돌을 최소화하고 인덱싱 성능을 최적화함.

### **언어 패밀리 (Language Family)**

- **정의:** 실제 표현의 유사성에 기반하여 프로그래밍 언어를 그룹화한 것.
- **특징:**
  - 동일한 패밀리 내의 언어는 공통의 문법 구조를 공유하여 서로 다른 언어 간에도 동일한 토큰 시퀀스를 가능하게 함.
  - 한 언어는 여러 패밀리에 속할 수 있으며, 여러 그룹과 패턴을 공유하는 경우가 있음.
  - 언어별 특성을 기반으로 소스 데이터를 분할하여 검색 및 인덱싱을 최적화함.

### **파티셔닝 (Partitioning)**

- **정의:** 데이터를 최적의 처리 및 쿼리를 위해 명확한 세그먼트로 나누는 과정.
- **특징:**
  - 언어 패밀리별로 데이터를 분할하여 토큰 시퀀스의 유사성을 활용함.
  - 각 파티션 내에서 검색 공간을 줄여 쿼리 성능을 향상시킴.
  - 인덱싱 및 검색 작업의 확장성과 효율성을 지원함.

### **파라미터 (Parameter)**

- **정의:** 쿼리 작업을 정제하고 맞춤화하기 위해 사용자가 정의한 기준.
- **유형:**
  - **유사도 비율 (Similarity Rate):** 유사한 쿼리에서 일치의 요구되는 유사성 정도를 지정함.
  - **검색 단위 (토큰 기준):**
    - **MTSU 크기 (MTSU Size):**
      - **정의:** 검색 과정 중 부분 시퀀스를 해싱하는 데 사용되는 최소 단위 크기.
    - **최소 검색 단위 크기 (Minimum Search Unit Size):**
      - **정의:** 검색을 수행할 때 고려되는 최소 단위 크기.

### **프로젝트 요구 사항 (Project Requirements)**

- **MTS 제약사항:**
  - MTS는 크기가 3 토큰 이하이어야 함.
  - MTS는 인덱싱에 64비트 해시를 사용하는 고정 크기 키로 표현됨.
- **파일 사양:**
  - 파일 크기는 X KB에서 X KB 범위 (정확한 범위는 명시 필요).
- **인덱스 사양:**
  - 인덱서는 인덱스를 생성하며, 이후에는 변경 불가능함.
  - 약 2^36개의 등록된 키를 처리하며, 균일한 분포를 가정함.
- **파일 목록 표현:**
  - Roaring Bitmap을 사용하여 관리되며, 크기는 몇 바이트에서 몇 킬로바이트까지 다양함.
- **작업 처리:**
  - 각 작업은 2^16에서 2^24개의 MTS 배치 요청을 관리함.
  - 검색 쿼리에서 허위 부정은 허용하지 않지만, 허위 긍정은 허용함.
  - 쿼리의 10%에서 90%는 유효한 파일 목록을 반환함.
- **쿼리 최적화:**
  - 배치 쿼리를 실행하기 전에 키를 정렬하고 분할함.
  - RocksDB/LevelDB의 MultiGet API와 같은 효율적인 데이터베이스 API를 활용하여 처리함.
- **하드웨어 사양:**
  - 단일 머신(가전 모델) 또는 최대 8대의 머신(SaaS 모델)에 배포 가능함.
  - 높은 동시성과 병렬 처리 요구 사항을 충족할 수 있도록 설계됨.

### **하드웨어 (Hardware)**

- **정의:** 인덱싱 및 쿼리 작업을 실행하는 물리적 머신 및 인프라.
- **특징:**
  - **단일 머신:** 모든 작업이 하나의 시스템 내에서 이루어지는 가전 모델에 적합함.
  - **분산 머신:** SaaS 모델에 사용되어 더 큰 규모를 처리하고 확장성을 제공함.
  - SSD와 같은 저장 장치에서의 효율적인 데이터 접근을 최적화함.
  - 고성능 요구 사항을 충족하기 위해 다중 동시 및 병렬 처리 작업을 처리할 수 있음.

### **해싱 및 키 분포 (Hashing and Key Distribution)**

- **정의:** 토큰을 고정 크기의 해시 값으로 변환하여 인덱스의 키로 사용하는 과정.
- **특징:**
  - 해시 함수의 특성상 키가 균일하게 분포됨을 가정함.
  - 키 분포의 국소성을 제거하여 인덱스 전반에 걸쳐 균형 잡힌 부하를 보장함.
  - 충돌을 최소화하여 인덱싱 및 검색 작업의 효율성을 향상시킴.

### **MultiGet API**

- **정의:** RocksDB 및 LevelDB와 같은 데이터베이스에서 단일 작업으로 여러 키-값 쌍을 검색할 수 있는 API.
- **특징:**
  - 여러 MTS 키를 동시에 가져와 배치 쿼리 처리를 향상시킴.
  - 개별 쿼리 수를 줄여 전반적인 검색 성능을 개선함.
  - 대량 작업을 위한 기본 데이터베이스 최적화를 활용하여 데이터 검색을 최적화함.

### **허위 긍정 및 허위 부정 (False Positives and False Negatives)**

- **허위 긍정 (False Positive):**
  - **정의:** 문서가 공통 토큰을 포함하지 않는데도 포함된 것으로 잘못 표시되는 경우.
  - **허용 여부:** 성능과 속도를 향상시키기 위해 시스템 내에서 허용됨.
- **허위 부정 (False Negative):**
  - **정의:** 문서가 실제로 공통 토큰을 포함하고 있음에도 불구하고 이를 식별하지 못하는 경우.
  - **허용 여부:** 허용되지 않으며, 시스템은 모든 관련 문서가 검색되도록 보장해야 함.

### **로어링 비트맵 (Roaring Bitmap)**

- **정의:** 정수 집합을 효율적으로 표현하고 조작하기 위해 사용되는 압축된 비트맵 형식.
- **특징:**
  - 빠른 비트 연산과 효율적인 저장을 제공함.
  - 일반적으로 몇 바이트에서 몇 킬로바이트 크기를 가짐.
  - 각 인덱스 키와 연관된 파일 목록을 표현하는 데 이상적이며, 빠른 쿼리 응답을 가능하게 함.

### **배치 처리 (Batch Processing)**

- **정의:** 여러 쿼리나 작업을 동시에 처리하여 효율성을 높이고 처리 시간을 줄이는 방법.
- **특징:**
  - 단일 배치에서 대량의 MTS 요청을 관리함.
  - 정렬되고 분할된 키를 활용하여 데이터 검색을 최적화함.
  - 관련 작업을 그룹화하여 개별 쿼리 처리와 관련된 오버헤드를 줄임.

### **언어별 토큰화 (Language-Specific Tokenization)**

- **정의:** 특정 언어의 문법 및 구문 규칙에 따라 텍스트를 토큰으로 분해하는 과정.
- **특징:**
  - 각 언어는 텍스트를 정확히 파싱하고 토큰화하기 위해 전문 토크나이저가 필요함.
  - 토큰 시퀀스가 각 언어의 문맥 내에서 일관되고 의미 있게 유지됨을 보장함.
  - 다양한 언어 데이터셋 간의 토큰 기반 검색의 무결성을 유지하는 데 중요함.

### **SSD 최적화 (SSD Optimization)**

- **정의:** 데이터 접근 작업 중 SSD(Solid State Drive)의 성능을 극대화하기 위해 사용되는 기술과 전략.
- **특징:**
  - 읽기 및 쓰기 작업의 지연 시간을 최소화하고 처리량을 극대화함.
  - 인덱싱된 데이터에 대한 효율적인 접근을 보장하여 전체 쿼리 응답 시간을 줄임.
  - 빈번하고 빠른 데이터 접근이 요구되는 대규모 데이터셋을 처리하는 데 필수적임.

### **균일 키 분포 (Uniform Key Distribution)**

- **정의:** 인덱스 전체 키 공간에 걸쳐 해시 키가 고르게 분포되어 클러스터링과 핫스팟을 방지함.
- **특징:**
  - FarmHash와 같은 고품질 해시 함수를 사용하여 달성됨.
  - 인덱싱 구조 전반에 걸쳐 부하를 균형 있게 분산시켜 성능과 확장성을 향상시킴.
  - 일관된 쿼리 응답 시간을 유지하고 성능 병목 현상을 방지하는 데 중요함.

---

이 확장된 글로서리는 원래의 정의와 기본 데이터에서 도입된 추가 개념을 모두 포함합니다. 데이터 구조, 처리 방법, 프로젝트 특정 요구 사항 등 시스템의 핵심 구성 요소를 다루어, 관련 용어와 아키텍처를 이해하는 데 필요한 포괄적인 참조 자료를 제공합니다.