こんにちは。
Meilisearchは軽量・高速な検索エンジンです。
Rustで書かれているのも個人的にツボポイントです。
https://www.meilisearch.com/
今回はセルフホスト版のmeilisearchを使ってみて、バージョン1.13時点で気になった点についてまとめていこうと思います。
Vector検索やハイブリッド検索を用いない、素のmeilisearchを対象としている点にご留意ください。
もし、記載内容に間違いがあればご指摘いただけると嬉しいです。
日本語との相性
まずは検索の概要について
Meilisearchでの検索は、はじめにクエリを分割&結合して幾つかの候補を作成します。
公式の例がわかりやすいので参考にさせていただきます。
https://www.meilisearch.com/docs/learn/engine/concat
結合の例
結合は検索クエリ内に複数の単語が入っている場合に行われる処理です。
The news paper
という検索クエリが渡された場合、以下のような組み合わせの結合クエリが作成されます。
Thenews paper
the newspaper
Thenewspaper
このように最大3単語を結合しています。
分割の例
次に分割ですが、検索クエリをスペースで区切った時のそれぞれの単語を小さい単位に分割していきます。
newspaper
という単語であれば、news
とpaper
に分けられます。
このような処理はクエリにマッチするデータを限りなく拾うための処置だと考えられます。
次に、prefix searchと呼ばれる手法で検索を用いてマッチする文章を取得します。
公式の例がわかりやすいので参考にさせていただきます。
https://www.meilisearch.com/docs/learn/engine/prefix
prefix searchの例
データセット内に以下の単語が格納されているとする。
film
cinema
movies
show
harry
potter
shine
musical
検索クエリがs
の場合のレスポンスは
show
shine
の二つでmovies
やmusical
は含まれない
検索クエリがsho
だとshow
が得られる。
この例から分かるように指定された単語で始まるものを探すのがprefix searchになります。
何が問題なのか?
主に分割のところで日本語のクエリを分割するときに小さく分割しすぎる傾向にあると思います。
特にひらがなやカタカナはそんな印象を受けます。
例えば、マイナンバー
をマ
イ
ナ
ン
バ
ー
と分けたりです。
この状態でprefix searchをすると、ほとんど関連のない文書が取得されることになるわけです。
考えられる改善点
新規の単語を辞書に登録するとか、形態素解析側を調整できるようになったりすると調整できるのかなと考えてます。
複数インデックスの取り扱い
meilisearchではmulti searchやfederated searchなど複数インデックスに対応した検索方法が存在します。まずはその違いについてざっくりイメージをつけてもらい、話に入っていきます。
https://www.meilisearch.com/docs/learn/multi_search/performing_federated_search
multi searchとfederated search
multi searchは並列実行による単体インデックスの検索、federated searchは複数インデックスの横断検索という違いがあります。
イメージとしては、
index1
, index2
があった時に、multi searchでは結果1, 結果2が返ってきて、federated searchでは結果1&2が返ってくるという感じです。
何が問題なのか?
federated searchを行った時に、検索結果全体にsortを反映できない。
以前記事を書いたようにランキングロジックを変更することで、新着順や価格順といったソートを聞かせることができます。
https://qiita.com/tamaloon/items/abcd699a9846124f840c
しかし、これは単体のインデックスに限られていると思われます。
そのため、なんらかの理由により複数インデックスで情報を管理し、検索の時に横断検索をした結果をソートしたいとなると、
それぞれのインデックス内ではソートされているもののそれをただ結合しただけという状態になります。
これはfederated searchのmergeアルゴリズムの問題なのかなーと考えてます。
https://www.meilisearch.com/docs/learn/multi_search/performing_federated_search
各インデックスに検索の設定が紐づいている
若干話はそれますが、各インデックスに設定が紐づいてるのもやりづらいですね。
置き換えタイプのインデックス更新をやっていると更新のたびに設定の更新が必要です。
ここは差分更新やったら解消するのかもしれないですが。
この辺りを見ていると単体インデックス特化なのかなとも思います。
まとめ
Meilisearchは導入もしやすく、良い検索エンジンだと思います。
一方で、私が書いたようなちょっとはまりにくいポイントなんかもあったりします。
ただ、日本語の問題に関してはVector検索を導入することで改善できる可能性があるなと考えています。
その辺りの検証ができていないのと私の調査不足の可能性も大いにありますので、ぜひご意見等々募集してます。
ありがとうございました。
仲間を募集中
株式会社ホープでは、福岡で働くエンジニアを募集中です。
ぜひ、求人を見てみてください!
▼ Wantedly求人
https://www.wantedly.com/projects/1684027
▼ コーポレートサイト
https://www.zaigenkakuho.com/recruit/
「自治体を通じて人々に新たな価値を提供し、会社及び従業員の成長を追求する」
この理念の実現に向けて、今後も自治体の課題解決に取り組んでいきます。
ご応募お待ちしております!