{"title":"Búsqueda de texto completo FTS5","slug":"fts5-search","category":"concepts","summary":"Cómo Synapse usa SQLite FTS5 para búsqueda de texto completo de memoria sub-milisegundo.","audience":["human","llm"],"tags":["concept","search","fts5","fulltext"],"difficulty":"advanced","updated":"2026-06-27","word_count":625,"read_minutes":3,"lang":"es","translated":true,"requested_lang":"es","content_markdown":"\n# Búsqueda de texto completo FTS5\n\nSynapse usa FTS5 (Full-Text Search 5) para búsqueda de memoria rápida y\nflexible. Esta página explica cómo funciona y cómo usarlo eficazmente.\n\n## ¿Qué es FTS5?\n\nFTS5 es una extensión de SQLite (también disponible en PostgreSQL vía\nextensiones) que proporciona capacidades de búsqueda de texto completo. Esta\npersona:\n\n- Indexa contenido de texto para búsqueda rápida por palabra clave\n- Admite operadores booleanos (AND, OR, NOT)\n- Admite coincidencia de frases con comillas\n- Admite coincidencia por prefijo con `*`\n- Ordena resultados por relevancia\n\nSynapse usa FTS5 para indexar todo el contenido de memoria, lo que habilita\nbúsqueda sub-milisegundo entre miles de memorias.\n\n## Cómo Synapse usa FTS5\n\nCuando hace `POST /memory`:\n\n1. El contenido de la memoria se almacena en la tabla `memories`\n2. El contenido también se inserta en la tabla virtual FTS5\n3. FTS5 tokeniza e indexa el contenido automáticamente\n\nCuando hace `GET /memory/search?q=...`:\n\n1. Synapse parsea la consulta usando la sintaxis FTS5\n2. Ejecuta un `MATCH` contra el índice FTS5\n3. Filtra por `mind_id` (aislamiento de tenant)\n4. Devuelve resultados ordenados por relevancia\n\n## Sintaxis de consulta\n\n### Búsqueda simple por palabra clave\n\n```\n?q=docker\n```\n\nDevuelve memorias que contienen \"docker\".\n\n### Múltiples palabras clave (AND implícito)\n\n```\n?q=docker+swarm\n?q=docker%20swarm\n```\n\nDevuelve memorias que contienen BOTH \"docker\" AND \"swarm\".\n\n### Coincidencia de frase\n\n```\n?q=\"docker+swarm\"\n?q=%22docker%20swarm%22\n```\n\nDevuelve memorias que contienen la frase exacta \"docker swarm\".\n\n### Coincidencia por prefijo\n\n```\n?q=docker*\n```\n\nDevuelve memorias que contienen palabras que comienzan por \"docker\" (p. ej.\n\"dockers\", \"dockerfile\", \"dockerize\").\n\n### OR booleano\n\n```\n?q=docker+OR+kubernetes\n```\n\nDevuelve memorias que contienen \"docker\" OR \"kubernetes\".\n\n### NOT booleano\n\n```\n?q=docker+-swarm\n?q=docker+NOT+swarm\n```\n\nDevuelve memorias que contienen \"docker\" pero NOT \"swarm\".\n\n### Agrupamiento\n\n```\n?q=(docker+OR+kubernetes)+-test\n```\n\nDevuelve memorias que contienen \"docker\" o \"kubernetes\", pero no \"test\".\n\n## Ejemplos prácticos\n\n### Buscar memorias sobre un proyecto\n\n```bash\ncurl -H \"Authorization: Bearer YOUR_MIND_KEY\" \\\n     \"https://synapse.schaefer.zone/memory/search?q=synapse+deployment\"\n```\n\n### Buscar frase exacta\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 memorias de test\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 tecnología\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 ordena los resultados por relevancia usando el algoritmo BM25. Factores:\n\n- Frecuencia del término (con qué frecuencia aparece)\n- Frecuencia inversa de documento (términos más raros obtienen mayor ranking)\n- Longitud del documento (documentos más cortos con el término suben)\n- Peso de columna (title > content)\n\nLos resultados se devuelven en orden de ranking (más relevantes primero).\n\n## Rendimiento\n\n| Operación | Latencia |\n|-----------|---------|\n| Search 100 memories | < 5ms |\n| Search 1,000 memories | < 10ms |\n| Search 10,000 memories | < 25ms |\n| Search 100,000 memories | < 100ms |\n\nFTS5 está altamente optimizado para cargas de trabajo con muchas lecturas.\n\n## Limitaciones\n\n### Stemming\n\nFTS5 no hace stemming por defecto. \"running\" y \"run\" son términos diferentes.\n\n**Workaround:** Use coincidencia por prefijo: `?q=run*`\n\n### Tolerancia a erratas\n\nFTS5 no admite coincidencia difusa. Una errata no devolverá resultados.\n\n**Workaround:** Use búsqueda semántica (`/memory/semantic-search`) para\ncoincidencia conceptual.\n\n### Stop words\n\nLas palabras comunes (the, a, an, is) se indexan pero pueden no ser útiles para\nla búsqueda. FTS5 lo gestiona automáticamente.\n\n## FTS5 vs Búsqueda semántica\n\n| Aspecto | FTS5 | Búsqueda semántica |\n|--------|------|-----------------|\n| Velocidad | Sub-milisegundo | 50-100ms |\n| Coincidencia | Palabras clave exactas | Conceptual |\n| Tolerancia a erratas | Ninguna | Alguna |\n| Stemming | Ninguno | Implícito |\n| Requiere embeddings | No | Sí |\n| Mejor para | Términos específicos | Conceptos |\n\nUse FTS5 cuando conozca las palabras clave. Use búsqueda semántica cuando quiera\n\"memorias sobre X\" donde X se describe de forma diferente.\n\n## Mejores prácticas\n\n> [!TIP]\n> - **Use términos específicos** — \"docker swarm\" vence a \"container orchestration\"\n> - **Encadene frases entre comillas** — `\"docker swarm\"` garantiza coincidencia de frase\n> - **Use prefijo para variaciones** — `deploy*` captura \"deploy\", \"deployment\", \"deploying\"\n> - **Excluya ruido** — `-test` filtra memorias de test\n> - **Combine con etiquetas** — `?q=docker&tag=production` acota resultados\n\n## Próximos pasos\n\n- [Búsqueda semántica](/docs/concepts/semantic-search)\n- [API de Memory](/docs/api/memory)\n- [Mejores prácticas de memoria](/docs/guides/memory-best-practices)\n","content_html":"<h1>Búsqueda de texto completo FTS5</h1>\n<p>Synapse usa FTS5 (Full-Text Search 5) para búsqueda de memoria rápida y\nflexible. Esta página explica cómo funciona y cómo usarlo eficazmente.</p>\n<h2>¿Qué es FTS5?</h2>\n<p>FTS5 es una extensión de SQLite (también disponible en PostgreSQL vía\nextensiones) que proporciona capacidades de búsqueda de texto completo. Esta\npersona:</p>\n<ul>\n<li>Indexa contenido de texto para búsqueda rápida por palabra clave</li>\n<li>Admite operadores booleanos (AND, OR, NOT)</li>\n<li>Admite coincidencia de frases con comillas</li>\n<li>Admite coincidencia por prefijo con <code>*</code></li>\n<li>Ordena resultados por relevancia</li>\n</ul>\n<p>Synapse usa FTS5 para indexar todo el contenido de memoria, lo que habilita\nbúsqueda sub-milisegundo entre miles de memorias.</p>\n<h2>Cómo Synapse usa FTS5</h2>\n<p>Cuando hace <code>POST /memory</code>:</p>\n<ol>\n<li>El contenido de la memoria se almacena en la tabla <code>memories</code></li>\n<li>El contenido también se inserta en la tabla virtual FTS5</li>\n<li>FTS5 tokeniza e indexa el contenido automáticamente</li>\n</ol>\n<p>Cuando hace <code>GET /memory/search?q=...</code>:</p>\n<ol>\n<li>Synapse parsea la consulta usando la sintaxis FTS5</li>\n<li>Ejecuta un <code>MATCH</code> contra el índice FTS5</li>\n<li>Filtra por <code>mind_id</code> (aislamiento de tenant)</li>\n<li>Devuelve resultados ordenados por relevancia</li>\n</ol>\n<h2>Sintaxis de consulta</h2>\n<h3>Búsqueda simple por palabra clave</h3>\n<pre><code class=\"hljs language-plaintext\">?q=docker</code></pre><p>Devuelve memorias que contienen &quot;docker&quot;.</p>\n<h3>Múltiples palabras clave (AND implícito)</h3>\n<pre><code class=\"hljs language-plaintext\">?q=docker+swarm\n?q=docker%20swarm</code></pre><p>Devuelve memorias que contienen BOTH &quot;docker&quot; AND &quot;swarm&quot;.</p>\n<h3>Coincidencia de frase</h3>\n<pre><code class=\"hljs language-plaintext\">?q=&quot;docker+swarm&quot;\n?q=%22docker%20swarm%22</code></pre><p>Devuelve memorias que contienen la frase exacta &quot;docker swarm&quot;.</p>\n<h3>Coincidencia por prefijo</h3>\n<pre><code class=\"hljs language-plaintext\">?q=docker*</code></pre><p>Devuelve memorias que contienen palabras que comienzan por &quot;docker&quot; (p. ej.\n&quot;dockers&quot;, &quot;dockerfile&quot;, &quot;dockerize&quot;).</p>\n<h3>OR booleano</h3>\n<pre><code class=\"hljs language-plaintext\">?q=docker+OR+kubernetes</code></pre><p>Devuelve memorias que contienen &quot;docker&quot; OR &quot;kubernetes&quot;.</p>\n<h3>NOT booleano</h3>\n<pre><code class=\"hljs language-plaintext\">?q=docker+-swarm\n?q=docker+NOT+swarm</code></pre><p>Devuelve memorias que contienen &quot;docker&quot; pero NOT &quot;swarm&quot;.</p>\n<h3>Agrupamiento</h3>\n<pre><code class=\"hljs language-plaintext\">?q=(docker+OR+kubernetes)+-test</code></pre><p>Devuelve memorias que contienen &quot;docker&quot; o &quot;kubernetes&quot;, pero no &quot;test&quot;.</p>\n<h2>Ejemplos prácticos</h2>\n<h3>Buscar memorias sobre un proyecto</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>Buscar frase exacta</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 memorias de test</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 tecnología</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 ordena los resultados por relevancia usando el algoritmo BM25. Factores:</p>\n<ul>\n<li>Frecuencia del término (con qué frecuencia aparece)</li>\n<li>Frecuencia inversa de documento (términos más raros obtienen mayor ranking)</li>\n<li>Longitud del documento (documentos más cortos con el término suben)</li>\n<li>Peso de columna (title &gt; content)</li>\n</ul>\n<p>Los resultados se devuelven en orden de ranking (más relevantes primero).</p>\n<h2>Rendimiento</h2>\n<table>\n<thead>\n<tr>\n<th>Operación</th>\n<th>Latencia</th>\n</tr>\n</thead>\n<tbody><tr>\n<td>Search 100 memories</td>\n<td>&lt; 5ms</td>\n</tr>\n<tr>\n<td>Search 1,000 memories</td>\n<td>&lt; 10ms</td>\n</tr>\n<tr>\n<td>Search 10,000 memories</td>\n<td>&lt; 25ms</td>\n</tr>\n<tr>\n<td>Search 100,000 memories</td>\n<td>&lt; 100ms</td>\n</tr>\n</tbody></table>\n<p>FTS5 está altamente optimizado para cargas de trabajo con muchas lecturas.</p>\n<h2>Limitaciones</h2>\n<h3>Stemming</h3>\n<p>FTS5 no hace stemming por defecto. &quot;running&quot; y &quot;run&quot; son términos diferentes.</p>\n<p><strong>Workaround:</strong> Use coincidencia por prefijo: <code>?q=run*</code></p>\n<h3>Tolerancia a erratas</h3>\n<p>FTS5 no admite coincidencia difusa. Una errata no devolverá resultados.</p>\n<p><strong>Workaround:</strong> Use búsqueda semántica (<code>/memory/semantic-search</code>) para\ncoincidencia conceptual.</p>\n<h3>Stop words</h3>\n<p>Las palabras comunes (the, a, an, is) se indexan pero pueden no ser útiles para\nla búsqueda. FTS5 lo gestiona automáticamente.</p>\n<h2>FTS5 vs Búsqueda semántica</h2>\n<table>\n<thead>\n<tr>\n<th>Aspecto</th>\n<th>FTS5</th>\n<th>Búsqueda semántica</th>\n</tr>\n</thead>\n<tbody><tr>\n<td>Velocidad</td>\n<td>Sub-milisegundo</td>\n<td>50-100ms</td>\n</tr>\n<tr>\n<td>Coincidencia</td>\n<td>Palabras clave exactas</td>\n<td>Conceptual</td>\n</tr>\n<tr>\n<td>Tolerancia a erratas</td>\n<td>Ninguna</td>\n<td>Alguna</td>\n</tr>\n<tr>\n<td>Stemming</td>\n<td>Ninguno</td>\n<td>Implícito</td>\n</tr>\n<tr>\n<td>Requiere embeddings</td>\n<td>No</td>\n<td>Sí</td>\n</tr>\n<tr>\n<td>Mejor para</td>\n<td>Términos específicos</td>\n<td>Conceptos</td>\n</tr>\n</tbody></table>\n<p>Use FTS5 cuando conozca las palabras clave. Use búsqueda semántica cuando quiera\n&quot;memorias sobre X&quot; donde X se describe de forma diferente.</p>\n<h2>Mejores prácticas</h2>\n<div class=\"callout callout-ok\"></div><h2>Próximos pasos</h2>\n<ul>\n<li><a href=\"/docs/concepts/semantic-search\">Búsqueda semántica</a></li>\n<li><a href=\"/docs/api/memory\">API de Memory</a></li>\n<li><a href=\"/docs/guides/memory-best-practices\">Mejores prácticas de memoria</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"]}