{"title":"Полнотекстовый поиск FTS5","slug":"fts5-search","category":"concepts","summary":"Как Synapse использует FTS5 SQLite для полнотекстового поиска по памяти с задержкой менее миллисекунды.","audience":["human","llm"],"tags":["concept","search","fts5","fulltext"],"difficulty":"advanced","updated":"2026-06-27","word_count":578,"read_minutes":3,"lang":"ru","translated":true,"requested_lang":"ru","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»\n(например, «dockers», «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- Вес колонки (заголовок > содержимое)\n\nРезультаты возвращаются в порядке ранжирования (наиболее релевантные — первыми).\n\n## Производительность\n\n| Операция | Задержка |\n|-----------|---------|\n| Поиск по 100 воспоминаниям | < 5 мс |\n| Поиск по 1000 воспоминаний | < 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**Обход:** Используйте семантический поиск (`/memory/semantic-search`) для\nконцептуального совпадения.\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»\n(например, «dockers», «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>Вес колонки (заголовок &gt; содержимое)</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>Поиск по 1000 воспоминаний</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> Используйте семантический поиск (<code>/memory/semantic-search</code>) для\nконцептуального совпадения.</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\">Лучшие практики работы с памятью</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"]}