{"title":"Повнотекстовий пошук FTS5","slug":"fts5-search","category":"concepts","summary":"Як Synapse використовує SQLite FTS5 для повнотекстового пошуку спогадів із затримкою менше мілісекунди.","audience":["human","llm"],"tags":["concept","search","fts5","fulltext"],"difficulty":"advanced","updated":"2026-06-27","word_count":577,"read_minutes":3,"lang":"uk","translated":true,"requested_lang":"uk","content_markdown":"\n# Повнотекстовий пошук FTS5\n\nSynapse використовує FTS5 (Full-Text Search 5) для швидкого та гнучкого пошуку\nспогадів. Ця сторінка пояснює, як це працює та як ефективно ним користуватися.\n\n## Що таке FTS5?\n\nFTS5 — це розширення SQLite (також доступне в PostgreSQL через розширення), що\nзабезпечує можливості повнотекстового пошуку. Воно:\n\n- Індексує текстовий вміст для швидкого пошуку за ключовими словами\n- Підтримує булеві оператори (AND, OR, NOT)\n- Підтримує пошук фраз у лапках\n- Підтримує пошук за префіксом з `*`\n- Ранжує результати за релевантністю\n\nSynapse використовує FTS5 для індексування всього вмісту спогадів, забезпечуючи\nпошук із затримкою менше мілісекунди серед тисяч спогадів.\n\n## Як Synapse використовує FTS5\n\nКоли ви викликаєте `POST /memory`:\n\n1. Вміст спогаду зберігається в таблиці `memories`\n2. Вміст також вставляється у віртуальну таблицю FTS5\n3. FTS5 автоматично токенізує та індексує вміст\n\nКоли ви викликаєте `GET /memory/search?q=...`:\n\n1. Synapse розбирає запит із використанням синтаксису FTS5\n2. Виконує `MATCH` проти індексу FTS5\n3. Фільтрує за `mind_id` (ізоляція тенантів)\n4. Повертає ранжовані результати\n\n## Синтаксис запитів\n\n### Простий пошук за ключовим словом\n\n```\n?q=docker\n```\n\nПовертає спогади, що містять «docker».\n\n### Кілька ключових слів (неявний AND)\n\n```\n?q=docker+swarm\n?q=docker%20swarm\n```\n\nПовертає спогади, що містять ОБИДВА слова «docker» та «swarm».\n\n### Пошук фраз\n\n```\n?q=\"docker+swarm\"\n?q=%22docker%20swarm%22\n```\n\nПовертає спогади, що містять точну фразу «docker swarm».\n\n### Пошук за префіксом\n\n```\n?q=docker*\n```\n\nПовертає спогади зі словами, що починаються на «docker» (напр. «dockers»,\n«dockerfile», «dockerize»).\n\n### Булеве OR\n\n```\n?q=docker+OR+kubernetes\n```\n\nПовертає спогади, що містять «docker» АБО «kubernetes».\n\n### Булеве NOT\n\n```\n?q=docker+-swarm\n?q=docker+NOT+swarm\n```\n\nПовертає спогади, що містять «docker», але НЕ «swarm».\n\n### Групування\n\n```\n?q=(docker+OR+kubernetes)+-test\n```\n\nПовертає спогади, що містять «docker» або «kubernetes», але не «test».\n\n## Практичні приклади\n\n### Пошук спогадів про проєкт\n\n```bash\ncurl -H \"Authorization: Bearer YOUR_MIND_KEY\" \\\n     \"https://synapse.schaefer.zone/memory/search?q=synapse+deployment\"\n```\n\n### Пошук точної фрази\n\n```bash\ncurl -H \"Authorization: Bearer YOUR_MIND_KEY\" \\\n     \"https://synapse.schaefer.zone/memory/search?q=%22docker+swarm%22\"\n```\n\n### Виключення тестових спогадів\n\n```bash\ncurl -H \"Authorization: Bearer YOUR_MIND_KEY\" \\\n     \"https://synapse.schaefer.zone/memory/search?q=production+-test\"\n```\n\n### Пошук за технологією\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## Ранжування\n\nFTS5 ранжує результати за релевантністю за алгоритмом BM25. Фактори:\n\n- Частота терміна (як часто термін зустрічається)\n- Зворотна частота документа (рідкісні терміни ранжуються вище)\n- Довжина документа (коротші документи з терміном ранжуються вище)\n- Вага колонки (title > content)\n\nРезультати повертаються в порядку ранжування (найрелевантніші першими).\n\n## Продуктивність\n\n| Операція | Затримка |\n|-----------|---------|\n| Пошук у 100 спогадах | < 5мс |\n| Пошук у 1 000 спогадах | < 10мс |\n| Пошук у 10 000 спогадах | < 25мс |\n| Пошук у 100 000 спогадах | < 100мс |\n\nFTS5 добре оптимізований для навантажень з переважанням читання.\n\n## Обмеження\n\n### Стемінг\n\nFTS5 за замовчуванням не робить стемінг. «running» та «run» — різні терміни.\n\n**Обхідний шлях:** Використовуйте пошук за префіксом: `?q=run*`\n\n### Толерантність до опечаток\n\nFTS5 не підтримує нечіткий пошук. Опечатка не поверне результатів.\n\n**Обхідний шлях:** Використовуйте семантичний пошук\n(`/memory/semantic-search`) для концептуального зіставлення.\n\n### Стоп-слова\n\nПоширені слова (the, a, an, is) індексуються, але можуть бути не корисними для\nпошуку. FTS5 обробляє це автоматично.\n\n## FTS5 проти семантичного пошуку\n\n| Аспект | FTS5 | Семантичний пошук |\n|--------|------|-----------------|\n| Швидкість | Менше мілісекунди | 50-100мс |\n| Зіставлення | Точні ключові слова | Концептуальне |\n| Толерантність до опечаток | Немає | Деяка |\n| Стемінг | Немає | Неявний |\n| Потребує ембеддингів | Ні | Так |\n| Найкраще для | Конкретних термінів | Концепцій |\n\nВикористовуйте FTS5, коли знаєте ключові слова. Використовуйте семантичний пошук,\nколи потрібні «спогади про X», де X описано інакше.\n\n## Найкращі практики\n\n> [!TIP]\n> - **Використовуйте конкретні терміни** — «docker swarm» краще за «container orchestration»\n> - **Лапки для фраз** — `\"docker swarm\"` гарантує пошук фраз\n> - **Префікс для варіацій** — `deploy*` ловить «deploy», «deployment», «deploying»\n> - **Виключайте шум** — `-test` фільтрує тестові спогади\n> - **Комбінуйте з тегами** — `?q=docker&tag=production` звужує результати\n\n## Наступні кроки\n\n- [Семантичний пошук](/docs/concepts/semantic-search)\n- [Memory API](/docs/api/memory)\n- [Найкращі практики роботи з пам'яттю](/docs/guides/memory-best-practices)\n","content_html":"<h1>Повнотекстовий пошук FTS5</h1>\n<p>Synapse використовує FTS5 (Full-Text Search 5) для швидкого та гнучкого пошуку\nспогадів. Ця сторінка пояснює, як це працює та як ефективно ним користуватися.</p>\n<h2>Що таке FTS5?</h2>\n<p>FTS5 — це розширення SQLite (також доступне в PostgreSQL через розширення), що\nзабезпечує можливості повнотекстового пошуку. Воно:</p>\n<ul>\n<li>Індексує текстовий вміст для швидкого пошуку за ключовими словами</li>\n<li>Підтримує булеві оператори (AND, OR, NOT)</li>\n<li>Підтримує пошук фраз у лапках</li>\n<li>Підтримує пошук за префіксом з <code>*</code></li>\n<li>Ранжує результати за релевантністю</li>\n</ul>\n<p>Synapse використовує FTS5 для індексування всього вмісту спогадів, забезпечуючи\nпошук із затримкою менше мілісекунди серед тисяч спогадів.</p>\n<h2>Як Synapse використовує FTS5</h2>\n<p>Коли ви викликаєте <code>POST /memory</code>:</p>\n<ol>\n<li>Вміст спогаду зберігається в таблиці <code>memories</code></li>\n<li>Вміст також вставляється у віртуальну таблицю FTS5</li>\n<li>FTS5 автоматично токенізує та індексує вміст</li>\n</ol>\n<p>Коли ви викликаєте <code>GET /memory/search?q=...</code>:</p>\n<ol>\n<li>Synapse розбирає запит із використанням синтаксису FTS5</li>\n<li>Виконує <code>MATCH</code> проти індексу FTS5</li>\n<li>Фільтрує за <code>mind_id</code> (ізоляція тенантів)</li>\n<li>Повертає ранжовані результати</li>\n</ol>\n<h2>Синтаксис запитів</h2>\n<h3>Простий пошук за ключовим словом</h3>\n<pre><code class=\"hljs language-plaintext\">?q=docker</code></pre><p>Повертає спогади, що містять «docker».</p>\n<h3>Кілька ключових слів (неявний AND)</h3>\n<pre><code class=\"hljs language-plaintext\">?q=docker+swarm\n?q=docker%20swarm</code></pre><p>Повертає спогади, що містять ОБИДВА слова «docker» та «swarm».</p>\n<h3>Пошук фраз</h3>\n<pre><code class=\"hljs language-plaintext\">?q=&quot;docker+swarm&quot;\n?q=%22docker%20swarm%22</code></pre><p>Повертає спогади, що містять точну фразу «docker swarm».</p>\n<h3>Пошук за префіксом</h3>\n<pre><code class=\"hljs language-plaintext\">?q=docker*</code></pre><p>Повертає спогади зі словами, що починаються на «docker» (напр. «dockers»,\n«dockerfile», «dockerize»).</p>\n<h3>Булеве OR</h3>\n<pre><code class=\"hljs language-plaintext\">?q=docker+OR+kubernetes</code></pre><p>Повертає спогади, що містять «docker» АБО «kubernetes».</p>\n<h3>Булеве NOT</h3>\n<pre><code class=\"hljs language-plaintext\">?q=docker+-swarm\n?q=docker+NOT+swarm</code></pre><p>Повертає спогади, що містять «docker», але НЕ «swarm».</p>\n<h3>Групування</h3>\n<pre><code class=\"hljs language-plaintext\">?q=(docker+OR+kubernetes)+-test</code></pre><p>Повертає спогади, що містять «docker» або «kubernetes», але не «test».</p>\n<h2>Практичні приклади</h2>\n<h3>Пошук спогадів про проєкт</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>Пошук точної фрази</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>Виключення тестових спогадів</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>Пошук за технологією</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>Ранжування</h2>\n<p>FTS5 ранжує результати за релевантністю за алгоритмом BM25. Фактори:</p>\n<ul>\n<li>Частота терміна (як часто термін зустрічається)</li>\n<li>Зворотна частота документа (рідкісні терміни ранжуються вище)</li>\n<li>Довжина документа (коротші документи з терміном ранжуються вище)</li>\n<li>Вага колонки (title &gt; content)</li>\n</ul>\n<p>Результати повертаються в порядку ранжування (найрелевантніші першими).</p>\n<h2>Продуктивність</h2>\n<table>\n<thead>\n<tr>\n<th>Операція</th>\n<th>Затримка</th>\n</tr>\n</thead>\n<tbody><tr>\n<td>Пошук у 100 спогадах</td>\n<td>&lt; 5мс</td>\n</tr>\n<tr>\n<td>Пошук у 1 000 спогадах</td>\n<td>&lt; 10мс</td>\n</tr>\n<tr>\n<td>Пошук у 10 000 спогадах</td>\n<td>&lt; 25мс</td>\n</tr>\n<tr>\n<td>Пошук у 100 000 спогадах</td>\n<td>&lt; 100мс</td>\n</tr>\n</tbody></table>\n<p>FTS5 добре оптимізований для навантажень з переважанням читання.</p>\n<h2>Обмеження</h2>\n<h3>Стемінг</h3>\n<p>FTS5 за замовчуванням не робить стемінг. «running» та «run» — різні терміни.</p>\n<p><strong>Обхідний шлях:</strong> Використовуйте пошук за префіксом: <code>?q=run*</code></p>\n<h3>Толерантність до опечаток</h3>\n<p>FTS5 не підтримує нечіткий пошук. Опечатка не поверне результатів.</p>\n<p><strong>Обхідний шлях:</strong> Використовуйте семантичний пошук\n(<code>/memory/semantic-search</code>) для концептуального зіставлення.</p>\n<h3>Стоп-слова</h3>\n<p>Поширені слова (the, a, an, is) індексуються, але можуть бути не корисними для\nпошуку. FTS5 обробляє це автоматично.</p>\n<h2>FTS5 проти семантичного пошуку</h2>\n<table>\n<thead>\n<tr>\n<th>Аспект</th>\n<th>FTS5</th>\n<th>Семантичний пошук</th>\n</tr>\n</thead>\n<tbody><tr>\n<td>Швидкість</td>\n<td>Менше мілісекунди</td>\n<td>50-100мс</td>\n</tr>\n<tr>\n<td>Зіставлення</td>\n<td>Точні ключові слова</td>\n<td>Концептуальне</td>\n</tr>\n<tr>\n<td>Толерантність до опечаток</td>\n<td>Немає</td>\n<td>Деяка</td>\n</tr>\n<tr>\n<td>Стемінг</td>\n<td>Немає</td>\n<td>Неявний</td>\n</tr>\n<tr>\n<td>Потребує ембеддингів</td>\n<td>Ні</td>\n<td>Так</td>\n</tr>\n<tr>\n<td>Найкраще для</td>\n<td>Конкретних термінів</td>\n<td>Концепцій</td>\n</tr>\n</tbody></table>\n<p>Використовуйте FTS5, коли знаєте ключові слова. Використовуйте семантичний пошук,\nколи потрібні «спогади про X», де X описано інакше.</p>\n<h2>Найкращі практики</h2>\n<div class=\"callout callout-ok\"></div><h2>Наступні кроки</h2>\n<ul>\n<li><a href=\"/docs/concepts/semantic-search\">Семантичний пошук</a></li>\n<li><a href=\"/docs/api/memory\">Memory API</a></li>\n<li><a href=\"/docs/guides/memory-best-practices\">Найкращі практики роботи з пам&#39;яттю</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"]}