幅広い知識と幅広いスキルを求められている系システムエンジニアです。リモートワークしかやりません。

推しのMeiliSearchを紹介させてください

MeiliSerchで作りました

あまり「技術!」なことは書きません。

"ものすごく"簡単に始められる全文検索エンジン

MeiliSearch はオープンソース全文検索エンジンの1つで、メイリサーチと読みます。

どんな物かは私が公開しているデモサイトをさわってみてください。

  • MeiliSearch example in Japanese
    • 左サイドバーで検索やフィルタリングが実行できます
    • 右上の [SHOW SETTINGS][SHOW STATS] ボタンでMeiliSearchの設定や登録されているデータの統計が表示されます
    • ものすごくサクサク動く感じを体感してください

いい感じですよね?

  • AlgoliaのInstantSearch.js互換APIを提供している
  • オープンソースでセルフホストが可能
  • 使い始めるまでがすごく簡単
  • 検索がめっちゃ速い
  • インデックス処理もめっちゃ速い

という特徴があります。借りているVPS(メモリ2GB)の空きリソースで十分に動作可能なほどの軽量さで、個人利用もしやすいです。

「日本語対応文句なし」のビルドがまだ正式に公開されていない (記事公開時点)のでそこはご留意を。

向いている用途

  • ドキュメント検索
  • 製品検索(Shopifyにも組み込めます)
  • チャットのログ検索

向いていない用途

  • システムログの検索(Grafana Lokiとかを使おう)
  • ElasticSearch + Kibanaのような高度なデータ探索・可視化・分析
  • 絶対に落とせないシステム(HighAvailabilityにまだ未対応)

推しポイント

  • 開発、コミュニティマネージャーの方々がすごく親切(でかい)
  • 簡単
  • 速い
  • 軽い

開発、コミュニティマネージャーの方々がすごく親切

多言語サポートに非常に力を入れておられるようで、GitHubのPRやIssueでもすごく丁寧に対応していただけます。 Twitterで #meilisearch をつけて日本語でつぶやいたらちゃんと読んで丁寧なリプライをくれるのでびっくりしました。 「世界中で使われてほしい」というチームの熱意を感じますね。

簡単

とりあえず試したい場合は、Dockerが使える環境であれば以下の手順ですぐに試せます。

起動します

docker run --rm -p 7700:7700 -e MEILI_ENV=development getmeili/meilisearch:prototype-japanese-1

インデックスを作ります

curl -X POST -H "Content-Type: application/json" localhost:7700/indexes -d '{"uid":"hoge","primaryKey":"id"}'

データを投入します。JSON,CSV,NDJSON形式が使えます。NDJSONがオススメ。

curl -X POST -H "Content-Type: application/x-ndjson" localhost:7700/indexes/hoge/documents -d '
{"id": 1, "name": "hoge"}
{"id": 2, "name": "fuga"}
{"id": 3, "name": "piyo"}
'

http://localhost:7700 にアクセスすると小綺麗な検索画面が開きます。

Webサイトの画面を作るなら公式の instant-meiliseach の利用がお勧めです。AlgoliaのInstantSearch.js の資産が使えるので実装が非常に早くできます。
InstantSearch.js がすごいという話ですが、SearchBox はもちろんのこと、RefinmentList が感動しました。感動しろ。

MeiliSearch、雑にJSONデータぽーいってするだけで最高の絞り込み環境用意してくれるから、今までのあのシステムもこのシステムもってなるし政府関係のシステムも全部MeiliSearchにしたら?って「推し曲を国歌にしろ」勢の気持ちになれる

— @miiton (@MIITON) April 8, 2023

速い

検索の速さは MeiliSearch example in Japanese を試して頂ければ体感できるかと思います。約35,000件のデータから検索しています。 タイピングする度に結果が出るのですが、サクサク感がローカルデータを探しているかのような快適さ...

インデックスの速さも魅力的で、35,000件のデータ(NDJSONで42MB分)のインデックス処理に50秒かかりませんでした。(メモリ2GBのレンタルVPSにて)

軽い

VPS上でdockerで動作させていますが、サンプルサイトで待機時メモリ使用量18MiB、自分1人がキーワード検索したタイミングで50MiBぐらいの使用量。CPUも一瞬使いますが全然リソースに余裕があるという感覚です。
アクセス数が多くなるとどうなるのかは気になりますね。

検索機能ってめんどくさい

ここで、検索機能というものが めちゃくちゃめんどくさい という事を共有したいです。

"そして検索というのはとても難しい技術なため自分のような素人では導入して「普通に期待する動作」をさせるまでの距離はとても遠いです。"
@voluntas さんの記事 より

ま じ で 遠いです。

  • キーワード検索
  • 絞り込み

という単語であればExcelのような一覧表データでの想像がしやすいと思いますので、一般的な感覚で「まぁわかる」だと思います。ですが、

  • データ量はどこまで多くなる?
  • 登録データはカタカナ?ひらがな?(りんご?リンゴ?)
  • 検索する人はカタカナで検索?ひらがなで検索?(りんご?リンゴ?)
  • 完全一致や前方一致を意識したデータ作りをしている?(DBの知識: インデックスが効く or 効かない)
  • 導入後にフィルタしたい項目が増えたり減ったりする?
  • 数値の項目だったら範囲検索とか考える?
  • 同義語はどうする?(フォトショ?フォトショップ?PhotoShop?)
  • 検索結果をどの順番で出す?(ランキング)

などといった事を考え出すと一気に苦しくなります。データの量や内容が充実してくると検索要件(あの項目でも絞り込みたい、範囲指定ができるようにしたい...云々)も増えていきますので、変更にも柔軟に対応できるようにしておくことが求められます。もうやりたくない。

一番の競合であるAlgoliaと比べると?

Algolia のほうが高機能なのでお金が出せるならAlgoliaのほうが良いと思います。始めるまでの簡単さも変わらなかったです。日本語もきちんと検索できます。
(検索するときとインデックスするときそれぞれで言語指定ができます)
ただ、Growプランの10,000reqを超えたら 1,000reqごとに$0.5ってめちゃくちゃ高くないです...?そんなことない?

AlgoliaのInstantSearch.jsにできてinstant-meilisearchには出来ない機能はこちらでまとめられています

使っていて、「ん?」となったのは Autocomplete と、 Refinement Listsearchable オプションぐらいかなと思います。
自分でそれっぽいのを実装しようと思ったらできるレベルではあるかなと思います。

あとがき

一番推している理由は自分が関わったからっていうのがあります。 良い思い出なのでまた別でまとめたいなと思います。

参考リンク

© 2023 @miiton