{"title":"Recherche en texte intégral FTS5","slug":"fts5-search","category":"concepts","summary":"Comment Synapse utilise SQLite FTS5 pour la recherche de mémoire en texte intégral sub-milliseconde.","audience":["human","llm"],"tags":["concept","search","fts5","fulltext"],"difficulty":"advanced","updated":"2026-06-27","word_count":735,"read_minutes":4,"lang":"fr","translated":true,"requested_lang":"fr","content_markdown":"\n# Recherche en texte intégral FTS5\n\nSynapse utilise FTS5 (Full-Text Search 5) pour une recherche de mémoire rapide et\nflexible. Cette page explique son fonctionnement et comment l'utiliser efficacement.\n\n## Qu'est-ce que FTS5 ?\n\nFTS5 est une extension SQLite (aussi disponible dans PostgreSQL via des extensions)\nqui fournit des capacités de recherche en texte intégral. Elle :\n\n- Indexe le contenu textuel pour la recherche rapide par mot-clé\n- Prend en charge les opérateurs booléens (AND, OR, NOT)\n- Prend en charge la correspondance de phrases avec des guillemets\n- Prend en charge la correspondance par préfixe avec `*`\n- Classe les résultats par pertinence\n\nSynapse utilise FTS5 pour indexer tout le contenu des mémoires, ce qui permet une\nrecherche sub-milliseconde à travers des milliers de mémoires.\n\n## Comment Synapse utilise FTS5\n\nLorsque vous faites `POST /memory` :\n\n1. Le contenu de la mémoire est stocké dans la table `memories`\n2. Le contenu est aussi inséré dans la table virtuelle FTS5\n3. FTS5 tokenize et indexe automatiquement le contenu\n\nLorsque vous faites `GET /memory/search?q=...` :\n\n1. Synapse analyse la requête en utilisant la syntaxe FTS5\n2. Exécute un `MATCH` contre l'index FTS5\n3. Filtre par `mind_id` (isolation tenant)\n4. Renvoie les résultats classés\n\n## Syntaxe de requête\n\n### Recherche simple par mot-clé\n\n```\n?q=docker\n```\n\nRenvoie les mémoires contenant « docker ».\n\n### Plusieurs mots-clés (AND implicite)\n\n```\n?q=docker+swarm\n?q=docker%20swarm\n```\n\nRenvoie les mémoires contenant À LA FOIS « docker » ET « swarm ».\n\n### Correspondance de phrase\n\n```\n?q=\"docker+swarm\"\n?q=%22docker%20swarm%22\n```\n\nRenvoie les mémoires contenant la phrase exacte « docker swarm ».\n\n### Correspondance par préfixe\n\n```\n?q=docker*\n```\n\nRenvoie les mémoires contenant des mots commençant par « docker » (ex. « dockers »,\n« dockerfile », « dockerize »).\n\n### Booléen OR\n\n```\n?q=docker+OR+kubernetes\n```\n\nRenvoie les mémoires contenant « docker » OU « kubernetes ».\n\n### Booléen NOT\n\n```\n?q=docker+-swarm\n?q=docker+NOT+swarm\n```\n\nRenvoie les mémoires contenant « docker » mais PAS « swarm ».\n\n### Regroupement\n\n```\n?q=(docker+OR+kubernetes)+-test\n```\n\nRenvoie les mémoires contenant « docker » ou « kubernetes », mais pas « test ».\n\n## Exemples pratiques\n\n### Trouver des mémoires sur un projet\n\n```bash\ncurl -H \"Authorization: Bearer YOUR_MIND_KEY\" \\\n     \"https://synapse.schaefer.zone/memory/search?q=synapse+deployment\"\n```\n\n### Trouver une phrase exacte\n\n```bash\ncurl -H \"Authorization: Bearer YOUR_MIND_KEY\" \\\n     \"https://synapse.schaefer.zone/memory/search?q=%22docker+swarm%22\"\n```\n\n### Exclure les mémoires 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### Rechercher par technologie\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## Classement\n\nFTS5 classe les résultats par pertinence en utilisant l'algorithme BM25. Facteurs :\n\n- Fréquence du terme (combien de fois le terme apparaît)\n- Fréquence inverse de document (les termes rares sont mieux classés)\n- Longueur du document (les documents plus courts avec le terme sont mieux classés)\n- Pondération de colonne (titre > contenu)\n\nLes résultats sont renvoyés dans l'ordre de classement (les plus pertinents d'abord).\n\n## Performance\n\n| Opération | Latence |\n|-----------|---------|\n| Recherche dans 100 mémoires | < 5 ms |\n| Recherche dans 1 000 mémoires | < 10 ms |\n| Recherche dans 10 000 mémoires | < 25 ms |\n| Recherche dans 100 000 mémoires | < 100 ms |\n\nFTS5 est hautement optimisé pour les charges de travail à forte lecture.\n\n## Limites\n\n### Stemming\n\nFTS5 ne fait pas de stemming par défaut. « running » et « run » sont des termes\ndifférents.\n\n**Contournement :** Utilisez la correspondance par préfixe : `?q=run*`\n\n### Tolérance aux fautes de frappe\n\nFTS5 ne prend pas en charge la correspondance floue. Une faute de frappe ne renverra\naucun résultat.\n\n**Contournement :** Utilisez la recherche sémantique\n(`/memory/semantic-search`) pour la correspondance conceptuelle.\n\n### Mots vides\n\nLes mots courants (the, a, an, is) sont indexés mais peuvent ne pas être utiles pour\nla recherche. FTS5 gère cela automatiquement.\n\n## FTS5 vs recherche sémantique\n\n| Aspect | FTS5 | Recherche sémantique |\n|--------|------|-----------------|\n| Vitesse | Sub-milliseconde | 50-100 ms |\n| Correspondance | Mots-clés exacts | Conceptuelle |\n| Tolérance aux fautes | Aucune | Quelque peu |\n| Stemming | Aucun | Implicite |\n| Requiert des embeddings | Non | Oui |\n| Idéal pour | Termes spécifiques | Concepts |\n\nUtilisez FTS5 lorsque vous connaissez les mots-clés. Utilisez la recherche sémantique\nlorsque vous voulez « des mémoires sur X » où X est décrit différemment.\n\n## Bonnes pratiques\n\n> [!TIP]\n> - **Utilisez des termes spécifiques** — « docker swarm » bat « container orchestration »\n> - **Citez les phrases** — `\"docker swarm\"` garantit la correspondance de phrase\n> - **Utilisez un préfixe pour les variantes** — `deploy*` capture « deploy », « deployment », « deploying »\n> - **Excluez le bruit** — `-test` filtre les mémoires de test\n> - **Combinez avec les tags** — `?q=docker&tag=production` affine les résultats\n\n## Prochaines étapes\n\n- [Recherche sémantique](/docs/concepts/semantic-search)\n- [API Memory](/docs/api/memory)\n- [Bonnes pratiques mémoire](/docs/guides/memory-best-practices)\n","content_html":"<h1>Recherche en texte intégral FTS5</h1>\n<p>Synapse utilise FTS5 (Full-Text Search 5) pour une recherche de mémoire rapide et\nflexible. Cette page explique son fonctionnement et comment l&#39;utiliser efficacement.</p>\n<h2>Qu&#39;est-ce que FTS5 ?</h2>\n<p>FTS5 est une extension SQLite (aussi disponible dans PostgreSQL via des extensions)\nqui fournit des capacités de recherche en texte intégral. Elle :</p>\n<ul>\n<li>Indexe le contenu textuel pour la recherche rapide par mot-clé</li>\n<li>Prend en charge les opérateurs booléens (AND, OR, NOT)</li>\n<li>Prend en charge la correspondance de phrases avec des guillemets</li>\n<li>Prend en charge la correspondance par préfixe avec <code>*</code></li>\n<li>Classe les résultats par pertinence</li>\n</ul>\n<p>Synapse utilise FTS5 pour indexer tout le contenu des mémoires, ce qui permet une\nrecherche sub-milliseconde à travers des milliers de mémoires.</p>\n<h2>Comment Synapse utilise FTS5</h2>\n<p>Lorsque vous faites <code>POST /memory</code> :</p>\n<ol>\n<li>Le contenu de la mémoire est stocké dans la table <code>memories</code></li>\n<li>Le contenu est aussi inséré dans la table virtuelle FTS5</li>\n<li>FTS5 tokenize et indexe automatiquement le contenu</li>\n</ol>\n<p>Lorsque vous faites <code>GET /memory/search?q=...</code> :</p>\n<ol>\n<li>Synapse analyse la requête en utilisant la syntaxe FTS5</li>\n<li>Exécute un <code>MATCH</code> contre l&#39;index FTS5</li>\n<li>Filtre par <code>mind_id</code> (isolation tenant)</li>\n<li>Renvoie les résultats classés</li>\n</ol>\n<h2>Syntaxe de requête</h2>\n<h3>Recherche simple par mot-clé</h3>\n<pre><code class=\"hljs language-plaintext\">?q=docker</code></pre><p>Renvoie les mémoires contenant « docker ».</p>\n<h3>Plusieurs mots-clés (AND implicite)</h3>\n<pre><code class=\"hljs language-plaintext\">?q=docker+swarm\n?q=docker%20swarm</code></pre><p>Renvoie les mémoires contenant À LA FOIS « docker » ET « swarm ».</p>\n<h3>Correspondance de phrase</h3>\n<pre><code class=\"hljs language-plaintext\">?q=&quot;docker+swarm&quot;\n?q=%22docker%20swarm%22</code></pre><p>Renvoie les mémoires contenant la phrase exacte « docker swarm ».</p>\n<h3>Correspondance par préfixe</h3>\n<pre><code class=\"hljs language-plaintext\">?q=docker*</code></pre><p>Renvoie les mémoires contenant des mots commençant par « docker » (ex. « dockers »,\n« dockerfile », « dockerize »).</p>\n<h3>Booléen OR</h3>\n<pre><code class=\"hljs language-plaintext\">?q=docker+OR+kubernetes</code></pre><p>Renvoie les mémoires contenant « docker » OU « kubernetes ».</p>\n<h3>Booléen NOT</h3>\n<pre><code class=\"hljs language-plaintext\">?q=docker+-swarm\n?q=docker+NOT+swarm</code></pre><p>Renvoie les mémoires contenant « docker » mais PAS « swarm ».</p>\n<h3>Regroupement</h3>\n<pre><code class=\"hljs language-plaintext\">?q=(docker+OR+kubernetes)+-test</code></pre><p>Renvoie les mémoires contenant « docker » ou « kubernetes », mais pas « test ».</p>\n<h2>Exemples pratiques</h2>\n<h3>Trouver des mémoires sur un projet</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>Trouver une phrase exacte</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>Exclure les mémoires 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>Rechercher par technologie</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>Classement</h2>\n<p>FTS5 classe les résultats par pertinence en utilisant l&#39;algorithme BM25. Facteurs :</p>\n<ul>\n<li>Fréquence du terme (combien de fois le terme apparaît)</li>\n<li>Fréquence inverse de document (les termes rares sont mieux classés)</li>\n<li>Longueur du document (les documents plus courts avec le terme sont mieux classés)</li>\n<li>Pondération de colonne (titre &gt; contenu)</li>\n</ul>\n<p>Les résultats sont renvoyés dans l&#39;ordre de classement (les plus pertinents d&#39;abord).</p>\n<h2>Performance</h2>\n<table>\n<thead>\n<tr>\n<th>Opération</th>\n<th>Latence</th>\n</tr>\n</thead>\n<tbody><tr>\n<td>Recherche dans 100 mémoires</td>\n<td>&lt; 5 ms</td>\n</tr>\n<tr>\n<td>Recherche dans 1 000 mémoires</td>\n<td>&lt; 10 ms</td>\n</tr>\n<tr>\n<td>Recherche dans 10 000 mémoires</td>\n<td>&lt; 25 ms</td>\n</tr>\n<tr>\n<td>Recherche dans 100 000 mémoires</td>\n<td>&lt; 100 ms</td>\n</tr>\n</tbody></table>\n<p>FTS5 est hautement optimisé pour les charges de travail à forte lecture.</p>\n<h2>Limites</h2>\n<h3>Stemming</h3>\n<p>FTS5 ne fait pas de stemming par défaut. « running » et « run » sont des termes\ndifférents.</p>\n<p><strong>Contournement :</strong> Utilisez la correspondance par préfixe : <code>?q=run*</code></p>\n<h3>Tolérance aux fautes de frappe</h3>\n<p>FTS5 ne prend pas en charge la correspondance floue. Une faute de frappe ne renverra\naucun résultat.</p>\n<p><strong>Contournement :</strong> Utilisez la recherche sémantique\n(<code>/memory/semantic-search</code>) pour la correspondance conceptuelle.</p>\n<h3>Mots vides</h3>\n<p>Les mots courants (the, a, an, is) sont indexés mais peuvent ne pas être utiles pour\nla recherche. FTS5 gère cela automatiquement.</p>\n<h2>FTS5 vs recherche sémantique</h2>\n<table>\n<thead>\n<tr>\n<th>Aspect</th>\n<th>FTS5</th>\n<th>Recherche sémantique</th>\n</tr>\n</thead>\n<tbody><tr>\n<td>Vitesse</td>\n<td>Sub-milliseconde</td>\n<td>50-100 ms</td>\n</tr>\n<tr>\n<td>Correspondance</td>\n<td>Mots-clés exacts</td>\n<td>Conceptuelle</td>\n</tr>\n<tr>\n<td>Tolérance aux fautes</td>\n<td>Aucune</td>\n<td>Quelque peu</td>\n</tr>\n<tr>\n<td>Stemming</td>\n<td>Aucun</td>\n<td>Implicite</td>\n</tr>\n<tr>\n<td>Requiert des embeddings</td>\n<td>Non</td>\n<td>Oui</td>\n</tr>\n<tr>\n<td>Idéal pour</td>\n<td>Termes spécifiques</td>\n<td>Concepts</td>\n</tr>\n</tbody></table>\n<p>Utilisez FTS5 lorsque vous connaissez les mots-clés. Utilisez la recherche sémantique\nlorsque vous voulez « des mémoires sur X » où X est décrit différemment.</p>\n<h2>Bonnes pratiques</h2>\n<div class=\"callout callout-ok\"></div><h2>Prochaines étapes</h2>\n<ul>\n<li><a href=\"/docs/concepts/semantic-search\">Recherche sémantique</a></li>\n<li><a href=\"/docs/api/memory\">API Memory</a></li>\n<li><a href=\"/docs/guides/memory-best-practices\">Bonnes pratiques mémoire</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"]}