{"title":"Busca em texto completo FTS5","slug":"fts5-search","category":"concepts","summary":"Como o Synapse usa SQLite FTS5 para busca de memória em texto completo sub-milissegundo.","audience":["human","llm"],"tags":["concept","search","fts5","fulltext"],"difficulty":"advanced","updated":"2026-06-27","word_count":620,"read_minutes":3,"lang":"pt","translated":true,"requested_lang":"pt","content_markdown":"\n# Busca em texto completo FTS5\n\nO Synapse usa FTS5 (Full-Text Search 5) para busca de memória rápida e flexível.\nEsta página explica como funciona e como usá-lo de forma eficaz.\n\n## O que é FTS5?\n\nFTS5 é uma extensão do SQLite (também disponível no PostgreSQL via extensões)\nque oferece capacidades de busca em texto completo. Ele:\n\n- Indexa conteúdo textual para busca rápida por palavras-chave\n- Suporta operadores booleanos (AND, OR, NOT)\n- Suporta correspondência de frases com aspas\n- Suporta correspondência por prefixo com `*`\n- Classifica resultados por relevância\n\nO Synapse usa FTS5 para indexar todo o conteúdo das memórias, permitindo busca\nsub-milissegundo entre milhares de memórias.\n\n## Como o Synapse usa FTS5\n\nQuando você faz `POST /memory`:\n\n1. O conteúdo da memória é armazenado na tabela `memories`\n2. O conteúdo também é inserido na tabela virtual FTS5\n3. FTS5 automaticamente tokeniza e indexa o conteúdo\n\nQuando você faz `GET /memory/search?q=...`:\n\n1. O Synapse faz parse da consulta usando a sintaxe FTS5\n2. Executa um `MATCH` contra o índice FTS5\n3. Filtra por `mind_id` (isolamento de tenant)\n4. Retorna resultados classificados\n\n## Sintaxe de consulta\n\n### Busca simples por palavra-chave\n\n```\n?q=docker\n```\n\nRetorna memórias contendo \"docker\".\n\n### Múltiplas palavras-chave (AND implícito)\n\n```\n?q=docker+swarm\n?q=docker%20swarm\n```\n\nRetorna memórias contendo TANTO \"docker\" QUANTO \"swarm\".\n\n### Correspondência de frase\n\n```\n?q=\"docker+swarm\"\n?q=%22docker%20swarm%22\n```\n\nRetorna memórias contendo a frase exata \"docker swarm\".\n\n### Correspondência por prefixo\n\n```\n?q=docker*\n```\n\nRetorna memórias contendo palavras que começam com \"docker\" (ex.: \"dockers\",\n\"dockerfile\", \"dockerize\").\n\n### Booleano OR\n\n```\n?q=docker+OR+kubernetes\n```\n\nRetorna memórias contendo \"docker\" OU \"kubernetes\".\n\n### Booleano NOT\n\n```\n?q=docker+-swarm\n?q=docker+NOT+swarm\n```\n\nRetorna memórias contendo \"docker\" mas NÃO \"swarm\".\n\n### Agrupamento\n\n```\n?q=(docker+OR+kubernetes)+-test\n```\n\nRetorna memórias contendo \"docker\" ou \"kubernetes\", mas não \"test\".\n\n## Exemplos práticos\n\n### Encontrar memórias sobre um projeto\n\n```bash\ncurl -H \"Authorization: Bearer YOUR_MIND_KEY\" \\\n     \"https://synapse.schaefer.zone/memory/search?q=synapse+deployment\"\n```\n\n### Encontrar frase exata\n\n```bash\ncurl -H \"Authorization: Bearer YOUR_MIND_KEY\" \\\n     \"https://synapse.schaefer.zone/memory/search?q=%22docker+swarm%22\"\n```\n\n### Excluir memórias de teste\n\n```bash\ncurl -H \"Authorization: Bearer YOUR_MIND_KEY\" \\\n     \"https://synapse.schaefer.zone/memory/search?q=production+-test\"\n```\n\n### Buscar por tecnologia\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## Ranking\n\nFTS5 classifica resultados por relevância usando o algoritmo BM25. Fatores:\n\n- Frequência do termo (com que frequência o termo aparece)\n- Frequência inversa de documentos (termos mais raros recebem classificação maior)\n- Comprimento do documento (documentos mais curtos com o termo recebem classificação maior)\n- Peso da coluna (title > content)\n\nOs resultados são retornados em ordem de classificação (mais relevantes primeiro).\n\n## Desempenho\n\n| Operação | Latência |\n|----------|----------|\n| Busca em 100 memórias | < 5ms |\n| Busca em 1.000 memórias | < 10ms |\n| Busca em 10.000 memórias | < 25ms |\n| Busca em 100.000 memórias | < 100ms |\n\nFTS5 é altamente otimizado para workloads com muita leitura.\n\n## Limitações\n\n### Stemming\n\nFTS5 não faz stemming por padrão. \"running\" e \"run\" são termos diferentes.\n\n**Solução alternativa:** Use correspondência por prefixo: `?q=run*`\n\n### Tolerância a typos\n\nFTS5 não suporta correspondência fuzzy. Um typo não retornará resultados.\n\n**Solução alternativa:** Use busca semântica (`/memory/semantic-search`) para\ncorrespondência conceitual.\n\n### Stop words\n\nPalavras comuns (the, a, an, is) são indexadas mas podem não ser úteis para\nbusca. FTS5 lida com isso automaticamente.\n\n## FTS5 vs busca semântica\n\n| Aspecto | FTS5 | Busca semântica |\n|---------|------|-----------------|\n| Velocidade | Sub-milissegundo | 50-100ms |\n| Correspondência | Palavras-chave exatas | Conceitual |\n| Tolerância a typos | Nenhuma | Alguma |\n| Stemming | Nenhum | Implícito |\n| Requer embeddings | Não | Sim |\n| Melhor para | Termos específicos | Conceitos |\n\nUse FTS5 quando você conhece as palavras-chave. Use busca semântica quando você\nquer \"memórias sobre X\" onde X é descrito de outra forma.\n\n## Melhores práticas\n\n> [!TIP]\n> - **Use termos específicos** — \"docker swarm\" supera \"container orchestration\"\n> - **Aspas para frases** — `\"docker swarm\"` garante correspondência de frase\n> - **Use prefixo para variações** — `deploy*` captura \"deploy\", \"deployment\", \"deploying\"\n> - **Exclua ruído** — `-test` filtra memórias de teste\n> - **Combine com tags** — `?q=docker&tag=production` estreita os resultados\n\n## Próximos passos\n\n- [Busca semântica](/docs/concepts/semantic-search)\n- [API de Memória](/docs/api/memory)\n- [Melhores práticas de memória](/docs/guides/memory-best-practices)\n","content_html":"<h1>Busca em texto completo FTS5</h1>\n<p>O Synapse usa FTS5 (Full-Text Search 5) para busca de memória rápida e flexível.\nEsta página explica como funciona e como usá-lo de forma eficaz.</p>\n<h2>O que é FTS5?</h2>\n<p>FTS5 é uma extensão do SQLite (também disponível no PostgreSQL via extensões)\nque oferece capacidades de busca em texto completo. Ele:</p>\n<ul>\n<li>Indexa conteúdo textual para busca rápida por palavras-chave</li>\n<li>Suporta operadores booleanos (AND, OR, NOT)</li>\n<li>Suporta correspondência de frases com aspas</li>\n<li>Suporta correspondência por prefixo com <code>*</code></li>\n<li>Classifica resultados por relevância</li>\n</ul>\n<p>O Synapse usa FTS5 para indexar todo o conteúdo das memórias, permitindo busca\nsub-milissegundo entre milhares de memórias.</p>\n<h2>Como o Synapse usa FTS5</h2>\n<p>Quando você faz <code>POST /memory</code>:</p>\n<ol>\n<li>O conteúdo da memória é armazenado na tabela <code>memories</code></li>\n<li>O conteúdo também é inserido na tabela virtual FTS5</li>\n<li>FTS5 automaticamente tokeniza e indexa o conteúdo</li>\n</ol>\n<p>Quando você faz <code>GET /memory/search?q=...</code>:</p>\n<ol>\n<li>O Synapse faz parse da consulta usando a sintaxe FTS5</li>\n<li>Executa um <code>MATCH</code> contra o índice FTS5</li>\n<li>Filtra por <code>mind_id</code> (isolamento de tenant)</li>\n<li>Retorna resultados classificados</li>\n</ol>\n<h2>Sintaxe de consulta</h2>\n<h3>Busca simples por palavra-chave</h3>\n<pre><code class=\"hljs language-plaintext\">?q=docker</code></pre><p>Retorna memórias contendo &quot;docker&quot;.</p>\n<h3>Múltiplas palavras-chave (AND implícito)</h3>\n<pre><code class=\"hljs language-plaintext\">?q=docker+swarm\n?q=docker%20swarm</code></pre><p>Retorna memórias contendo TANTO &quot;docker&quot; QUANTO &quot;swarm&quot;.</p>\n<h3>Correspondência de frase</h3>\n<pre><code class=\"hljs language-plaintext\">?q=&quot;docker+swarm&quot;\n?q=%22docker%20swarm%22</code></pre><p>Retorna memórias contendo a frase exata &quot;docker swarm&quot;.</p>\n<h3>Correspondência por prefixo</h3>\n<pre><code class=\"hljs language-plaintext\">?q=docker*</code></pre><p>Retorna memórias contendo palavras que começam com &quot;docker&quot; (ex.: &quot;dockers&quot;,\n&quot;dockerfile&quot;, &quot;dockerize&quot;).</p>\n<h3>Booleano OR</h3>\n<pre><code class=\"hljs language-plaintext\">?q=docker+OR+kubernetes</code></pre><p>Retorna memórias contendo &quot;docker&quot; OU &quot;kubernetes&quot;.</p>\n<h3>Booleano NOT</h3>\n<pre><code class=\"hljs language-plaintext\">?q=docker+-swarm\n?q=docker+NOT+swarm</code></pre><p>Retorna memórias contendo &quot;docker&quot; mas NÃO &quot;swarm&quot;.</p>\n<h3>Agrupamento</h3>\n<pre><code class=\"hljs language-plaintext\">?q=(docker+OR+kubernetes)+-test</code></pre><p>Retorna memórias contendo &quot;docker&quot; ou &quot;kubernetes&quot;, mas não &quot;test&quot;.</p>\n<h2>Exemplos práticos</h2>\n<h3>Encontrar memórias sobre um projeto</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>Encontrar frase exata</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>Excluir memórias de teste</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>Buscar por tecnologia</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>Ranking</h2>\n<p>FTS5 classifica resultados por relevância usando o algoritmo BM25. Fatores:</p>\n<ul>\n<li>Frequência do termo (com que frequência o termo aparece)</li>\n<li>Frequência inversa de documentos (termos mais raros recebem classificação maior)</li>\n<li>Comprimento do documento (documentos mais curtos com o termo recebem classificação maior)</li>\n<li>Peso da coluna (title &gt; content)</li>\n</ul>\n<p>Os resultados são retornados em ordem de classificação (mais relevantes primeiro).</p>\n<h2>Desempenho</h2>\n<table>\n<thead>\n<tr>\n<th>Operação</th>\n<th>Latência</th>\n</tr>\n</thead>\n<tbody><tr>\n<td>Busca em 100 memórias</td>\n<td>&lt; 5ms</td>\n</tr>\n<tr>\n<td>Busca em 1.000 memórias</td>\n<td>&lt; 10ms</td>\n</tr>\n<tr>\n<td>Busca em 10.000 memórias</td>\n<td>&lt; 25ms</td>\n</tr>\n<tr>\n<td>Busca em 100.000 memórias</td>\n<td>&lt; 100ms</td>\n</tr>\n</tbody></table>\n<p>FTS5 é altamente otimizado para workloads com muita leitura.</p>\n<h2>Limitações</h2>\n<h3>Stemming</h3>\n<p>FTS5 não faz stemming por padrão. &quot;running&quot; e &quot;run&quot; são termos diferentes.</p>\n<p><strong>Solução alternativa:</strong> Use correspondência por prefixo: <code>?q=run*</code></p>\n<h3>Tolerância a typos</h3>\n<p>FTS5 não suporta correspondência fuzzy. Um typo não retornará resultados.</p>\n<p><strong>Solução alternativa:</strong> Use busca semântica (<code>/memory/semantic-search</code>) para\ncorrespondência conceitual.</p>\n<h3>Stop words</h3>\n<p>Palavras comuns (the, a, an, is) são indexadas mas podem não ser úteis para\nbusca. FTS5 lida com isso automaticamente.</p>\n<h2>FTS5 vs busca semântica</h2>\n<table>\n<thead>\n<tr>\n<th>Aspecto</th>\n<th>FTS5</th>\n<th>Busca semântica</th>\n</tr>\n</thead>\n<tbody><tr>\n<td>Velocidade</td>\n<td>Sub-milissegundo</td>\n<td>50-100ms</td>\n</tr>\n<tr>\n<td>Correspondência</td>\n<td>Palavras-chave exatas</td>\n<td>Conceitual</td>\n</tr>\n<tr>\n<td>Tolerância a typos</td>\n<td>Nenhuma</td>\n<td>Alguma</td>\n</tr>\n<tr>\n<td>Stemming</td>\n<td>Nenhum</td>\n<td>Implícito</td>\n</tr>\n<tr>\n<td>Requer embeddings</td>\n<td>Não</td>\n<td>Sim</td>\n</tr>\n<tr>\n<td>Melhor para</td>\n<td>Termos específicos</td>\n<td>Conceitos</td>\n</tr>\n</tbody></table>\n<p>Use FTS5 quando você conhece as palavras-chave. Use busca semântica quando você\nquer &quot;memórias sobre X&quot; onde X é descrito de outra forma.</p>\n<h2>Melhores práticas</h2>\n<div class=\"callout callout-ok\"></div><h2>Próximos passos</h2>\n<ul>\n<li><a href=\"/docs/concepts/semantic-search\">Busca semântica</a></li>\n<li><a href=\"/docs/api/memory\">API de Memória</a></li>\n<li><a href=\"/docs/guides/memory-best-practices\">Melhores práticas de memória</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"]}