Meilisearch を調べてみた
今まで検索エンジンは Elasticsearch をメインに利用してきました。
Elasticsearch はとにかく多機能です。全文検索に限らず色々なユースケースのデータストアとして利用できます。便利な一方で複雑で学習コストが高い、特にキーワード検索みたいな限った用途で利用するには不要な機能が大量に含まれています。
そこでもっとキーワード検索に特化したシンプルな検索エンジンを探していて、最近よく Meilisearch を採用したという話を聞くのでドキュメントを読んだり、実際に触ってみたりしてみました。
Meilisearch とは
- RESTful な検索 API サーバ
- エンドユーザーが高速でよりよい検索体験を得られることを重視した機能開発
Demo
Rust の crate(パッケージレジストリ)からライブラリをインスタント検索できる Demo サイトを体験できます。
以下の機能を体験できます。
- 高速なレスポンス:数十ミリ秒の検索(UI表示が数十ミリ秒ではない)
- インスタント検索:入力するたびに検索結果が更新される
- Typo tolerance:Fuzzy 検索(たとえば randam と入力しても random の結果が返る)
- ハイライト表示:検索結果内の検索キーワードを強調表示
機能一覧
Search as you type
インスタント検索ができる。
Elasticsearch の Suggester みたいなことかな?
Ultra relevant
ある程度精度高いデフォルトの関連性(ソート)に加えて、ルールをカスタマイズし、精度を高めることができる。
Typo tolerant
タイポがあっても検索できる。
タイポの許容する編集距離や適用しない単語などをカスタマイズできる。
Synonyms
同義語、類義語でも検索できる。
同義語、類義語は独自で定義する。
Highlighting
検索結果の検索キーワード周辺の文章を抽出し、検索キーワードを強調表示する。
強調表示は任意の HTML タグを付与できる。
Geosearch
緯度経度同士で検索できる。
距離や範囲で絞り込んだり、検索結果に距離を含めたりできる。
Filtering
任意のフィールドで文字列や数値の絞り込みができる。
SQL like な直感的な記法で書ける。
Faceting
検索結果を任意のフィールドで集計できる。
Sorting
検索結果をソートできる。
デフォルトは複数の条件を組み合わせたランキングルールでソートし、リクエスト時にフィールドの値でソートすることもできる。
API key management
API キーによりアクセス制御できる。
Master Key、Default Search API Key など役割ごとのキーがあるっぽい。
Multitenancy
マルチテナント向けの管理機能がある。
テナントトークンによりアクセスできるドキュメントを制御できる。
Index swapping
クライアントから同じアクセス先で参照するインデックスを追加、変更できる。
Elasticsearch の Alias みたいな機能?
Comprehensive language support
以下の言語を適切に検索できる。
- Any language that uses whitespace to separate words
- Chinese
- Hebrew
- Japanese
- Korean
- Thai
日本語は Lindera を利用している。
Phrase search
完全一致検索もできる。
ダブルクォートで括ることでフレーズ検索になる。
Multi-search
1回のリクエストで複数のインデックス、複数の条件での検索結果を受け取ることができる。
ロードマップ
Meilisearch はロードマップを公開しています。
誰でも要望を提案でき、誰でもリアクションすることができます。
個人的に気になるものをいくつかピックアップしようと思ったのですが、気になるのが多すぎたのでやめた。
Philosophy(理念?)
高品質で簡単に利用できる検索エンジンは少ない。
機能が物足りない、もしくは利用が難しい検索エンジンがほとんど。
使いやすさを重視して開発している。
Simple and intuitive
開発者、エンドユーザーともにシンプルで直感的な体験を提供できるように開発している。
Highly customizable
デフォルト設定(何もチューニングしなくても)で多くの要件実現できるようにしつつ、カスタマイズでよりサイトに最適化できるようにしている。
Front-facing search
Meilisearch は検索エンジンであり、エンドユーザーが直接操作するものではないが、
エンドユーザーの検索体験を意識した開発をしている。
Search as you type を重視している。
Anti-pattern
どこにでも使えるデータストアは目指していない。
エンドユーザーが探したいデータの検索に特化させている。
アクセス方法もエンドユーザーが直接アクセスすることを想定している?
JavaScript(ブラウザ)からアクセスしてほしいというよりは、あまりプロキシ挟むなってことかな。
公式 SDK / Library
各種言語の SDK、フレームワークの Integration、フロントエンドフレームワークのライブラリ、デプロイツール、プラットフォームプラグイン、スクレイピングなど外部と Integration して簡単にシステムに利用できる実装を用意しています。
Instant Meilisearch は algolia の Instant Search を Meilisearch 用に再実装したものみたいなので Instant Search みたいに簡単にサイトに検索機能を導入できるのは嬉しいです。