Open6

Meilisearch を調べてみた

fujimotoshinjifujimotoshinji

今まで検索エンジンは Elasticsearch をメインに利用してきました。
Elasticsearch はとにかく多機能です。全文検索に限らず色々なユースケースのデータストアとして利用できます。便利な一方で複雑で学習コストが高い、特にキーワード検索みたいな限った用途で利用するには不要な機能が大量に含まれています。

そこでもっとキーワード検索に特化したシンプルな検索エンジンを探していて、最近よく Meilisearch を採用したという話を聞くのでドキュメントを読んだり、実際に触ってみたりしてみました。

https://www.meilisearch.com/

fujimotoshinjifujimotoshinji

Meilisearch とは

https://www.meilisearch.com/docs/learn/what_is_meilisearch/overview

  • RESTful な検索 API サーバ
  • エンドユーザーが高速でよりよい検索体験を得られることを重視した機能開発

Demo

https://crates.meilisearch.com/

Rust の crate(パッケージレジストリ)からライブラリをインスタント検索できる Demo サイトを体験できます。
以下の機能を体験できます。

  • 高速なレスポンス:数十ミリ秒の検索(UI表示が数十ミリ秒ではない)
  • インスタント検索:入力するたびに検索結果が更新される
  • Typo tolerance:Fuzzy 検索(たとえば randam と入力しても random の結果が返る)
  • ハイライト表示:検索結果内の検索キーワードを強調表示
fujimotoshinjifujimotoshinji

機能一覧

https://www.meilisearch.com/docs/learn/what_is_meilisearch/features

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 を利用している。

https://github.com/lindera-morphology/lindera

完全一致検索もできる。
ダブルクォートで括ることでフレーズ検索になる。

1回のリクエストで複数のインデックス、複数の条件での検索結果を受け取ることができる。

fujimotoshinjifujimotoshinji

Philosophy(理念?)

高品質で簡単に利用できる検索エンジンは少ない。
機能が物足りない、もしくは利用が難しい検索エンジンがほとんど。
使いやすさを重視して開発している。

Simple and intuitive

開発者、エンドユーザーともにシンプルで直感的な体験を提供できるように開発している。

Highly customizable

デフォルト設定(何もチューニングしなくても)で多くの要件実現できるようにしつつ、カスタマイズでよりサイトに最適化できるようにしている。

Meilisearch は検索エンジンであり、エンドユーザーが直接操作するものではないが、
エンドユーザーの検索体験を意識した開発をしている。
Search as you type を重視している。

Anti-pattern

どこにでも使えるデータストアは目指していない。
エンドユーザーが探したいデータの検索に特化させている。
アクセス方法もエンドユーザーが直接アクセスすることを想定している?
JavaScript(ブラウザ)からアクセスしてほしいというよりは、あまりプロキシ挟むなってことかな。

fujimotoshinjifujimotoshinji

公式 SDK / Library

各種言語の SDK、フレームワークの Integration、フロントエンドフレームワークのライブラリ、デプロイツール、プラットフォームプラグイン、スクレイピングなど外部と Integration して簡単にシステムに利用できる実装を用意しています。
Instant Meilisearch は algolia の Instant Search を Meilisearch 用に再実装したものみたいなので Instant Search みたいに簡単にサイトに検索機能を導入できるのは嬉しいです。

https://github.com/meilisearch/instant-meilisearch