{"title":"Tìm kiếm toàn văn FTS5","slug":"fts5-search","category":"concepts","summary":"Cách Synapse sử dụng SQLite FTS5 cho tìm kiếm bộ nhớ toàn văn dưới mili giây.","audience":["human","llm"],"tags":["concept","search","fts5","fulltext"],"difficulty":"advanced","updated":"2026-06-27","word_count":789,"read_minutes":4,"lang":"vi","translated":true,"requested_lang":"vi","content_markdown":"\n# Tìm kiếm toàn văn FTS5\n\nSynapse sử dụng FTS5 (Full-Text Search 5) cho tìm kiếm bộ nhớ nhanh, linh hoạt.\nTrang này giải thích cách nó hoạt động và cách sử dụng hiệu quả.\n\n## FTS5 là gì?\n\nFTS5 là một phần mở rộng SQLite (cũng có sẵn trong PostgreSQL qua các phần mở\nrộng) cung cấp khả năng tìm kiếm toàn văn. Nó:\n\n- Đánh chỉ mục nội dung văn bản để tìm kiếm từ khóa nhanh\n- Hỗ trợ toán tử boolean (AND, OR, NOT)\n- Hỗ trợ khớp cụm từ với dấu ngoặc kép\n- Hỗ trợ khớp tiền tố với `*`\n- Xếp hạng kết quả theo mức độ liên quan\n\nSynapse sử dụng FTS5 để đánh chỉ mục toàn bộ nội dung bộ nhớ, cho phép tìm\nkiếm dưới mili giây trên hàng nghìn bộ nhớ.\n\n## Cách Synapse sử dụng FTS5\n\nKhi bạn `POST /memory`:\n\n1. Nội dung bộ nhớ được lưu trong bảng `memories`\n2. Nội dung cũng được chèn vào bảng ảo FTS5\n3. FTS5 tự động tokenize và đánh chỉ mục nội dung\n\nKhi bạn `GET /memory/search?q=...`:\n\n1. Synapse phân tích truy vấn bằng cú pháp FTS5\n2. Thực thi `MATCH` đối với chỉ mục FTS5\n3. Lọc theo `mind_id` (cách ly tenant)\n4. Trả về kết quả được xếp hạng\n\n## Cú pháp truy vấn\n\n### Tìm kiếm từ khóa đơn giản\n\n```\n?q=docker\n```\n\nTrả về bộ nhớ chứa \"docker\".\n\n### Nhiều từ khóa (AND ngầm định)\n\n```\n?q=docker+swarm\n?q=docker%20swarm\n```\n\nTrả về bộ nhớ chứa CẢ \"docker\" VÀ \"swarm\".\n\n### Khớp cụm từ\n\n```\n?q=\"docker+swarm\"\n?q=%22docker%20swarm%22\n```\n\nTrả về bộ nhớ chứa cụm từ chính xác \"docker swarm\".\n\n### Khớp tiền tố\n\n```\n?q=docker*\n```\n\nTrả về bộ nhớ chứa các từ bắt đầu bằng \"docker\" (ví dụ \"dockers\", \"dockerfile\",\n\"dockerize\").\n\n### Boolean OR\n\n```\n?q=docker+OR+kubernetes\n```\n\nTrả về bộ nhớ chứa \"docker\" HOẶC \"kubernetes\".\n\n### Boolean NOT\n\n```\n?q=docker+-swarm\n?q=docker+NOT+swarm\n```\n\nTrả về bộ nhớ chứa \"docker\" nhưng KHÔNG chứa \"swarm\".\n\n### Nhóm\n\n```\n?q=(docker+OR+kubernetes)+-test\n```\n\nTrả về bộ nhớ chứa \"docker\" hoặc \"kubernetes\", nhưng không chứa \"test\".\n\n## Ví dụ thực tế\n\n### Tìm bộ nhớ về một dự án\n\n```bash\ncurl -H \"Authorization: Bearer YOUR_MIND_KEY\" \\\n     \"https://synapse.schaefer.zone/memory/search?q=synapse+deployment\"\n```\n\n### Tìm cụm từ chính xác\n\n```bash\ncurl -H \"Authorization: Bearer YOUR_MIND_KEY\" \\\n     \"https://synapse.schaefer.zone/memory/search?q=%22docker+swarm%22\"\n```\n\n### Loại trừ bộ nhớ kiểm thử\n\n```bash\ncurl -H \"Authorization: Bearer YOUR_MIND_KEY\" \\\n     \"https://synapse.schaefer.zone/memory/search?q=production+-test\"\n```\n\n### Tìm theo công nghệ\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## Xếp hạng\n\nFTS5 xếp hạng kết quả theo mức độ liên quan bằng thuật toán BM25. Các yếu tố:\n\n- Tần suất thuật ngữ (thuật ngữ xuất hiện bao nhiêu lần)\n- Tần suất tài liệu nghịch đảo (thuật ngữ hiếm xếp cao hơn)\n- Độ dài tài liệu (tài liệu ngắn hơn với thuật ngữ xếp cao hơn)\n- Trọng số cột (tiêu đề > nội dung)\n\nKết quả được trả về theo thứ tự xếp hạng (liên quan nhất trước).\n\n## Hiệu suất\n\n| Thao tác | Độ trễ |\n|-----------|---------|\n| Tìm 100 bộ nhớ | < 5ms |\n| Tìm 1.000 bộ nhớ | < 10ms |\n| Tìm 10.000 bộ nhớ | < 25ms |\n| Tìm 100.000 bộ nhớ | < 100ms |\n\nFTS5 được tối ưu cao cho khối lượng công việc nặng về đọc.\n\n## Giới hạn\n\n### Stemming\n\nFTS5 không làm stemming theo mặc định. \"running\" và \"run\" là các thuật ngữ\nkhác nhau.\n\n**Giải pháp:** Sử dụng khớp tiền tố: `?q=run*`\n\n### Dung sai lỗi chính tả\n\nFTS5 không hỗ trợ khớp mờ. Lỗi chính tả sẽ trả về không kết quả.\n\n**Giải pháp:** Sử dụng tìm kiếm ngữ nghĩa (`/memory/semantic-search`) cho khớp\nkhái niệm.\n\n### Từ dừng\n\nCác từ phổ biến (the, a, an, is) được đánh chỉ mục nhưng có thể không hữu ích\ncho tìm kiếm. FTS5 xử lý điều này tự động.\n\n## FTS5 so với Tìm kiếm ngữ nghĩa\n\n| Khía cạnh | FTS5 | Tìm kiếm ngữ nghĩa |\n|--------|------|-----------------|\n| Tốc độ | Dưới mili giây | 50-100ms |\n| Khớp | Từ khóa chính xác | Khái niệm |\n| Dung sai lỗi chính tả | Không | Một số |\n| Stemming | Không | Ngầm định |\n| Yêu cầu embeddings | Không | Có |\n| Tốt nhất cho | Thuật ngữ cụ thể | Khái niệm |\n\nSử dụng FTS5 khi bạn biết từ khóa. Sử dụng tìm kiếm ngữ nghĩa khi bạn muốn\n\"bộ nhớ về X\" khi X được mô tả khác đi.\n\n## Thực hành tốt nhất\n\n> [!TIP]\n> - **Sử dụng thuật ngữ cụ thể** — \"docker swarm\" tốt hơn \"container orchestration\"\n> - **Trích dẫn cụm từ** — `\"docker swarm\"` đảm bảo khớp cụm từ\n> - **Sử dụng tiền tố cho biến thể** — `deploy*` bắt được \"deploy\", \"deployment\", \"deploying\"\n> - **Loại trừ nhiễu** — `-test` lọc bỏ bộ nhớ kiểm thử\n> - **Kết hợp với tag** — `?q=docker&tag=production` thu hẹp kết quả\n\n## Bước tiếp theo\n\n- [Tìm kiếm ngữ nghĩa](/docs/concepts/semantic-search)\n- [Memory API](/docs/api/memory)\n- [Thực hành tốt nhất về bộ nhớ](/docs/guides/memory-best-practices)\n","content_html":"<h1>Tìm kiếm toàn văn FTS5</h1>\n<p>Synapse sử dụng FTS5 (Full-Text Search 5) cho tìm kiếm bộ nhớ nhanh, linh hoạt.\nTrang này giải thích cách nó hoạt động và cách sử dụng hiệu quả.</p>\n<h2>FTS5 là gì?</h2>\n<p>FTS5 là một phần mở rộng SQLite (cũng có sẵn trong PostgreSQL qua các phần mở\nrộng) cung cấp khả năng tìm kiếm toàn văn. Nó:</p>\n<ul>\n<li>Đánh chỉ mục nội dung văn bản để tìm kiếm từ khóa nhanh</li>\n<li>Hỗ trợ toán tử boolean (AND, OR, NOT)</li>\n<li>Hỗ trợ khớp cụm từ với dấu ngoặc kép</li>\n<li>Hỗ trợ khớp tiền tố với <code>*</code></li>\n<li>Xếp hạng kết quả theo mức độ liên quan</li>\n</ul>\n<p>Synapse sử dụng FTS5 để đánh chỉ mục toàn bộ nội dung bộ nhớ, cho phép tìm\nkiếm dưới mili giây trên hàng nghìn bộ nhớ.</p>\n<h2>Cách Synapse sử dụng FTS5</h2>\n<p>Khi bạn <code>POST /memory</code>:</p>\n<ol>\n<li>Nội dung bộ nhớ được lưu trong bảng <code>memories</code></li>\n<li>Nội dung cũng được chèn vào bảng ảo FTS5</li>\n<li>FTS5 tự động tokenize và đánh chỉ mục nội dung</li>\n</ol>\n<p>Khi bạn <code>GET /memory/search?q=...</code>:</p>\n<ol>\n<li>Synapse phân tích truy vấn bằng cú pháp FTS5</li>\n<li>Thực thi <code>MATCH</code> đối với chỉ mục FTS5</li>\n<li>Lọc theo <code>mind_id</code> (cách ly tenant)</li>\n<li>Trả về kết quả được xếp hạng</li>\n</ol>\n<h2>Cú pháp truy vấn</h2>\n<h3>Tìm kiếm từ khóa đơn giản</h3>\n<pre><code class=\"hljs language-plaintext\">?q=docker</code></pre><p>Trả về bộ nhớ chứa &quot;docker&quot;.</p>\n<h3>Nhiều từ khóa (AND ngầm định)</h3>\n<pre><code class=\"hljs language-plaintext\">?q=docker+swarm\n?q=docker%20swarm</code></pre><p>Trả về bộ nhớ chứa CẢ &quot;docker&quot; VÀ &quot;swarm&quot;.</p>\n<h3>Khớp cụm từ</h3>\n<pre><code class=\"hljs language-plaintext\">?q=&quot;docker+swarm&quot;\n?q=%22docker%20swarm%22</code></pre><p>Trả về bộ nhớ chứa cụm từ chính xác &quot;docker swarm&quot;.</p>\n<h3>Khớp tiền tố</h3>\n<pre><code class=\"hljs language-plaintext\">?q=docker*</code></pre><p>Trả về bộ nhớ chứa các từ bắt đầu bằng &quot;docker&quot; (ví dụ &quot;dockers&quot;, &quot;dockerfile&quot;,\n&quot;dockerize&quot;).</p>\n<h3>Boolean OR</h3>\n<pre><code class=\"hljs language-plaintext\">?q=docker+OR+kubernetes</code></pre><p>Trả về bộ nhớ chứa &quot;docker&quot; HOẶC &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>Trả về bộ nhớ chứa &quot;docker&quot; nhưng KHÔNG chứa &quot;swarm&quot;.</p>\n<h3>Nhóm</h3>\n<pre><code class=\"hljs language-plaintext\">?q=(docker+OR+kubernetes)+-test</code></pre><p>Trả về bộ nhớ chứa &quot;docker&quot; hoặc &quot;kubernetes&quot;, nhưng không chứa &quot;test&quot;.</p>\n<h2>Ví dụ thực tế</h2>\n<h3>Tìm bộ nhớ về một dự án</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>Tìm cụm từ chính xác</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>Loại trừ bộ nhớ kiểm thử</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>Tìm theo công nghệ</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>Xếp hạng</h2>\n<p>FTS5 xếp hạng kết quả theo mức độ liên quan bằng thuật toán BM25. Các yếu tố:</p>\n<ul>\n<li>Tần suất thuật ngữ (thuật ngữ xuất hiện bao nhiêu lần)</li>\n<li>Tần suất tài liệu nghịch đảo (thuật ngữ hiếm xếp cao hơn)</li>\n<li>Độ dài tài liệu (tài liệu ngắn hơn với thuật ngữ xếp cao hơn)</li>\n<li>Trọng số cột (tiêu đề &gt; nội dung)</li>\n</ul>\n<p>Kết quả được trả về theo thứ tự xếp hạng (liên quan nhất trước).</p>\n<h2>Hiệu suất</h2>\n<table>\n<thead>\n<tr>\n<th>Thao tác</th>\n<th>Độ trễ</th>\n</tr>\n</thead>\n<tbody><tr>\n<td>Tìm 100 bộ nhớ</td>\n<td>&lt; 5ms</td>\n</tr>\n<tr>\n<td>Tìm 1.000 bộ nhớ</td>\n<td>&lt; 10ms</td>\n</tr>\n<tr>\n<td>Tìm 10.000 bộ nhớ</td>\n<td>&lt; 25ms</td>\n</tr>\n<tr>\n<td>Tìm 100.000 bộ nhớ</td>\n<td>&lt; 100ms</td>\n</tr>\n</tbody></table>\n<p>FTS5 được tối ưu cao cho khối lượng công việc nặng về đọc.</p>\n<h2>Giới hạn</h2>\n<h3>Stemming</h3>\n<p>FTS5 không làm stemming theo mặc định. &quot;running&quot; và &quot;run&quot; là các thuật ngữ\nkhác nhau.</p>\n<p><strong>Giải pháp:</strong> Sử dụng khớp tiền tố: <code>?q=run*</code></p>\n<h3>Dung sai lỗi chính tả</h3>\n<p>FTS5 không hỗ trợ khớp mờ. Lỗi chính tả sẽ trả về không kết quả.</p>\n<p><strong>Giải pháp:</strong> Sử dụng tìm kiếm ngữ nghĩa (<code>/memory/semantic-search</code>) cho khớp\nkhái niệm.</p>\n<h3>Từ dừng</h3>\n<p>Các từ phổ biến (the, a, an, is) được đánh chỉ mục nhưng có thể không hữu ích\ncho tìm kiếm. FTS5 xử lý điều này tự động.</p>\n<h2>FTS5 so với Tìm kiếm ngữ nghĩa</h2>\n<table>\n<thead>\n<tr>\n<th>Khía cạnh</th>\n<th>FTS5</th>\n<th>Tìm kiếm ngữ nghĩa</th>\n</tr>\n</thead>\n<tbody><tr>\n<td>Tốc độ</td>\n<td>Dưới mili giây</td>\n<td>50-100ms</td>\n</tr>\n<tr>\n<td>Khớp</td>\n<td>Từ khóa chính xác</td>\n<td>Khái niệm</td>\n</tr>\n<tr>\n<td>Dung sai lỗi chính tả</td>\n<td>Không</td>\n<td>Một số</td>\n</tr>\n<tr>\n<td>Stemming</td>\n<td>Không</td>\n<td>Ngầm định</td>\n</tr>\n<tr>\n<td>Yêu cầu embeddings</td>\n<td>Không</td>\n<td>Có</td>\n</tr>\n<tr>\n<td>Tốt nhất cho</td>\n<td>Thuật ngữ cụ thể</td>\n<td>Khái niệm</td>\n</tr>\n</tbody></table>\n<p>Sử dụng FTS5 khi bạn biết từ khóa. Sử dụng tìm kiếm ngữ nghĩa khi bạn muốn\n&quot;bộ nhớ về X&quot; khi X được mô tả khác đi.</p>\n<h2>Thực hành tốt nhất</h2>\n<div class=\"callout callout-ok\"></div><h2>Bước tiếp theo</h2>\n<ul>\n<li><a href=\"/docs/concepts/semantic-search\">Tìm kiếm ngữ nghĩa</a></li>\n<li><a href=\"/docs/api/memory\">Memory API</a></li>\n<li><a href=\"/docs/guides/memory-best-practices\">Thực hành tốt nhất về bộ nhớ</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"]}