# FTS5 전문 검색 Synapse는 빠르고 유연한 메모리 검색을 위해 FTS5 (Full-Text Search 5)를 사용합니다. 이 페이지에서는 작동 방식과 효과적인 사용법을 설명합니다. ## FTS5란? FTS5는 전문 검색 기능을 제공하는 SQLite 확장입니다 (확장을 통해 PostgreSQL에서도 사용 가능). 다음을 제공합니다: - 빠른 키워드 검색을 위한 텍스트 콘텐츠 인덱싱 - 불린 연산자 (AND, OR, NOT) 지원 - 따옴표를 사용한 구문 매칭 지원 - `*`를 사용한 접두사 매칭 지원 - 관련성으로 결과 순위 지정 Synapse는 FTS5를 사용하여 모든 메모리 콘텐츠를 인덱싱하여 수천 개의 메모리에서 서브밀리초 검색을 가능하게 합니다. ## Synapse의 FTS5 사용 방식 `POST /memory` 시: 1. 메모리 콘텐츠가 `memories` 테이블에 저장됩니다 2. 콘텐츠가 FTS5 가상 테이블에도 삽입됩니다 3. FTS5가 자동으로 토큰화하고 인덱싱합니다 `GET /memory/search?q=...` 시: 1. Synapse가 FTS5 구문을 사용하여 쿼리를 파싱합니다 2. FTS5 인덱스에 대해 `MATCH`를 실행합니다 3. `mind_id`로 필터링합니다 (테넌트 격리) 4. 순위가 지정된 결과를 반환합니다 ## 쿼리 구문 ### 단순 키워드 검색 ``` ?q=docker ``` "docker"를 포함하는 메모리를 반환합니다. ### 여러 키워드 (암시적 AND) ``` ?q=docker+swarm ?q=docker%20swarm ``` "docker"와 "swarm" 모두를 포함하는 메모리를 반환합니다. ### 구문 매칭 ``` ?q="docker+swarm" ?q=%22docker%20swarm%22 ``` 정확한 구문 "docker swarm"을 포함하는 메모리를 반환합니다. ### 접두사 매칭 ``` ?q=docker* ``` "docker"로 시작하는 단어 (예: "dockers", "dockerfile", "dockerize")를 포함하는 메모리를 반환합니다. ### 불린 OR ``` ?q=docker+OR+kubernetes ``` "docker" 또는 "kubernetes"를 포함하는 메모리를 반환합니다. ### 불린 NOT ``` ?q=docker+-swarm ?q=docker+NOT+swarm ``` "docker"를 포함하지만 "swarm"은 포함하지 않는 메모리를 반환합니다. ### 그룹화 ``` ?q=(docker+OR+kubernetes)+-test ``` "docker" 또는 "kubernetes"를 포함하지만 "test"는 포함하지 않는 메모리를 반환합니다. ## 실용적인 예시 ### 프로젝트에 대한 메모리 찾기 ```bash curl -H "Authorization: Bearer YOUR_MIND_KEY" \ "https://synapse.schaefer.zone/memory/search?q=synapse+deployment" ``` ### 정확한 구문 찾기 ```bash curl -H "Authorization: Bearer YOUR_MIND_KEY" \ "https://synapse.schaefer.zone/memory/search?q=%22docker+swarm%22" ``` ### 테스트 메모리 제외 ```bash curl -H "Authorization: Bearer YOUR_MIND_KEY" \ "https://synapse.schaefer.zone/memory/search?q=production+-test" ``` ### 기술로 찾기 ```bash curl -H "Authorization: Bearer YOUR_MIND_KEY" \ "https://synapse.schaefer.zone/memory/search?q=(postgres+OR+sqlite)+-mysql" ``` ## 순위 FTS5는 BM25 알고리즘을 사용하여 관련성으로 결과 순위를 지정합니다. 요인: - 용어 빈도 (용어가 얼마나 자주 등장하는가) - 역문서 빈도 (희귀한 용어가 더 높은 순위) - 문서 길이 (용어가 포함된 더 짧은 문서가 더 높은 순위) - 컬럼 가중치 (title > content) 결과는 순위순으로 반환됩니다 (가장 관련성 높은 것이 먼저). ## 성능 | 작업 | 지연 시간 | |-----------|---------| | 100개 메모리 검색 | < 5ms | | 1,000개 메모리 검색 | < 10ms | | 10,000개 메모리 검색 | < 25ms | | 100,000개 메모리 검색 | < 100ms | FTS5는 읽기 중심의 워크로드에 고도로 최적화되어 있습니다. ## 제한 사항 ### 어간 추출 FTS5는 기본적으로 어간 추출을 하지 않습니다. "running"과 "run"은 다른 용어입니다. **해결 방법:** 접두사 매칭 사용: `?q=run*` ### 오타 허용 FTS5는 퍼지 매칭을 지원하지 않습니다. 오타는 결과를 반환하지 않습니다. **해결 방법:** 개념 매칭을 위해 의미론적 검색 (`/memory/semantic-search`)을 사용하십시오. ### 불용어 일반적인 단어 (the, a, an, is)는 인덱싱되지만 검색에 유용하지 않을 수 있습니다. FTS5는 이를 자동으로 처리합니다. ## FTS5와 의미론적 검색 비교 | 측면 | FTS5 | 의미론적 검색 | |--------|------|-----------------| | 속도 | 서브밀리초 | 50-100ms | | 매칭 | 정확한 키워드 | 개념적 | | 오타 허용 | 없음 | 약간 | | 어간 추출 | 없음 | 암시적 | | 임베딩 필요 | 아니오 | 예 | | 적합한 용도 | 특정 용어 | 개념 | 키워드를 알 때 FTS5를 사용하십시오. X가 다르게 설명된 "X에 대한 메모리"를 원할 때 의미론적 검색을 사용하십시오. ## 모범 사례 > [!TIP] > - **구체적인 용어 사용** — "container orchestration"보다 "docker swarm"이 낫습니다 > - **구문 인용** — `"docker swarm"`은 구문 매칭을 보장합니다 > - **변형을 위해 접두사 사용** — `deploy*`는 "deploy", "deployment", "deploying"을 잡습니다 > - **노이즈 제외** — `-test`는 테스트 메모리를 필터링합니다 > - **태그와 결합** — `?q=docker&tag=production`이 결과를 좁힙니다 ## 다음 단계 - [의미론적 검색](/docs/concepts/semantic-search) - [Memory API](/docs/api/memory) - [메모리 모범 사례](/docs/guides/memory-best-practices)