Techtouch Developers Blog

テックタッチ株式会社の開発チームによるテックブログです

Meilisearch を製品の検索に使ってみたいので調べてみた

テックタッチアドベントカレンダー2日目を担当する misu です。W杯面白いですね。見ていて気持ちがいいので最後までよく走るチームが好きです。

概要

2022/12 月時点の情報です。version は 0.29.0。 こんな検索体験を提供できるようになる。(公式が提供しているデモデータ(約30,000件)が英語なので頑張って日本語訳した)

検索 API を提供する middleware。以下のような点をウリにしている。特徴より一部抜粋。

  • 高速に検索結果を返す(50ms以下)
  • カスタマイズ可能な検索
    • ランキング表示を変更できる
  • タイプミスやスペルミスを理解する
  • キーストロークごとに検索ができる。prefix-search
    • 検索クエリをデータセット内の各単語の先頭と比較することによってドキュメントの並べ替えを開始する。ex.) query: s に対し、show や shine が hit し、movies や musical などは hit しない

用途は小 - 中規模データにおける、高速・低コストで構築できる検索エンジンを用意したいとき。
より大規模だったり、複雑なクエリが必要な場合は Elasticsearch のほうに軍配がある。

比較

Elastisearch との比較

素早く検索結果を返しつづけるためには内部動作を理解したり、ニーズに合わせたカスタマイズを学習する必要がある。
非常に大きなデータセットに対する分析や複雑なクエリは得意。Meilisearch は今の所不得意。
ただし、Google 検索のようなインスタント検索であれば Meilisearch は良い選択肢であると述べている。

Algolia との比較
そもそも Meilisearch は Algolia の研究と最近の研究論文に基づいて開発された検索エンジン。
利点は、OSS であり場合によっては fork や セルフホスティングが可能なところ。

その他の機能的な比較

より網羅的に知りたい方はこちらにまとまっている。

production 導入

production 導入のために調べておきたいことをまとめてみた。

クラスタリング

replica や cluster で検索しても出てこなかった。おそらく RDB のように落ちてはいけないものとして使わないからだと考えている。
Elasticsearch のように master と data node のように分かれる進化をするかもしれない。roadmapには High Availibility が上がっている。

スナップショット

下記コマンドで取得可能

$ meilisearch --schedule-snapshot

# 1時間ごとに取得
$ meilisearch --schedule-snapshot --snapshot-interval-sec 3600

# スナップショットから再開
$ meilisearch --import-snapshot mySnapShots/data.ms.snapshot

スナップショットはデータベースの直接のコピーであるため、Meilisearch のアップグレード時にスナップショットを使用してデータを移行することはできない。
スナップショットから開始する場合、既存のデータベースがある可能性がある。セキュリティ上の理由から、データベースが上書きされることはない。

マルチテナント運用

検索クエリを含んだ token を返しておき、検索時にはその token 利用を強制することで実現可能。テナントごとに index 作成は推奨ではないのかが気になった。

キャパシティプランニング

実データいれて大体のストレージサイズを理解しておくとよさそう。主観だけどそれなりにストレージ使いそう。
JSON 9.1MB に対して ディスク上の Meil​​isearch データベースのサイズは 224MB。← 公式より。
ただし、設定値やドキュメントによって結果は異なるので前述の通り実データ検証は必須。

tips

  • デフォルトではすべてのフィールドが検索可能なので、検索対象を設定しておくとよい。searchable-attributesの設定
  • index を作成するときは適切な設定を行っておくとドキュメント追加時のオーバーヘッドが少なくなる。
  • マシンの I/O に制限がかかっているとパフォーマンスに影響がでることがある。例えば、AWS EBS の IOPS はインスタンスサイズによって異なる。詳細
  • メモリクラッシュは大概インデックス作成中に発生する。RAM を追加するか、ドキュメント追加のバッチサイズを小さくする、インデックスの設定見直しが現状の対策となる。
  • 一般に、最適なパフォーマンスを得るには、Meilisearch がディスクで使用するスペースと同じ量の RAM が必要。

参考