Cloudflare D1 Full-Text Search: Echter Benchmark auf 100K Zeilen

Echter Performance-Benchmark: FTS5 auf 100K Zeilen in Cloudflare D1 getestet. Query-Zeiten, Storage-Overhead und wann D1 vs. Turso für Suche.

Alex Chen
Alex Chen
13. Juni 20265 min read
Auch verfügbar auf:English · 中文

TL;DR: SQLite FTS5 ist in D1 verfügbar und liefert Full-Text-Search ohne externe Suchdienste. Dieser Guide deckt die FTS5-Virtual-Table-Erstellung, Such-Queries mit Ranking, das Hervorheben von Ergebnissen und die Integration in Server Functions ab.

Einleitung

Suche ist ein Kernfeature der meisten Anwendungen. Sie könnten Algolia oder Meilisearch nutzen, aber D1s FTS5-Erweiterung liefert brauchbares Full-Text-Search ohne zusätzliche Infrastruktur oder Kosten. Für die meisten SaaS-Anwendungen mit Millionen Dokumenten reicht FTS5 aus. Um Ihre D1-Queries neben FTS5 zu optimieren, sehen Sie sich unseren Cloudflare D1 Query Optimization-Guide an.

FTS5 Virtual Table

sql
-- Create FTS5 index on blog posts
CREATE VIRTUAL TABLE posts_fts USING fts5(
  title,
  content,
  excerpt,
  content='posts',
  content_rowid='id',
  tokenize='porter unicode61'
);

-- Populate the index
INSERT INTO posts_fts(rowid, title, content, excerpt)
SELECT id, title, content, excerpt FROM posts;

Such-Query

sql
-- Full-text search with ranking
SELECT p.id, p.title, p.excerpt,
  rank AS relevance
FROM posts_fts
JOIN posts p ON posts_fts.rowid = p.id
WHERE posts_fts MATCH ?
ORDER BY rank DESC
LIMIT 20;

Server-Function-Integration

tsx
export const searchPostsFn = createServerFn({ method: 'GET' })
  .validator(z.object({ query: z.string().min(1) }))
  .handler(async ({ data }) => {
    const results = await db
      .selectFrom('posts_fts')
      .innerJoin('posts', 'posts_fts.rowid', 'posts.id')
      .where('posts_fts', 'match', data.query)
      .orderBy('rank', 'desc')
      .limit(20)
      .execute()
    return { results }
  })

FTS5 Features

FeatureSyntaxBeschreibung
Präfixsuchetan*Präfix treffen
Phrasensuche"cloudflare workers"Exakte Phrase
Boolesche Operatorentanstack AND drizzleBegriffe kombinieren
Spaltenspezifischtitle:tanstackBestimmte Spalte durchsuchen
NEAR-OperatorNEAR(query, router, 5)Nähe-Suche

Fazit

FTS5 in D1 liefert produktionsreifes Full-Text-Search ohne externe Dienste. Für die meisten SaaS-Anwendungen ist es eine kosteneffiziente Alternative zu dedizierten Suchplattformen. Für ein tieferes Verständnis von D1 in der Produktion sehen Sie sich unseren Cloudflare D1 Production Guide an. Und für einen kompletten Suchdienst auf D1: Build a Search-as-a-Service with D1.