結論(おすすめ1つ)
Algolia からの乗り換え先は Typesense(Cloud またはセルフホスト)を推奨する。
Algolia と API 設計が最も近く、公式提供の typesense-instantsearch-adapter を使えば既存の InstantSearch UI コンポーネントをほぼそのまま流用できる。オープンソース版はセルフホストが無料で、SaaS 版にも無料枠が存在する。フロントエンド改修コストが他の代替ツールより圧倒的に小さいため、チームへの影響を最小化しながら移行できる点が決め手だ。
比較表(料金/無料枠/移行コスト/対応言語)
| ツール | 料金体系 | 無料枠 | 移行コスト | 日本語対応 |
|---|---|---|---|---|
| Typesense Cloud | ドキュメント数・帯域課金 | あり(公式の料金ページで要確認) | 低(Algolia API と高互換) | あり(locale 指定で精度向上) |
| Meilisearch Cloud | インデックスサイズ・帯域課金 | あり(公式の料金ページで要確認) | 中(独自 API、SDK は充実) | あり(v1.x から標準対応) |
| Elasticsearch / Elastic Cloud | ノード数・容量課金 | 14日間トライアルのみ | 高(クエリ DSL を全書き直し) | あり(Kuromoji プラグイン) |
| OpenSearch (AWS Managed) | EC2/managed インスタンス課金 | AWS 無料枠の範囲(公式で要確認) | 高(ES と類似だが設定差異あり) | あり(Nori / Kuromoji) |
| Postgres FTS | 既存 DB コストのみ | 追加費用なし | 低(DB 内完結) | 設定次第(pg_bigm 推奨) |
料金・無料枠の具体的な上限はすべて変動するため、移行前に各サービスの公式料金ページで必ず確認すること。
移行手順
Algolia から Typesense Cloud へ移行する最短ルートを示す。
Step 1: Typesense でコレクション(インデックス)を定義する
curl -X POST 'https://<YOUR_CLUSTER>.typesense.net/collections' \
-H 'X-TYPESENSE-API-KEY: <ADMIN_KEY>' \
-H 'Content-Type: application/json' \
-d '{
"name": "products",
"fields": [
{ "name": "id", "type": "string" },
{ "name": "title", "type": "string", "locale": "ja" },
{ "name": "description", "type": "string", "locale": "ja" },
{ "name": "price", "type": "float" }
],
"default_sorting_field": "price"
}'
Step 2: Algolia からデータをエクスポートして Typesense にインポートする
# Algolia CLI で既存インデックスを JSONL にエクスポート
npm install -g @algolia/cli
algolia objects export --index-name products --output algolia_export.jsonl
# typesense Node.js クライアントでバルクインポート
npm install typesense
node -e "
const Typesense = require('typesense');
const fs = require('fs');
const lines = fs.readFileSync('./algolia_export.jsonl', 'utf8')
.split('\n').filter(Boolean).map(JSON.parse);
const client = new Typesense.Client({
nodes: [{ host: '<YOUR_CLUSTER>.typesense.net', port: 443, protocol: 'https' }],
apiKey: '<ADMIN_KEY>',
connectionTimeoutSeconds: 5,
});
client.collections('products').documents().import(lines, { action: 'upsert' })
.then(r => console.log(r));
"
Step 3: フロントエンドのクライアントを差し替える
// ── Before(Algolia) ──────────────────────────────
import algoliasearch from 'algoliasearch/lite';
const searchClient = algoliasearch('APP_ID', 'SEARCH_ONLY_KEY');
// ── After(Typesense アダプター経由) ─────────────
import TypesenseInstantSearchAdapter from 'typesense-instantsearch-adapter';
const adapter = new TypesenseInstantSearchAdapter({
server: {
apiKey: '<SEARCH_ONLY_KEY>',
nodes: [{ host: '<YOUR_CLUSTER>.typesense.net', port: 443, protocol: 'https' }],
},
additionalSearchParameters: {
query_by: 'title,description',
},
});
const searchClient = adapter.searchClient;
// <InstantSearch> / <SearchBox> / <Hits> 等のコンポーネントはそのまま流用可能
Step 4: 不要な Algolia 依存を削除する
npm uninstall algoliasearch
npm install typesense typesense-instantsearch-adapter
# .env から ALGOLIA_APP_ID / ALGOLIA_API_KEY を除去し
# TYPESENSE_HOST / TYPESENSE_API_KEY に差し替える
向き不向き
Typesense が向くチーム・規模
- Algolia の請求が増えてきた小〜中規模のスタートアップ
- InstantSearch ベースの UI を維持したまま移行したい、フロントエンド比率の高いチーム
- VPS 1台でセルフホストしてコストを固定化したい個人開発・小規模プロダクト
- 検索インフラの運用に専任 SRE を割けない組織
Meilisearch が向くチーム・規模
- ドキュメント数が数十万件未満で、シンプルな REST API だけで完結させたい場合
- ローカル開発環境での DX(Docker 1コマンド起動)を最優先にしたい小規模チーム
Elasticsearch / OpenSearch が向くチーム・規模
- ファセット・集計・ログ分析など、検索以外の複合クエリが必要な大規模サービス
- 既存の Elastic スタック(Kibana・Logstash)との統合が前提になっているチーム
避けるべきケース
- Typesense を避けるべき場合: 本格的なベクトル検索・複雑なジオフィルタを多用するプロダクト(機能はバージョンごとに拡張中のため、導入前に公式ドキュメントで現バージョンの対応状況を確認すること)
- Meilisearch を避けるべき場合: 数千万件超の大規模インデックスで低レイテンシを要求するサービス
- Postgres FTS を避けるべき場合: オートコンプリート・ファセット・タイポ補正など Algolia 相当の検索 UX を再現したいケース。DB 内完結の手軽さと引き換えに、専用エンジンの検索品質には届かない
Top comments (0)