{"title":"FTS5 전문 검색","slug":"fts5-search","category":"concepts","summary":"Synapse가 서브밀리초 전문 메모리 검색을 위해 SQLite FTS5를 사용하는 방법.","audience":["human","llm"],"tags":["concept","search","fts5","fulltext"],"difficulty":"advanced","updated":"2026-06-27","word_count":525,"read_minutes":3,"lang":"ko","translated":true,"requested_lang":"ko","content_markdown":"\n# FTS5 전문 검색\n\nSynapse는 빠르고 유연한 메모리 검색을 위해 FTS5 (Full-Text Search 5)를\n사용합니다. 이 페이지에서는 작동 방식과 효과적인 사용법을 설명합니다.\n\n## FTS5란?\n\nFTS5는 전문 검색 기능을 제공하는 SQLite 확장입니다 (확장을 통해\nPostgreSQL에서도 사용 가능). 다음을 제공합니다:\n\n- 빠른 키워드 검색을 위한 텍스트 콘텐츠 인덱싱\n- 불린 연산자 (AND, OR, NOT) 지원\n- 따옴표를 사용한 구문 매칭 지원\n- `*`를 사용한 접두사 매칭 지원\n- 관련성으로 결과 순위 지정\n\nSynapse는 FTS5를 사용하여 모든 메모리 콘텐츠를 인덱싱하여 수천 개의\n메모리에서 서브밀리초 검색을 가능하게 합니다.\n\n## Synapse의 FTS5 사용 방식\n\n`POST /memory` 시:\n\n1. 메모리 콘텐츠가 `memories` 테이블에 저장됩니다\n2. 콘텐츠가 FTS5 가상 테이블에도 삽입됩니다\n3. FTS5가 자동으로 토큰화하고 인덱싱합니다\n\n`GET /memory/search?q=...` 시:\n\n1. Synapse가 FTS5 구문을 사용하여 쿼리를 파싱합니다\n2. FTS5 인덱스에 대해 `MATCH`를 실행합니다\n3. `mind_id`로 필터링합니다 (테넌트 격리)\n4. 순위가 지정된 결과를 반환합니다\n\n## 쿼리 구문\n\n### 단순 키워드 검색\n\n```\n?q=docker\n```\n\n\"docker\"를 포함하는 메모리를 반환합니다.\n\n### 여러 키워드 (암시적 AND)\n\n```\n?q=docker+swarm\n?q=docker%20swarm\n```\n\n\"docker\"와 \"swarm\" 모두를 포함하는 메모리를 반환합니다.\n\n### 구문 매칭\n\n```\n?q=\"docker+swarm\"\n?q=%22docker%20swarm%22\n```\n\n정확한 구문 \"docker swarm\"을 포함하는 메모리를 반환합니다.\n\n### 접두사 매칭\n\n```\n?q=docker*\n```\n\n\"docker\"로 시작하는 단어 (예: \"dockers\", \"dockerfile\", \"dockerize\")를\n포함하는 메모리를 반환합니다.\n\n### 불린 OR\n\n```\n?q=docker+OR+kubernetes\n```\n\n\"docker\" 또는 \"kubernetes\"를 포함하는 메모리를 반환합니다.\n\n### 불린 NOT\n\n```\n?q=docker+-swarm\n?q=docker+NOT+swarm\n```\n\n\"docker\"를 포함하지만 \"swarm\"은 포함하지 않는 메모리를 반환합니다.\n\n### 그룹화\n\n```\n?q=(docker+OR+kubernetes)+-test\n```\n\n\"docker\" 또는 \"kubernetes\"를 포함하지만 \"test\"는 포함하지 않는 메모리를\n반환합니다.\n\n## 실용적인 예시\n\n### 프로젝트에 대한 메모리 찾기\n\n```bash\ncurl -H \"Authorization: Bearer YOUR_MIND_KEY\" \\\n     \"https://synapse.schaefer.zone/memory/search?q=synapse+deployment\"\n```\n\n### 정확한 구문 찾기\n\n```bash\ncurl -H \"Authorization: Bearer YOUR_MIND_KEY\" \\\n     \"https://synapse.schaefer.zone/memory/search?q=%22docker+swarm%22\"\n```\n\n### 테스트 메모리 제외\n\n```bash\ncurl -H \"Authorization: Bearer YOUR_MIND_KEY\" \\\n     \"https://synapse.schaefer.zone/memory/search?q=production+-test\"\n```\n\n### 기술로 찾기\n\n```bash\ncurl -H \"Authorization: Bearer YOUR_MIND_KEY\" \\\n     \"https://synapse.schaefer.zone/memory/search?q=(postgres+OR+sqlite)+-mysql\"\n```\n\n## 순위\n\nFTS5는 BM25 알고리즘을 사용하여 관련성으로 결과 순위를 지정합니다. 요인:\n\n- 용어 빈도 (용어가 얼마나 자주 등장하는가)\n- 역문서 빈도 (희귀한 용어가 더 높은 순위)\n- 문서 길이 (용어가 포함된 더 짧은 문서가 더 높은 순위)\n- 컬럼 가중치 (title > content)\n\n결과는 순위순으로 반환됩니다 (가장 관련성 높은 것이 먼저).\n\n## 성능\n\n| 작업 | 지연 시간 |\n|-----------|---------|\n| 100개 메모리 검색 | < 5ms |\n| 1,000개 메모리 검색 | < 10ms |\n| 10,000개 메모리 검색 | < 25ms |\n| 100,000개 메모리 검색 | < 100ms |\n\nFTS5는 읽기 중심의 워크로드에 고도로 최적화되어 있습니다.\n\n## 제한 사항\n\n### 어간 추출\n\nFTS5는 기본적으로 어간 추출을 하지 않습니다. \"running\"과 \"run\"은 다른\n용어입니다.\n\n**해결 방법:** 접두사 매칭 사용: `?q=run*`\n\n### 오타 허용\n\nFTS5는 퍼지 매칭을 지원하지 않습니다. 오타는 결과를 반환하지 않습니다.\n\n**해결 방법:** 개념 매칭을 위해 의미론적 검색\n(`/memory/semantic-search`)을 사용하십시오.\n\n### 불용어\n\n일반적인 단어 (the, a, an, is)는 인덱싱되지만 검색에 유용하지 않을 수\n있습니다. FTS5는 이를 자동으로 처리합니다.\n\n## FTS5와 의미론적 검색 비교\n\n| 측면 | FTS5 | 의미론적 검색 |\n|--------|------|-----------------|\n| 속도 | 서브밀리초 | 50-100ms |\n| 매칭 | 정확한 키워드 | 개념적 |\n| 오타 허용 | 없음 | 약간 |\n| 어간 추출 | 없음 | 암시적 |\n| 임베딩 필요 | 아니오 | 예 |\n| 적합한 용도 | 특정 용어 | 개념 |\n\n키워드를 알 때 FTS5를 사용하십시오. X가 다르게 설명된 \"X에 대한 메모리\"를\n원할 때 의미론적 검색을 사용하십시오.\n\n## 모범 사례\n\n> [!TIP]\n> - **구체적인 용어 사용** — \"container orchestration\"보다 \"docker swarm\"이 낫습니다\n> - **구문 인용** — `\"docker swarm\"`은 구문 매칭을 보장합니다\n> - **변형을 위해 접두사 사용** — `deploy*`는 \"deploy\", \"deployment\", \"deploying\"을 잡습니다\n> - **노이즈 제외** — `-test`는 테스트 메모리를 필터링합니다\n> - **태그와 결합** — `?q=docker&tag=production`이 결과를 좁힙니다\n\n## 다음 단계\n\n- [의미론적 검색](/docs/concepts/semantic-search)\n- [Memory API](/docs/api/memory)\n- [메모리 모범 사례](/docs/guides/memory-best-practices)\n","content_html":"<h1>FTS5 전문 검색</h1>\n<p>Synapse는 빠르고 유연한 메모리 검색을 위해 FTS5 (Full-Text Search 5)를\n사용합니다. 이 페이지에서는 작동 방식과 효과적인 사용법을 설명합니다.</p>\n<h2>FTS5란?</h2>\n<p>FTS5는 전문 검색 기능을 제공하는 SQLite 확장입니다 (확장을 통해\nPostgreSQL에서도 사용 가능). 다음을 제공합니다:</p>\n<ul>\n<li>빠른 키워드 검색을 위한 텍스트 콘텐츠 인덱싱</li>\n<li>불린 연산자 (AND, OR, NOT) 지원</li>\n<li>따옴표를 사용한 구문 매칭 지원</li>\n<li><code>*</code>를 사용한 접두사 매칭 지원</li>\n<li>관련성으로 결과 순위 지정</li>\n</ul>\n<p>Synapse는 FTS5를 사용하여 모든 메모리 콘텐츠를 인덱싱하여 수천 개의\n메모리에서 서브밀리초 검색을 가능하게 합니다.</p>\n<h2>Synapse의 FTS5 사용 방식</h2>\n<p><code>POST /memory</code> 시:</p>\n<ol>\n<li>메모리 콘텐츠가 <code>memories</code> 테이블에 저장됩니다</li>\n<li>콘텐츠가 FTS5 가상 테이블에도 삽입됩니다</li>\n<li>FTS5가 자동으로 토큰화하고 인덱싱합니다</li>\n</ol>\n<p><code>GET /memory/search?q=...</code> 시:</p>\n<ol>\n<li>Synapse가 FTS5 구문을 사용하여 쿼리를 파싱합니다</li>\n<li>FTS5 인덱스에 대해 <code>MATCH</code>를 실행합니다</li>\n<li><code>mind_id</code>로 필터링합니다 (테넌트 격리)</li>\n<li>순위가 지정된 결과를 반환합니다</li>\n</ol>\n<h2>쿼리 구문</h2>\n<h3>단순 키워드 검색</h3>\n<pre><code class=\"hljs language-plaintext\">?q=docker</code></pre><p>&quot;docker&quot;를 포함하는 메모리를 반환합니다.</p>\n<h3>여러 키워드 (암시적 AND)</h3>\n<pre><code class=\"hljs language-plaintext\">?q=docker+swarm\n?q=docker%20swarm</code></pre><p>&quot;docker&quot;와 &quot;swarm&quot; 모두를 포함하는 메모리를 반환합니다.</p>\n<h3>구문 매칭</h3>\n<pre><code class=\"hljs language-plaintext\">?q=&quot;docker+swarm&quot;\n?q=%22docker%20swarm%22</code></pre><p>정확한 구문 &quot;docker swarm&quot;을 포함하는 메모리를 반환합니다.</p>\n<h3>접두사 매칭</h3>\n<pre><code class=\"hljs language-plaintext\">?q=docker*</code></pre><p>&quot;docker&quot;로 시작하는 단어 (예: &quot;dockers&quot;, &quot;dockerfile&quot;, &quot;dockerize&quot;)를\n포함하는 메모리를 반환합니다.</p>\n<h3>불린 OR</h3>\n<pre><code class=\"hljs language-plaintext\">?q=docker+OR+kubernetes</code></pre><p>&quot;docker&quot; 또는 &quot;kubernetes&quot;를 포함하는 메모리를 반환합니다.</p>\n<h3>불린 NOT</h3>\n<pre><code class=\"hljs language-plaintext\">?q=docker+-swarm\n?q=docker+NOT+swarm</code></pre><p>&quot;docker&quot;를 포함하지만 &quot;swarm&quot;은 포함하지 않는 메모리를 반환합니다.</p>\n<h3>그룹화</h3>\n<pre><code class=\"hljs language-plaintext\">?q=(docker+OR+kubernetes)+-test</code></pre><p>&quot;docker&quot; 또는 &quot;kubernetes&quot;를 포함하지만 &quot;test&quot;는 포함하지 않는 메모리를\n반환합니다.</p>\n<h2>실용적인 예시</h2>\n<h3>프로젝트에 대한 메모리 찾기</h3>\n<pre><code class=\"hljs language-bash\">curl -H <span class=\"hljs-string\">&quot;Authorization: Bearer YOUR_MIND_KEY&quot;</span> \\\n     <span class=\"hljs-string\">&quot;https://synapse.schaefer.zone/memory/search?q=synapse+deployment&quot;</span></code></pre><h3>정확한 구문 찾기</h3>\n<pre><code class=\"hljs language-bash\">curl -H <span class=\"hljs-string\">&quot;Authorization: Bearer YOUR_MIND_KEY&quot;</span> \\\n     <span class=\"hljs-string\">&quot;https://synapse.schaefer.zone/memory/search?q=%22docker+swarm%22&quot;</span></code></pre><h3>테스트 메모리 제외</h3>\n<pre><code class=\"hljs language-bash\">curl -H <span class=\"hljs-string\">&quot;Authorization: Bearer YOUR_MIND_KEY&quot;</span> \\\n     <span class=\"hljs-string\">&quot;https://synapse.schaefer.zone/memory/search?q=production+-test&quot;</span></code></pre><h3>기술로 찾기</h3>\n<pre><code class=\"hljs language-bash\">curl -H <span class=\"hljs-string\">&quot;Authorization: Bearer YOUR_MIND_KEY&quot;</span> \\\n     <span class=\"hljs-string\">&quot;https://synapse.schaefer.zone/memory/search?q=(postgres+OR+sqlite)+-mysql&quot;</span></code></pre><h2>순위</h2>\n<p>FTS5는 BM25 알고리즘을 사용하여 관련성으로 결과 순위를 지정합니다. 요인:</p>\n<ul>\n<li>용어 빈도 (용어가 얼마나 자주 등장하는가)</li>\n<li>역문서 빈도 (희귀한 용어가 더 높은 순위)</li>\n<li>문서 길이 (용어가 포함된 더 짧은 문서가 더 높은 순위)</li>\n<li>컬럼 가중치 (title &gt; content)</li>\n</ul>\n<p>결과는 순위순으로 반환됩니다 (가장 관련성 높은 것이 먼저).</p>\n<h2>성능</h2>\n<table>\n<thead>\n<tr>\n<th>작업</th>\n<th>지연 시간</th>\n</tr>\n</thead>\n<tbody><tr>\n<td>100개 메모리 검색</td>\n<td>&lt; 5ms</td>\n</tr>\n<tr>\n<td>1,000개 메모리 검색</td>\n<td>&lt; 10ms</td>\n</tr>\n<tr>\n<td>10,000개 메모리 검색</td>\n<td>&lt; 25ms</td>\n</tr>\n<tr>\n<td>100,000개 메모리 검색</td>\n<td>&lt; 100ms</td>\n</tr>\n</tbody></table>\n<p>FTS5는 읽기 중심의 워크로드에 고도로 최적화되어 있습니다.</p>\n<h2>제한 사항</h2>\n<h3>어간 추출</h3>\n<p>FTS5는 기본적으로 어간 추출을 하지 않습니다. &quot;running&quot;과 &quot;run&quot;은 다른\n용어입니다.</p>\n<p><strong>해결 방법:</strong> 접두사 매칭 사용: <code>?q=run*</code></p>\n<h3>오타 허용</h3>\n<p>FTS5는 퍼지 매칭을 지원하지 않습니다. 오타는 결과를 반환하지 않습니다.</p>\n<p><strong>해결 방법:</strong> 개념 매칭을 위해 의미론적 검색\n(<code>/memory/semantic-search</code>)을 사용하십시오.</p>\n<h3>불용어</h3>\n<p>일반적인 단어 (the, a, an, is)는 인덱싱되지만 검색에 유용하지 않을 수\n있습니다. FTS5는 이를 자동으로 처리합니다.</p>\n<h2>FTS5와 의미론적 검색 비교</h2>\n<table>\n<thead>\n<tr>\n<th>측면</th>\n<th>FTS5</th>\n<th>의미론적 검색</th>\n</tr>\n</thead>\n<tbody><tr>\n<td>속도</td>\n<td>서브밀리초</td>\n<td>50-100ms</td>\n</tr>\n<tr>\n<td>매칭</td>\n<td>정확한 키워드</td>\n<td>개념적</td>\n</tr>\n<tr>\n<td>오타 허용</td>\n<td>없음</td>\n<td>약간</td>\n</tr>\n<tr>\n<td>어간 추출</td>\n<td>없음</td>\n<td>암시적</td>\n</tr>\n<tr>\n<td>임베딩 필요</td>\n<td>아니오</td>\n<td>예</td>\n</tr>\n<tr>\n<td>적합한 용도</td>\n<td>특정 용어</td>\n<td>개념</td>\n</tr>\n</tbody></table>\n<p>키워드를 알 때 FTS5를 사용하십시오. X가 다르게 설명된 &quot;X에 대한 메모리&quot;를\n원할 때 의미론적 검색을 사용하십시오.</p>\n<h2>모범 사례</h2>\n<div class=\"callout callout-ok\"></div><h2>다음 단계</h2>\n<ul>\n<li><a href=\"/docs/concepts/semantic-search\">의미론적 검색</a></li>\n<li><a href=\"/docs/api/memory\">Memory API</a></li>\n<li><a href=\"/docs/guides/memory-best-practices\">메모리 모범 사례</a></li>\n</ul>\n","urls":{"html":"/docs/concepts/fts5-search","text":"/docs/concepts/fts5-search?format=text","json":"/docs/concepts/fts5-search?format=json","llm":"/docs/concepts/fts5-search?format=llm"},"translations_available":["en","zh","hi","es","fr","ar","pt","ru","ja","de","it","ko","nl","pl","tr","sv","vi","th","id","uk"]}