{"title":"Pencarian Teks Penuh FTS5","slug":"fts5-search","category":"concepts","summary":"Bagaimana Synapse menggunakan SQLite FTS5 untuk pencarian memori teks penuh sub-milidetik.","audience":["human","llm"],"tags":["concept","search","fts5","fulltext"],"difficulty":"advanced","updated":"2026-06-27","word_count":579,"read_minutes":3,"lang":"id","translated":true,"requested_lang":"id","content_markdown":"\n# Pencarian Teks Penuh FTS5\n\nSynapse menggunakan FTS5 (Full-Text Search 5) untuk pencarian memori yang cepat\ndan fleksibel. Halaman ini menjelaskan cara kerjanya dan cara menggunakannya\nsecara efektif.\n\n## Apa itu FTS5?\n\nFTS5 adalah ekstensi SQLite (juga tersedia di PostgreSQL melalui ekstensi) yang\nmenyediakan kemampuan pencarian teks penuh. FTS5:\n\n- Mengindeks konten teks untuk pencarian kata kunci yang cepat\n- Mendukung operator boolean (AND, OR, NOT)\n- Mendukung pencocokan frasa dengan tanda kutip\n- Mendukung pencocokan prefix dengan `*`\n- Memberi peringkat hasil berdasarkan relevansi\n\nSynapse menggunakan FTS5 untuk mengindeks semua konten memori, memungkinkan\npencarian sub-milidetik di ribuan memori.\n\n## Bagaimana Synapse Menggunakan FTS5\n\nSaat Anda `POST /memory`:\n\n1. Konten memori disimpan di tabel `memories`\n2. Konten juga dimasukkan ke tabel virtual FTS5\n3. FTS5 secara otomatis menokenisasi dan mengindeks konten\n\nSaat Anda `GET /memory/search?q=...`:\n\n1. Synapse mengurai kueri menggunakan sintaks FTS5\n2. Menjalankan `MATCH` terhadap indeks FTS5\n3. Memfilter berdasarkan `mind_id` (isolasi tenant)\n4. Mengembalikan hasil yang diberi peringkat\n\n## Sintaks Kueri\n\n### Pencarian kata kunci sederhana\n\n```\n?q=docker\n```\n\nMengembalikan memori yang mengandung \"docker\".\n\n### Beberapa kata kunci (AND implisit)\n\n```\n?q=docker+swarm\n?q=docker%20swarm\n```\n\nMengembalikan memori yang mengandung \"docker\" DAN \"swarm\".\n\n### Pencocokan frasa\n\n```\n?q=\"docker+swarm\"\n?q=%22docker%20swarm%22\n```\n\nMengembalikan memori yang mengandung frasa persis \"docker swarm\".\n\n### Pencocokan prefix\n\n```\n?q=docker*\n```\n\nMengembalikan memori yang mengandung kata yang dimulai dengan \"docker\" (mis.\n\"dockers\", \"dockerfile\", \"dockerize\").\n\n### Boolean OR\n\n```\n?q=docker+OR+kubernetes\n```\n\nMengembalikan memori yang mengandung \"docker\" ATAU \"kubernetes\".\n\n### Boolean NOT\n\n```\n?q=docker+-swarm\n?q=docker+NOT+swarm\n```\n\nMengembalikan memori yang mengandung \"docker\" tetapi TIDAK \"swarm\".\n\n### Pengelompokan\n\n```\n?q=(docker+OR+kubernetes)+-test\n```\n\nMengembalikan memori yang mengandung \"docker\" atau \"kubernetes\", tetapi tidak \"test\".\n\n## Contoh Praktis\n\n### Mencari memori tentang sebuah proyek\n\n```bash\ncurl -H \"Authorization: Bearer YOUR_MIND_KEY\" \\\n     \"https://synapse.schaefer.zone/memory/search?q=synapse+deployment\"\n```\n\n### Mencari frasa persis\n\n```bash\ncurl -H \"Authorization: Bearer YOUR_MIND_KEY\" \\\n     \"https://synapse.schaefer.zone/memory/search?q=%22docker+swarm%22\"\n```\n\n### Mengecualikan memori uji\n\n```bash\ncurl -H \"Authorization: Bearer YOUR_MIND_KEY\" \\\n     \"https://synapse.schaefer.zone/memory/search?q=production+-test\"\n```\n\n### Mencari berdasarkan teknologi\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## Peringkat\n\nFTS5 memberi peringkat hasil berdasarkan relevansi menggunakan algoritma BM25. Faktor:\n\n- Frekuensi istilah (seberapa sering istilah muncul)\n- Inverse document frequency (istilah yang lebih langka berperingkat lebih tinggi)\n- Panjang dokumen (dokumen lebih pendek dengan istilah tersebut berperingkat lebih tinggi)\n- Bobot kolom (title > content)\n\nHasil dikembalikan dalam urutan peringkat (paling relevan pertama).\n\n## Performa\n\n| Operasi | Latensi |\n|-----------|---------|\n| Mencari 100 memori | < 5ms |\n| Mencari 1.000 memori | < 10ms |\n| Mencari 10.000 memori | < 25ms |\n| Mencari 100.000 memori | < 100ms |\n\nFTS5 sangat dioptimalkan untuk beban kerja yang banyak dibaca.\n\n## Batasan\n\n### Stemming\n\nFTS5 tidak melakukan stemming secara default. \"running\" dan \"run\" adalah istilah yang berbeda.\n\n**Solusi:** Gunakan pencocokan prefix: `?q=run*`\n\n### Toleransi typo\n\nFTS5 tidak mendukung pencocokan fuzzy. Typo akan mengembalikan tidak ada hasil.\n\n**Solusi:** Gunakan pencarian semantik (`/memory/semantic-search`) untuk\npencocokan konseptual.\n\n### Stop words\n\nKata umum (the, a, an, is) diindeks tetapi mungkin tidak berguna untuk pencarian.\nFTS5 menangani ini secara otomatis.\n\n## FTS5 vs Pencarian Semantik\n\n| Aspek | FTS5 | Pencarian Semantik |\n|--------|------|-----------------|\n| Kecepatan | Sub-milidetik | 50-100ms |\n| Pencocokan | Kata kunci persis | Konseptual |\n| Toleransi typo | Tidak ada | Sebagian |\n| Stemming | Tidak ada | Implisit |\n| Memerlukan embeddings | Tidak | Ya |\n| Terbaik untuk | Istilah spesifik | Konsep |\n\nGunakan FTS5 ketika Anda tahu kata kuncinya. Gunakan pencarian semantik ketika\nAnda ingin \"memori tentang X\" di mana X dideskripsikan secara berbeda.\n\n## Praktik Terbaik\n\n> [!TIP]\n> - **Gunakan istilah spesifik** — \"docker swarm\" lebih baik dari \"container orchestration\"\n> - **Kutip frasa** — `\"docker swarm\"` memastikan pencocokan frasa\n> - **Gunakan prefix untuk variasi** — `deploy*` menangkap \"deploy\", \"deployment\", \"deploying\"\n> - **Kecualikan kebisingan** — `-test` memfilter memori uji\n> - **Kombinasikan dengan tag** — `?q=docker&tag=production` mempersempit hasil\n\n## Langkah Berikutnya\n\n- [Pencarian Semantik](/docs/concepts/semantic-search)\n- [Memory API](/docs/api/memory)\n- [Praktik Terbaik Memori](/docs/guides/memory-best-practices)\n","content_html":"<h1>Pencarian Teks Penuh FTS5</h1>\n<p>Synapse menggunakan FTS5 (Full-Text Search 5) untuk pencarian memori yang cepat\ndan fleksibel. Halaman ini menjelaskan cara kerjanya dan cara menggunakannya\nsecara efektif.</p>\n<h2>Apa itu FTS5?</h2>\n<p>FTS5 adalah ekstensi SQLite (juga tersedia di PostgreSQL melalui ekstensi) yang\nmenyediakan kemampuan pencarian teks penuh. FTS5:</p>\n<ul>\n<li>Mengindeks konten teks untuk pencarian kata kunci yang cepat</li>\n<li>Mendukung operator boolean (AND, OR, NOT)</li>\n<li>Mendukung pencocokan frasa dengan tanda kutip</li>\n<li>Mendukung pencocokan prefix dengan <code>*</code></li>\n<li>Memberi peringkat hasil berdasarkan relevansi</li>\n</ul>\n<p>Synapse menggunakan FTS5 untuk mengindeks semua konten memori, memungkinkan\npencarian sub-milidetik di ribuan memori.</p>\n<h2>Bagaimana Synapse Menggunakan FTS5</h2>\n<p>Saat Anda <code>POST /memory</code>:</p>\n<ol>\n<li>Konten memori disimpan di tabel <code>memories</code></li>\n<li>Konten juga dimasukkan ke tabel virtual FTS5</li>\n<li>FTS5 secara otomatis menokenisasi dan mengindeks konten</li>\n</ol>\n<p>Saat Anda <code>GET /memory/search?q=...</code>:</p>\n<ol>\n<li>Synapse mengurai kueri menggunakan sintaks FTS5</li>\n<li>Menjalankan <code>MATCH</code> terhadap indeks FTS5</li>\n<li>Memfilter berdasarkan <code>mind_id</code> (isolasi tenant)</li>\n<li>Mengembalikan hasil yang diberi peringkat</li>\n</ol>\n<h2>Sintaks Kueri</h2>\n<h3>Pencarian kata kunci sederhana</h3>\n<pre><code class=\"hljs language-plaintext\">?q=docker</code></pre><p>Mengembalikan memori yang mengandung &quot;docker&quot;.</p>\n<h3>Beberapa kata kunci (AND implisit)</h3>\n<pre><code class=\"hljs language-plaintext\">?q=docker+swarm\n?q=docker%20swarm</code></pre><p>Mengembalikan memori yang mengandung &quot;docker&quot; DAN &quot;swarm&quot;.</p>\n<h3>Pencocokan frasa</h3>\n<pre><code class=\"hljs language-plaintext\">?q=&quot;docker+swarm&quot;\n?q=%22docker%20swarm%22</code></pre><p>Mengembalikan memori yang mengandung frasa persis &quot;docker swarm&quot;.</p>\n<h3>Pencocokan prefix</h3>\n<pre><code class=\"hljs language-plaintext\">?q=docker*</code></pre><p>Mengembalikan memori yang mengandung kata yang dimulai dengan &quot;docker&quot; (mis.\n&quot;dockers&quot;, &quot;dockerfile&quot;, &quot;dockerize&quot;).</p>\n<h3>Boolean OR</h3>\n<pre><code class=\"hljs language-plaintext\">?q=docker+OR+kubernetes</code></pre><p>Mengembalikan memori yang mengandung &quot;docker&quot; ATAU &quot;kubernetes&quot;.</p>\n<h3>Boolean NOT</h3>\n<pre><code class=\"hljs language-plaintext\">?q=docker+-swarm\n?q=docker+NOT+swarm</code></pre><p>Mengembalikan memori yang mengandung &quot;docker&quot; tetapi TIDAK &quot;swarm&quot;.</p>\n<h3>Pengelompokan</h3>\n<pre><code class=\"hljs language-plaintext\">?q=(docker+OR+kubernetes)+-test</code></pre><p>Mengembalikan memori yang mengandung &quot;docker&quot; atau &quot;kubernetes&quot;, tetapi tidak &quot;test&quot;.</p>\n<h2>Contoh Praktis</h2>\n<h3>Mencari memori tentang sebuah proyek</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>Mencari frasa persis</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>Mengecualikan memori uji</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>Mencari berdasarkan teknologi</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>Peringkat</h2>\n<p>FTS5 memberi peringkat hasil berdasarkan relevansi menggunakan algoritma BM25. Faktor:</p>\n<ul>\n<li>Frekuensi istilah (seberapa sering istilah muncul)</li>\n<li>Inverse document frequency (istilah yang lebih langka berperingkat lebih tinggi)</li>\n<li>Panjang dokumen (dokumen lebih pendek dengan istilah tersebut berperingkat lebih tinggi)</li>\n<li>Bobot kolom (title &gt; content)</li>\n</ul>\n<p>Hasil dikembalikan dalam urutan peringkat (paling relevan pertama).</p>\n<h2>Performa</h2>\n<table>\n<thead>\n<tr>\n<th>Operasi</th>\n<th>Latensi</th>\n</tr>\n</thead>\n<tbody><tr>\n<td>Mencari 100 memori</td>\n<td>&lt; 5ms</td>\n</tr>\n<tr>\n<td>Mencari 1.000 memori</td>\n<td>&lt; 10ms</td>\n</tr>\n<tr>\n<td>Mencari 10.000 memori</td>\n<td>&lt; 25ms</td>\n</tr>\n<tr>\n<td>Mencari 100.000 memori</td>\n<td>&lt; 100ms</td>\n</tr>\n</tbody></table>\n<p>FTS5 sangat dioptimalkan untuk beban kerja yang banyak dibaca.</p>\n<h2>Batasan</h2>\n<h3>Stemming</h3>\n<p>FTS5 tidak melakukan stemming secara default. &quot;running&quot; dan &quot;run&quot; adalah istilah yang berbeda.</p>\n<p><strong>Solusi:</strong> Gunakan pencocokan prefix: <code>?q=run*</code></p>\n<h3>Toleransi typo</h3>\n<p>FTS5 tidak mendukung pencocokan fuzzy. Typo akan mengembalikan tidak ada hasil.</p>\n<p><strong>Solusi:</strong> Gunakan pencarian semantik (<code>/memory/semantic-search</code>) untuk\npencocokan konseptual.</p>\n<h3>Stop words</h3>\n<p>Kata umum (the, a, an, is) diindeks tetapi mungkin tidak berguna untuk pencarian.\nFTS5 menangani ini secara otomatis.</p>\n<h2>FTS5 vs Pencarian Semantik</h2>\n<table>\n<thead>\n<tr>\n<th>Aspek</th>\n<th>FTS5</th>\n<th>Pencarian Semantik</th>\n</tr>\n</thead>\n<tbody><tr>\n<td>Kecepatan</td>\n<td>Sub-milidetik</td>\n<td>50-100ms</td>\n</tr>\n<tr>\n<td>Pencocokan</td>\n<td>Kata kunci persis</td>\n<td>Konseptual</td>\n</tr>\n<tr>\n<td>Toleransi typo</td>\n<td>Tidak ada</td>\n<td>Sebagian</td>\n</tr>\n<tr>\n<td>Stemming</td>\n<td>Tidak ada</td>\n<td>Implisit</td>\n</tr>\n<tr>\n<td>Memerlukan embeddings</td>\n<td>Tidak</td>\n<td>Ya</td>\n</tr>\n<tr>\n<td>Terbaik untuk</td>\n<td>Istilah spesifik</td>\n<td>Konsep</td>\n</tr>\n</tbody></table>\n<p>Gunakan FTS5 ketika Anda tahu kata kuncinya. Gunakan pencarian semantik ketika\nAnda ingin &quot;memori tentang X&quot; di mana X dideskripsikan secara berbeda.</p>\n<h2>Praktik Terbaik</h2>\n<div class=\"callout callout-ok\"></div><h2>Langkah Berikutnya</h2>\n<ul>\n<li><a href=\"/docs/concepts/semantic-search\">Pencarian Semantik</a></li>\n<li><a href=\"/docs/api/memory\">Memory API</a></li>\n<li><a href=\"/docs/guides/memory-best-practices\">Praktik Terbaik Memori</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"]}