Meilisearch: 中小規模プロジェクトでElasticsearchに代わる「爆速」検索エンジン

Database tutorial - IT technology blog
Database tutorial - IT technology blog

Elasticsearchの重さに疲れていませんか?

個人ブログや中規模のECサイトにElasticsearchを導入するのは、まさに「牛刀をもって鶏を割く」ようなものです。基本的な検索窓を作るためだけに、Javaとの格闘、複雑なYAML設定、そして数GBものRAM消費に悩まされることになります。これは、不適切なデータベーススキーマ設計が技術的負債を生むのと同様の苦しみです。Meilisearchは、まさにその悩みを解決するために生まれました。実際のプロジェクトで6ヶ月間運用した結果、これは「手軽」でありながら、極めて高品質な検索エンジンであると断言できます。

Rustで書かれたMeilisearchは非常に軽量です。入力と同時に結果が表示される「Search-as-you-type」や、優れた「タイポ許容度(Typo-tolerance)」を備えており、ユーザー体験の向上に特化しています。

5分で完了するMeilisearchのクイック導入

導入にはDockerが最適です。開発環境を汚さず、シンプルに構築できます。

1. サービスの起動

docker run -it --rm \
    -p 7700:7700 \
    -v $(pwd)/meili_data:/meili_data \
    getmeili/meilisearch:latest

これで、Meilisearchがポート7700で待機します。すぐにhttp://localhost:7700にアクセスして、直感的なWeb UIを体験してみてください。

2. インデックスへのデータ投入

Meilisearchは標準的なRESTful APIを採用しているため、統合が非常に簡単です。curlやPostman、あるいは任意のHTTPライブラリを使用できます。例えば、IT記事のリストを保存する場合は以下のようになります:

curl \
  -X POST 'http://localhost:7700/indexes/posts/documents' \
  -H 'Content-Type: application/json' \
  --data-binary '[\
    {"id": 1, "title": "Redis入門ガイド", "category": "Database"},\
    {"id": 2, "title": "初心者向けPythonプログラミング", "category": "Programming"}\
  ]'

3. 検索速度の確認

キーワード「red」で検索してみましょう:

curl 'http://localhost:7700/indexes/posts/search?q=red'

結果はほぼ瞬時に返ってきます。私のプロジェクトでは、約5万レコードのデータベースに対して、レイテンシは通常10ms未満です。

なぜMeilisearchは「使う価値がある」選択肢なのか?

MeilisearchとElasticsearchのどちらを選ぶべきか、あるいはSQL vs NoSQLの議論のようにどちらの技術がプロジェクトに適しているか迷う人も多いでしょう。しかし、重要なのは「用途に合っているか」です。

  • リソースの節約: Elasticsearchを安定稼働させるには最低でも2GBのRAMが必要ですが、Meilisearchは同等のデータ量で約150MBしか消費しません。
  • 設定が極めて簡単: シャード、レプリカ、複雑なマッピングといった概念を忘れてください。あらゆる設定が最大限に自動化されています。
  • スマートなタイポ(打ち間違い)処理: ユーザーが「pyton」と入力しても「Python」の結果が表示されます。このタイポ許容機能は、面倒な設定なしでデフォルトで動作します。
  • ユーザー体験(UX): 超高速なレスポンスにより、キーを押した瞬間に候補が表示される検索ボックスを構築できます。

Meilisearchを使用する際は、JSON形式のデータ準備が必須です。古いCSVデータをJSONに素早く変換したい場合は、toolcraft.app/ja/tools/data/csv-to-jsonにあるツールがおすすめです。ブラウザ上で完結するため、顧客データのセキュリティ面でも安心です。

ランキングルール(Ranking Rules)による検索結果の最適化

デフォルトの状態でも十分優れていますが、ランキングルールを調整することで、一般的なパフォーマンス改善のアプローチと同様に、より精度の高い結果を提供できます。

意図通りの並び替え

Meilisearchは通常、キーワードの一致度や位置に基づいて優先順位を決めます。最新の記事を上位に表示したい場合は、timestampによるソート規則を追加するだけです:

curl \
  -X POST 'http://localhost:7700/indexes/posts/settings' \
  -H 'Content-Type: application/json' \
  --data-binary '{\
    "rankingRules": [\
      "words",\
      "typo",\
      "proximity",\
      "attribute",\
      "sort",\
      "exactness",\
      "published_at:desc"\
    ]\
  }'

APIキーによるセキュリティ対策

本番環境でMeilisearchを無防備な状態で公開してはいけません。MEILI_MASTER_KEYを使用しましょう。システムが自動的にDefault Search Key(クライアント側に公開しても安全)とDefault Admin Key(サーバー側のみで管理)を生成してくれます。

6ヶ月間の運用で得た貴重な経験

実際の運用は理論とは異なります。私が学んだ4つのポイントを共有します:

1. ディスク容量に関する注意点

Meilisearchは超高速化のためにLMDBを使用しています。その代償として、データベースファイルが元のJSONデータの3〜5倍に膨らむことがあります。サーバーのディスク容量には十分な余裕を持たせて、長期的なデータベース性能最適化を維持しましょう。

2. むやみにインデックスしない

タイトルや本文など、検索に必要なフィールドのみをインデックスしてください。画像リンクやメタデータなどは、処理速度の向上とメモリ節約のためにattributesToRetrieveに設定するだけに留めましょう。

3. 日本語の処理能力

Meilisearchのトークナイザー(分かち書き)は日本語も良好にサポートしています。しかし、特定の文脈でより正確な検索結果を得たい場合は、stopWordssynonyms(類義語)の設定を詳しく調べることをお勧めします。

4. バックアップ戦略

Dumps機能は、最も簡単なバックアップ方法です。インデックス全体を1つのファイルに圧縮します。サーバーを移行する際は、このダンプファイルを指定してMeilisearchを起動するだけで完了します。

# ダンプファイルの作成
curl -X POST 'http://localhost:7700/dumps'

# データの復元
./meilisearch --import-dump /path/to/data.dump

おわりに

Meilisearchは、小規模アプリケーション向けの軽量データベースとしてのSQLiteのように、中小規模のアプリケーションにとって完璧な選択肢です。軽量で速く、導入も非常に簡単です。ITブログやECサイトを構築しているなら、ぜひ今すぐMeilisearchを試してみてください。その圧倒的なスピードに驚くはずです。

Share: