FTS5 전문 검색
Synapse가 서브밀리초 전문 메모리 검색을 위해 SQLite FTS5를 사용하는 방법.
FTS5 전문 검색
Synapse는 빠르고 유연한 메모리 검색을 위해 FTS5 (Full-Text Search 5)를 사용합니다. 이 페이지에서는 작동 방식과 효과적인 사용법을 설명합니다.
FTS5란?
FTS5는 전문 검색 기능을 제공하는 SQLite 확장입니다 (확장을 통해 PostgreSQL에서도 사용 가능). 다음을 제공합니다:
- 빠른 키워드 검색을 위한 텍스트 콘텐츠 인덱싱
- 불린 연산자 (AND, OR, NOT) 지원
- 따옴표를 사용한 구문 매칭 지원
*를 사용한 접두사 매칭 지원- 관련성으로 결과 순위 지정
Synapse는 FTS5를 사용하여 모든 메모리 콘텐츠를 인덱싱하여 수천 개의 메모리에서 서브밀리초 검색을 가능하게 합니다.
Synapse의 FTS5 사용 방식
POST /memory 시:
- 메모리 콘텐츠가
memories테이블에 저장됩니다 - 콘텐츠가 FTS5 가상 테이블에도 삽입됩니다
- FTS5가 자동으로 토큰화하고 인덱싱합니다
GET /memory/search?q=... 시:
- Synapse가 FTS5 구문을 사용하여 쿼리를 파싱합니다
- FTS5 인덱스에 대해
MATCH를 실행합니다 mind_id로 필터링합니다 (테넌트 격리)- 순위가 지정된 결과를 반환합니다
쿼리 구문
단순 키워드 검색
?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"는 포함하지 않는 메모리를 반환합니다.
실용적인 예시
프로젝트에 대한 메모리 찾기
curl -H "Authorization: Bearer YOUR_MIND_KEY" \
"https://synapse.schaefer.zone/memory/search?q=synapse+deployment"정확한 구문 찾기
curl -H "Authorization: Bearer YOUR_MIND_KEY" \
"https://synapse.schaefer.zone/memory/search?q=%22docker+swarm%22"테스트 메모리 제외
curl -H "Authorization: Bearer YOUR_MIND_KEY" \
"https://synapse.schaefer.zone/memory/search?q=production+-test"기술로 찾기
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에 대한 메모리"를 원할 때 의미론적 검색을 사용하십시오.