Cloudflare D1 FTS5 日本語全文検索
SQLite FTS5 仮想テーブル + Intl.Segmenter によるトークン化で日本語全文検索を実現するデモです。
TypeScriptTypeScript の型システムを活用した堅牢な設計
TypeScript の型システムは単なるエラー検出を超え、ドメインモデルの表現や API の契約として機能します。Discriminated Union やテンプレートリテラル型、条件型を組み合わせることで、実行時エラーをコンパイル時に防ぐことができます。
TypeScript の型システムを活用した堅牢な設計
TypeScript の型システムは単なるエラー検出を超え、ドメインモデルの表現や API の契約として機能します。Discriminated Union やテンプレートリテラル型、条件型を組み合わせることで、実行時エラーをコンパイル時に防ぐことができます。
TypeScript の型システムを活用した堅牢な設計
TypeScript の型システムは単なるエラー検出を超え、ドメインモデルの表現や API の契約として機能します。Discriminated Union やテンプレートリテラル型、条件型を組み合わせることで、実行時エラーをコンパイル時に防ぐことができます。
TypeScript の型システムを活用した堅牢な設計
TypeScript の型システムは単なるエラー検出を超え、ドメインモデルの表現や API の契約として機能します。Discriminated Union やテンプレートリテラル型、条件型を組み合わせることで、実行時エラーをコンパイル時に防ぐことができます。
TypeScript の型システムを活用した堅牢な設計
TypeScript の型システムは単なるエラー検出を超え、ドメインモデルの表現や API の契約として機能します。Discriminated Union やテンプレートリテラル型、条件型を組み合わせることで、実行時エラーをコンパイル時に防ぐことができます。
TypeScript の型システムを活用した堅牢な設計
TypeScript の型システムは単なるエラー検出を超え、ドメインモデルの表現や API の契約として機能します。Discriminated Union やテンプレートリテラル型、条件型を組み合わせることで、実行時エラーをコンパイル時に防ぐことができます。
Cloudflare Workers で始めるエッジコンピューティング
Cloudflare Workers はエッジで動作するサーバーレスプラットフォームです。V8 エンジン上で JavaScript や TypeScript を実行でき、世界中のデータセンターでコードが実行されるため低レイテンシを実現します。D1 データベースや R2 ストレージとの連携も強力です。
Cloudflare Workers で始めるエッジコンピューティング
Cloudflare Workers はエッジで動作するサーバーレスプラットフォームです。V8 エンジン上で JavaScript や TypeScript を実行でき、世界中のデータセンターでコードが実行されるため低レイテンシを実現します。D1 データベースや R2 ストレージとの連携も強力です。
Cloudflare Workers で始めるエッジコンピューティング
Cloudflare Workers はエッジで動作するサーバーレスプラットフォームです。V8 エンジン上で JavaScript や TypeScript を実行でき、世界中のデータセンターでコードが実行されるため低レイテンシを実現します。D1 データベースや R2 ストレージとの連携も強力です。
Cloudflare Workers で始めるエッジコンピューティング
Cloudflare Workers はエッジで動作するサーバーレスプラットフォームです。V8 エンジン上で JavaScript や TypeScript を実行でき、世界中のデータセンターでコードが実行されるため低レイテンシを実現します。D1 データベースや R2 ストレージとの連携も強力です。
Cloudflare Workers で始めるエッジコンピューティング
Cloudflare Workers はエッジで動作するサーバーレスプラットフォームです。V8 エンジン上で JavaScript や TypeScript を実行でき、世界中のデータセンターでコードが実行されるため低レイテンシを実現します。D1 データベースや R2 ストレージとの連携も強力です。
Cloudflare Workers で始めるエッジコンピューティング
Cloudflare Workers はエッジで動作するサーバーレスプラットフォームです。V8 エンジン上で JavaScript や TypeScript を実行でき、世界中のデータセンターでコードが実行されるため低レイテンシを実現します。D1 データベースや R2 ストレージとの連携も強力です。
検索してみよう
Intl.Segmenter のトークン分割は格納時と検索時で同じ結果になるため、複合語が分割されても検索は成功します。しかし、カタカナの長音(ー)の有無など表記揺れがあると、トークンが一致せず検索に失敗します。
コンテンツを追加
サンプルデータ
テック系ブログ風のサンプルデータを一括登録します(10件)。
仕組みとスケーラビリティ
アーキテクチャ
fts_contentsテーブルに原文を保存fts_index(FTS5 仮想テーブル) に Intl.Segmenter でトークン化したテキストを保存- 登録時: 原文 → Intl.Segmenter でトークン分割 → FTS5 に格納
- 検索時: クエリをトークン化 → FTS5 MATCH → rowid で原文を JOIN
スケーラビリティ目安
| 記事サイズ | D1 10GB での件数 |
|---|---|
| 短文 (150字) | 約 1,300万件 |
| ブログ記事 (3,000字) | 約 50〜70万件 |
| 長文 (10,000字) | 約 15〜20万件 |
D1 コスト (Workers Paid $5/月〜)
- Storage: 5GB 無料、超過分 $0.75/GB-月
- Rows read: 250億/月 無料、超過分 $0.001/100万行
- Rows written: 5,000万/月 無料、超過分 $1.00/100万行
- 10GB フル利用でも月額 約 $8.75 程度
制限事項
- カタカナの長音(ー)の有無など表記揺れには対応できない(正規化の前処理が必要)
- D1 の 1行あたり最大サイズは 1MB
- Intl.Segmenter のトークン化精度はランタイム (V8) の辞書に依存