0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

セルフホスト版 Meilisearchの気になったところ2選

Posted at

こんにちは。

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という単語であれば、newspaperに分けられます。

このような処理はクエリにマッチするデータを限りなく拾うための処置だと考えられます。

次に、prefix searchと呼ばれる手法で検索を用いてマッチする文章を取得します。

公式の例がわかりやすいので参考にさせていただきます。
https://www.meilisearch.com/docs/learn/engine/prefix

prefix searchの例

データセット内に以下の単語が格納されているとする。
film cinema movies show harry potter shine musical

検索クエリがsの場合のレスポンスは

  • show
  • shine

の二つでmoviesmusicalは含まれない
検索クエリが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/
「自治体を通じて人々に新たな価値を提供し、会社及び従業員の成長を追求する」
この理念の実現に向けて、今後も自治体の課題解決に取り組んでいきます。
ご応募お待ちしております!

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?