結論(おすすめ1つ)
Meilisearch に乗り換えるべきだ。
API 設計が Algolia に近く、既存コードの差し替えコストが最小限で済む。OSS(MIT ライセンス)なのでセルフホストで運用コストをゼロにでき、Meilisearch Cloud を使えばマネージドの体験もそのまま得られる。日本語トークナイズをビルトインでサポートしており、追加プラグインなしで日本語全文検索が動く。
比較表(料金/無料枠/移行コスト/対応言語)
| ツール | 料金モデル | 無料枠 | 移行コスト | 日本語対応 |
|---|---|---|---|---|
| Algolia | レコード数+検索数課金 | あり(公式の料金ページで要確認) | ― | プラグイン必要 |
| Meilisearch | セルフホスト無料 / Cloud は従量 | Cloud あり(公式の料金ページで要確認) | 低(API 互換層あり) | ビルトイン |
| Typesense | セルフホスト無料 / Cloud は従量 | Cloud あり(公式の料金ページで要確認) | 低〜中 | ビルトイン |
| OpenSearch | セルフホスト無料 / AWS マネージド課金 | AWS 無料枠範囲内(公式で要確認) | 高(設定量が多い) | プラグイン必要 |
| Orama | セルフホスト無料 / Cloud あり | Cloud あり(公式の料金ページで要確認) | 中(API 設計が異なる) | 対応済み |
移行手順
Algolia から Meilisearch へ移行する手順を示す。Node.js プロジェクトを前提とする。
Step 1: Meilisearch を起動する
docker run -d \
-p 7700:7700 \
-e MEILI_MASTER_KEY=your_master_key \
-v $(pwd)/meili_data:/meili_data \
getmeili/meilisearch:latest
Step 2: 既存の Algolia インデックスをエクスポートする
npm install algoliasearch
// export-algolia.mjs
import algoliasearch from 'algoliasearch';
import fs from 'fs';
const client = algoliasearch('APP_ID', 'ADMIN_API_KEY');
const index = client.initIndex('your_index');
const { hits } = await index.search('', { hitsPerPage: 1000 });
fs.writeFileSync('algolia_export.json', JSON.stringify(hits, null, 2));
Step 3: Meilisearch にドキュメントをインポートする
npm install meilisearch
// import-meilisearch.mjs
import { MeiliSearch } from 'meilisearch';
import { createRequire } from 'module';
const require = createRequire(import.meta.url);
const data = require('./algolia_export.json');
const client = new MeiliSearch({
host: 'http://localhost:7700',
apiKey: 'your_master_key',
});
const index = client.index('your_index');
const task = await index.addDocuments(data);
console.log('enqueued task uid:', task.taskUid);
Step 4: 検索呼び出しを差し替える
// Before (Algolia)
const { hits } = await algoliaIndex.search(query);
// After (Meilisearch) — プロパティ名が一致するため多くの場合この1行だけ
const { hits } = await meiliIndex.search(query);
Step 5: フィルタとソートの属性を事前宣言する
Meilisearch はフィルタ対象属性を事前に登録する必要がある。Algolia の attributesForFaceting に相当する作業だ。
await index.updateFilterableAttributes(['category', 'status', 'price']);
await index.updateSortableAttributes(['price', 'created_at']);
向き不向き
Meilisearch が向くケース
- Algolia の月額コストを削減したい個人開発・中小規模チーム
- 日本語コンテンツを含むサービスでプラグイン管理を避けたい場合
- Docker や Kubernetes でのセルフホスト運用経験があるチーム
- InstantSearch.js をそのまま使い続けたい場合(Meilisearch 公式アダプターが存在する)
Typesense が向くケース
- 入力補完などレイテンシを最優先にするリアルタイム検索が必要なチーム
- Algolia に近い API を求めつつ、厳格なスキーマ管理で型安全性を高めたい場合
OpenSearch が向くケース
- ログ解析と全文検索を同一クラスタで統合したい大規模な組織
- AWS インフラに既に乗っており IAM による認証管理に統一したいチーム
避けるべきケース
- Meilisearch: 数十億件規模のインデックスを想定する場合はスペックと公式ベンチマークを先に精査すること
- Typesense: Algolia の A/B テスト機能やクリック解析に依存している場合は機能が不足する
- OpenSearch: 検索機能だけが目的なのに Elasticsearch の運用知識を習得したくない小規模チームには過剰投資になりやすい
Top comments (0)