結論(おすすめ1つ)
Algoliaからの乗り換えなら Typesense を選べ。
APIがAlgoliaと最も近く、公式の互換アダプタ(typesense-instantsearch-adapter)が整備されているため、フロントエンドのUIコンポーネントをほぼ書き直さずに済む。セルフホストとマネージドクラウドを同一コードで切り替えられるので、コスト最適化の選択肢が広い。Rustで実装されたコアは検索レイテンシが安定しており、本番で予測可能なパフォーマンスが出せる。
比較表(料金/無料枠/移行コスト/対応言語)
| ツール | 料金感 | 無料枠 | 移行コスト | 主な対応言語SDK |
|---|---|---|---|---|
| Typesense Cloud | 公式の料金ページで要確認 | OSS版セルフホストは無料 | ★★☆(Algolia互換アダプタあり) | JS/TS, Python, Go, Ruby, PHP, Java |
| Meilisearch Cloud | 公式の料金ページで要確認 | OSS版は無料、Cloudに無料枠あり | ★★★(独自API、一部書き直し要) | JS/TS, Python, Go, Ruby, PHP, Rust |
| OpenSearch | AWS従量制、公式要確認 | なし(AWSコスト発生) | ★★★★(クエリDSLが大きく異なる) | 多言語(AWS公式SDK) |
| Elasticsearch | Elastic Cloud、公式要確認 | 14日トライアルのみ | ★★★★(スキーマ・設定管理が複雑) | 多言語(Elastic公式SDK) |
移行コスト凡例: ★少 〜 ★★★★多
移行手順
Algolia → Typesense への移行を段階的に示す。
1. Typesense をローカルで起動(Docker)
docker run -p 8108:8108 \
-v /tmp/typesense-data:/data \
typesense/typesense:latest \
--data-dir /data \
--api-key=your-local-dev-key
2. 依存パッケージを追加
# Node.js
npm install typesense typesense-instantsearch-adapter
# Python
pip install typesense
3. コレクション(インデックス)を作成
import Typesense from 'typesense';
const client = new Typesense.Client({
nodes: [{ host: 'localhost', port: 8108, protocol: 'http' }],
apiKey: 'your-local-dev-key',
connectionTimeoutSeconds: 2,
});
await client.collections().create({
name: 'products',
fields: [
{ name: 'name', type: 'string' },
{ name: 'price', type: 'float' },
{ name: 'tags', type: 'string[]', facet: true },
],
default_sorting_field: 'price',
});
4. Algolia のデータを一括インポート
// Algolia から取得済みの JSON 配列 records を使う
await client.collections('products').documents().import(records, {
action: 'create',
});
Algoliaのエクスポートは algoliasearch クライアントの browseObjects で全件取得できる。ページネーションなしで直接イテレートできる点に注意。
5. フロントエンドの searchClient を差し替える
import TypesenseInstantSearchAdapter from 'typesense-instantsearch-adapter';
const adapter = new TypesenseInstantSearchAdapter({
server: {
apiKey: 'search-only-api-key', // 検索専用キーを発行して使う
nodes: [{ host: 'xxx.a1.typesense.net', port: 443, protocol: 'https' }],
},
additionalSearchParameters: { query_by: 'name,tags' },
});
// 既存の instantsearch() に渡す searchClient をそのまま差し替えるだけ
const searchClient = adapter.searchClient;
<SearchBox> <Hits> <RefinementList> 等のInstantSearch UIコンポーネントはそのまま流用できる。Algolia固有の insights イベントを使っていた箇所だけ削除または置換が必要。
向き不向き
Typesense が向くケース
- コスト見直し中の中小規模SaaS / EC: ドキュメント数が数百万件以内で、Algoliaの月額が重くなってきたチーム
- フロントエンド重視のプロダクト: InstantSearchをすでに使っており、UIを大幅に書き直したくない
- セルフホスト検討中のチーム: RenderやFly.ioにDockerデプロイして固定費に抑えたい場合
Meilisearch が向くケース
- 社内ツール・ダッシュボード: 個人情報など外部クラウドに載せたくないデータを扱うチーム
- シンプルなOSS構成を好む小規模チーム: バイナリ1本で起動できる運用コストの低さが魅力
Typesense / Meilisearch を避けるべきケース
- ドキュメント数が数千万〜億単位に伸びる見込みの大規模サービス(ElasticsearchまたはOpenSearchを検討)
- 複雑なログ集計・アナリティクスパイプラインが必須な場合(Elasticsearch + Kibanaスタックの方が成熟度が高い)
- AlgoliaのAI Ranking・Personalizeを本番で活用している場合(互換アダプタでは再現できない機能が存在する)
Top comments (0)