{"title":"FTS5 fulltextssökning","slug":"fts5-search","category":"concepts","summary":"Hur Synapse använder SQLite FTS5 för fulltextssökning av minnen under en millisekund.","audience":["human","llm"],"tags":["concept","search","fts5","fulltext"],"difficulty":"advanced","updated":"2026-06-27","word_count":549,"read_minutes":3,"lang":"sv","translated":true,"requested_lang":"sv","content_markdown":"\n# FTS5 fulltextssökning\n\nSynapse använder FTS5 (Full-Text Search 5) för snabb, flexibel minnessökning.\nDen här sidan förklarar hur det fungerar och hur man använder det effektivt.\n\n## Vad är FTS5?\n\nFTS5 är ett SQLite-tillägg (även tillgängligt i PostgreSQL via tillägg) som\ntillhandahåller fulltextssökningsfunktionalitet. Det:\n\n- Indexerar textinnehåll för snabb nyckelordssökning\n- Stöder booleska operatorer (AND, OR, NOT)\n- Stöder frasmatchning med citattecken\n- Stöder prefixmatchning med `*`\n- Rankar resultat efter relevans\n\nSynapse använder FTS5 för att indexera allt minnesinnehåll, vilket möjliggör\nsökning under en millisekund över tusentals minnen.\n\n## Hur Synapse använder FTS5\n\nNär ni gör `POST /memory`:\n\n1. Minnesinnehåll lagras i `memories`-tabellen\n2. Innehåll infogas också i FTS5 virtuell tabell\n3. FTS5 tokeniserar och indexerar innehållet automatiskt\n\nNär ni gör `GET /memory/search?q=...`:\n\n1. Synapse tolkar frågan med FTS5-syntax\n2. Kör en `MATCH` mot FTS5-indexet\n3. Filtrerar efter `mind_id` (klientisolation)\n4. Returnerar rankade resultat\n\n## Frågesyntax\n\n### Enkel nyckelordssökning\n\n```\n?q=docker\n```\n\nReturnerar minnen som innehåller \"docker\".\n\n### Flera nyckelord (implicit AND)\n\n```\n?q=docker+swarm\n?q=docker%20swarm\n```\n\nReturnerar minnen som innehåller BÅDE \"docker\" OCH \"swarm\".\n\n### Frasmatchning\n\n```\n?q=\"docker+swarm\"\n?q=%22docker%20swarm%22\n```\n\nReturnerar minnen som innehåller den exakta frasen \"docker swarm\".\n\n### Prefixmatchning\n\n```\n?q=docker*\n```\n\nReturnerar minnen som innehåller ord som börjar med \"docker\" (t.ex. \"dockers\",\n\"dockerfile\", \"dockerize\").\n\n### Boolesk OR\n\n```\n?q=docker+OR+kubernetes\n```\n\nReturnerar minnen som innehåller \"docker\" ELLER \"kubernetes\".\n\n### Boolesk NOT\n\n```\n?q=docker+-swarm\n?q=docker+NOT+swarm\n```\n\nReturnerar minnen som innehåller \"docker\" men INTE \"swarm\".\n\n### Gruppering\n\n```\n?q=(docker+OR+kubernetes)+-test\n```\n\nReturnerar minnen som innehåller \"docker\" eller \"kubernetes\", men inte \"test\".\n\n## Praktiska exempel\n\n### Hitta minnen om ett projekt\n\n```bash\ncurl -H \"Authorization: Bearer YOUR_MIND_KEY\" \\\n     \"https://synapse.schaefer.zone/memory/search?q=synapse+deployment\"\n```\n\n### Hitta exakt fras\n\n```bash\ncurl -H \"Authorization: Bearer YOUR_MIND_KEY\" \\\n     \"https://synapse.schaefer.zone/memory/search?q=%22docker+swarm%22\"\n```\n\n### Uteslut testminnen\n\n```bash\ncurl -H \"Authorization: Bearer YOUR_MIND_KEY\" \\\n     \"https://synapse.schaefer.zone/memory/search?q=production+-test\"\n```\n\n### Hitta efter teknik\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## Rankning\n\nFTS5 rankar resultat efter relevans med BM25-algoritmen. Faktorer:\n\n- Termfrekvens (hur ofta termen förekommer)\n- Inverse document frequency (sällsynta termer rankas högre)\n- Dokumentlängd (kortare dokument med termen rankas högre)\n- Kolumnvikt (title > content)\n\nResultat returneras i rankningsordning (mest relevant först).\n\n## Prestanda\n\n| Åtgärd | Latens |\n|-----------|---------|\n| Sök 100 minnen | < 5 ms |\n| Sök 1 000 minnen | < 10 ms |\n| Sök 10 000 minnen | < 25 ms |\n| Sök 100 000 minnen | < 100 ms |\n\nFTS5 är högt optimerat för läsintensiva arbetsbelastningar.\n\n## Begränsningar\n\n### Stamning\n\nFTS5 gör inte stamning som standard. \"running\" och \"run\" är olika termer.\n\n**Lösning:** Använd prefixmatchning: `?q=run*`\n\n### Tolerans mot felstavning\n\nFTS5 stöder inte oskarp matchning. En felstavning returnerar inga resultat.\n\n**Lösning:** Använd semantisk sökning (`/memory/semantic-search`) för\nbegreppsmatchning.\n\n### Stopword\n\nVanliga ord (the, a, an, is) indexeras men kanske inte är användbara för\nsökning. FTS5 hanterar detta automatiskt.\n\n## FTS5 vs semantisk sökning\n\n| Aspekt | FTS5 | Semantisk sökning |\n|--------|------|-----------------|\n| Hastighet | Under en millisekund | 50–100 ms |\n| Matchning | Exakta nyckelord | Begreppslig |\n| Tolerans mot felstavning | Ingen | Någon |\n| Stamning | Ingen | Implicit |\n| Kräver inbäddningar | Nej | Ja |\n| Bäst för | Specifika termer | Begrepp |\n\nAnvänd FTS5 när ni känner till nyckelorden. Använd semantisk sökning när ni\nvill ha \"minnen om X\" där X beskrivs på ett annat sätt.\n\n## Bästa praxis\n\n> [!TIP]\n> - **Använd specifika termer** — \"docker swarm\" slår \"container orchestration\"\n> - **Citera fraser** — `\"docker swarm\"` säkerställer frasmatchning\n> - **Använd prefix för variationer** — `deploy*` fångar \"deploy\", \"deployment\", \"deploying\"\n> - **Uteslut brus** — `-test` filtrerar bort testminnen\n> - **Kombinera med taggar** — `?q=docker&tag=production` snävar in resultatet\n\n## Nästa steg\n\n- [Semantisk sökning](/docs/concepts/semantic-search)\n- [Memory API](/docs/api/memory)\n- [Minnesbästa praxis](/docs/guides/memory-best-practices)\n","content_html":"<h1>FTS5 fulltextssökning</h1>\n<p>Synapse använder FTS5 (Full-Text Search 5) för snabb, flexibel minnessökning.\nDen här sidan förklarar hur det fungerar och hur man använder det effektivt.</p>\n<h2>Vad är FTS5?</h2>\n<p>FTS5 är ett SQLite-tillägg (även tillgängligt i PostgreSQL via tillägg) som\ntillhandahåller fulltextssökningsfunktionalitet. Det:</p>\n<ul>\n<li>Indexerar textinnehåll för snabb nyckelordssökning</li>\n<li>Stöder booleska operatorer (AND, OR, NOT)</li>\n<li>Stöder frasmatchning med citattecken</li>\n<li>Stöder prefixmatchning med <code>*</code></li>\n<li>Rankar resultat efter relevans</li>\n</ul>\n<p>Synapse använder FTS5 för att indexera allt minnesinnehåll, vilket möjliggör\nsökning under en millisekund över tusentals minnen.</p>\n<h2>Hur Synapse använder FTS5</h2>\n<p>När ni gör <code>POST /memory</code>:</p>\n<ol>\n<li>Minnesinnehåll lagras i <code>memories</code>-tabellen</li>\n<li>Innehåll infogas också i FTS5 virtuell tabell</li>\n<li>FTS5 tokeniserar och indexerar innehållet automatiskt</li>\n</ol>\n<p>När ni gör <code>GET /memory/search?q=...</code>:</p>\n<ol>\n<li>Synapse tolkar frågan med FTS5-syntax</li>\n<li>Kör en <code>MATCH</code> mot FTS5-indexet</li>\n<li>Filtrerar efter <code>mind_id</code> (klientisolation)</li>\n<li>Returnerar rankade resultat</li>\n</ol>\n<h2>Frågesyntax</h2>\n<h3>Enkel nyckelordssökning</h3>\n<pre><code class=\"hljs language-plaintext\">?q=docker</code></pre><p>Returnerar minnen som innehåller &quot;docker&quot;.</p>\n<h3>Flera nyckelord (implicit AND)</h3>\n<pre><code class=\"hljs language-plaintext\">?q=docker+swarm\n?q=docker%20swarm</code></pre><p>Returnerar minnen som innehåller BÅDE &quot;docker&quot; OCH &quot;swarm&quot;.</p>\n<h3>Frasmatchning</h3>\n<pre><code class=\"hljs language-plaintext\">?q=&quot;docker+swarm&quot;\n?q=%22docker%20swarm%22</code></pre><p>Returnerar minnen som innehåller den exakta frasen &quot;docker swarm&quot;.</p>\n<h3>Prefixmatchning</h3>\n<pre><code class=\"hljs language-plaintext\">?q=docker*</code></pre><p>Returnerar minnen som innehåller ord som börjar med &quot;docker&quot; (t.ex. &quot;dockers&quot;,\n&quot;dockerfile&quot;, &quot;dockerize&quot;).</p>\n<h3>Boolesk OR</h3>\n<pre><code class=\"hljs language-plaintext\">?q=docker+OR+kubernetes</code></pre><p>Returnerar minnen som innehåller &quot;docker&quot; ELLER &quot;kubernetes&quot;.</p>\n<h3>Boolesk NOT</h3>\n<pre><code class=\"hljs language-plaintext\">?q=docker+-swarm\n?q=docker+NOT+swarm</code></pre><p>Returnerar minnen som innehåller &quot;docker&quot; men INTE &quot;swarm&quot;.</p>\n<h3>Gruppering</h3>\n<pre><code class=\"hljs language-plaintext\">?q=(docker+OR+kubernetes)+-test</code></pre><p>Returnerar minnen som innehåller &quot;docker&quot; eller &quot;kubernetes&quot;, men inte &quot;test&quot;.</p>\n<h2>Praktiska exempel</h2>\n<h3>Hitta minnen om ett projekt</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>Hitta exakt fras</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>Uteslut testminnen</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>Hitta efter teknik</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>Rankning</h2>\n<p>FTS5 rankar resultat efter relevans med BM25-algoritmen. Faktorer:</p>\n<ul>\n<li>Termfrekvens (hur ofta termen förekommer)</li>\n<li>Inverse document frequency (sällsynta termer rankas högre)</li>\n<li>Dokumentlängd (kortare dokument med termen rankas högre)</li>\n<li>Kolumnvikt (title &gt; content)</li>\n</ul>\n<p>Resultat returneras i rankningsordning (mest relevant först).</p>\n<h2>Prestanda</h2>\n<table>\n<thead>\n<tr>\n<th>Åtgärd</th>\n<th>Latens</th>\n</tr>\n</thead>\n<tbody><tr>\n<td>Sök 100 minnen</td>\n<td>&lt; 5 ms</td>\n</tr>\n<tr>\n<td>Sök 1 000 minnen</td>\n<td>&lt; 10 ms</td>\n</tr>\n<tr>\n<td>Sök 10 000 minnen</td>\n<td>&lt; 25 ms</td>\n</tr>\n<tr>\n<td>Sök 100 000 minnen</td>\n<td>&lt; 100 ms</td>\n</tr>\n</tbody></table>\n<p>FTS5 är högt optimerat för läsintensiva arbetsbelastningar.</p>\n<h2>Begränsningar</h2>\n<h3>Stamning</h3>\n<p>FTS5 gör inte stamning som standard. &quot;running&quot; och &quot;run&quot; är olika termer.</p>\n<p><strong>Lösning:</strong> Använd prefixmatchning: <code>?q=run*</code></p>\n<h3>Tolerans mot felstavning</h3>\n<p>FTS5 stöder inte oskarp matchning. En felstavning returnerar inga resultat.</p>\n<p><strong>Lösning:</strong> Använd semantisk sökning (<code>/memory/semantic-search</code>) för\nbegreppsmatchning.</p>\n<h3>Stopword</h3>\n<p>Vanliga ord (the, a, an, is) indexeras men kanske inte är användbara för\nsökning. FTS5 hanterar detta automatiskt.</p>\n<h2>FTS5 vs semantisk sökning</h2>\n<table>\n<thead>\n<tr>\n<th>Aspekt</th>\n<th>FTS5</th>\n<th>Semantisk sökning</th>\n</tr>\n</thead>\n<tbody><tr>\n<td>Hastighet</td>\n<td>Under en millisekund</td>\n<td>50–100 ms</td>\n</tr>\n<tr>\n<td>Matchning</td>\n<td>Exakta nyckelord</td>\n<td>Begreppslig</td>\n</tr>\n<tr>\n<td>Tolerans mot felstavning</td>\n<td>Ingen</td>\n<td>Någon</td>\n</tr>\n<tr>\n<td>Stamning</td>\n<td>Ingen</td>\n<td>Implicit</td>\n</tr>\n<tr>\n<td>Kräver inbäddningar</td>\n<td>Nej</td>\n<td>Ja</td>\n</tr>\n<tr>\n<td>Bäst för</td>\n<td>Specifika termer</td>\n<td>Begrepp</td>\n</tr>\n</tbody></table>\n<p>Använd FTS5 när ni känner till nyckelorden. Använd semantisk sökning när ni\nvill ha &quot;minnen om X&quot; där X beskrivs på ett annat sätt.</p>\n<h2>Bästa praxis</h2>\n<div class=\"callout callout-ok\"></div><h2>Nästa steg</h2>\n<ul>\n<li><a href=\"/docs/concepts/semantic-search\">Semantisk sökning</a></li>\n<li><a href=\"/docs/api/memory\">Memory API</a></li>\n<li><a href=\"/docs/guides/memory-best-practices\">Minnesbästa praxis</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"]}