Skip to content
blog.tatsuroh.com

Algoliaのランキングの見方とカスタマイズ

Algolia

本記事は Algolia Advent calendar 7日目の記事になります。

前回の記事で Algolia のランキングについて、タイブレーキングの動きやカスタムランキングなどについて、概要的な部分をご紹介しました。 本記事では、実際にAlgoliaを利用する際にこのランキング情報をどのように確認し、調整するのかといったところを見ていきたいと思います。

Algolia ダッシュボードからランキング情報を確認する

AlgoliaのWeb UI から確認できるダッシュボードにはデータをブラウズしたり、検索結果をテストする機能がついています。 ランキング情報についてもまずはこのUIを通じて確認するのが手っ取り早い方法です。

早速具体例で見てみましょう。インデックスとしてはこちらの記事で作成したKindle蔵書検索用インデックスを使ってみたいと思います。 こちらのリンクから実際に検索をお試しいただけます。

Algolia ダッシュボードからインデックスの画面を開くとデフォルトで「Browse」というタブが表示され、以下の画面のようにインデックスに対して検索クエリを試す画面が表示されます。 ここで、試しに何らかのクエリを入力したあとヒットした各レコードの右下にあるメダルマークをクリックしてみてください。

199CDD401D74E7DF90DBF069535D6199

すると、以下の画像のようなポップアップが表示されるかと思います。

7AAE87F1682B3D2E2EA243C642067F3C

これが、Algolia ダッシュボード上で確認できるランキング情報です。 前回の記事で確認したようなインデックスのランキングストラテジーに対してレコードがどのように評価されたか、またタイブレーカーとなっているランキングクライテリア(基準)の情報を表示します。 この例でいうと、以下のような情報を読み取ることができます。

  • Number of typos: 0 -> クエリに対するtypoはない
  • Matching words: 4-> クエリに対し4つのWordがヒットしている。日本語の場合トークナイズ結果(この場合「/鬼/滅/の/刃/」)をベースとして計算
  • Matching filters: 0 -> optional filterでマッチしているものはない(もしくは指定されていない)
  • Proximity distance: 3 -> 一番最初にヒットした語と一番最後にヒットした語の距離
  • Best matching attribute : title(1st word) -> マッチしたアトリビュートと語の位置。titleアトリビュートの第一語にヒットしている(後述の 「searchableAttributesのカスタマイズ」も参照)
  • Exact words count: 4 -> (prefix ではなく) exactマッチする語が4つある
  • Custom Ranking: Tibreaker -> purchaseDate アトリビュートがタイブレーカーとなっている

このインデックスのランキング設定は以下のようになっており、デフォルトランキングストラテジー+カスタムランキング(purchaseDate:降順)という比較的一般的な設定としています。 検索結果のレコード群については「鬼滅の刃」というクエリに関してはテキスト関連性の観点で差が出ないため、結果的にカスタムランキングに設定されたpurchaseDateの値(購入日・降順)が順位を決定していることがわかります。

0FCCF9D049B59076CEBEF2AAA982C9A0

Typo-tolerance でのランキング例

少し違うパターンもみてみましょう。 今度は検索クエリを変えて「アイルランド」で検索してみます。 すると4件の書籍がヒットしましたが、4件目のデータについては「地球の歩き方のアイランド」がヒットしています。

843B5F6B5D7E29E235967E0461E86C9F

ランキング情報を見てみましょう。 すると、タイブレーカーは"Number of typoes"(タイポの数)となっていることがわかります。 すなわち、アイルランドの一字違いの検索結果として「アイスランド」がヒットしていますが、かつタイポ数が多いため typo ランキングクライテリアをタイブレーカーとして下位に位置づけられている状況ということになります。

F14973E0339AE1F092D4BD251EB3D7DE

typo toleranceと日本語形態素解析

なお、補足とはなりますがAlgolia で日本語のテキストに対して typo tolerance を有効にするには indexingLanguages,queryLanguages の設定に ['ja']を含める必要があります。 こちらを設定することにより Kuromoji + UniDic ベースでの形態素解析によるトークナイズが有効になり、タイポのあるキーワードも検索結果で取得されるようになります。 上記の設定を行わない場合はキャラクターベースで検索する動作となり、日本語でのtypo toleranceは有効になりませんのでご注意ください。

また、日本語で形態素解析によるトークナイズを有効化した場合、トークナイズの結果については API レスポンスの parsedQuery プロパティにて確認できます。 ダッシュボード上では 'Raw' を選択すると API から返却された JSON が参照することができますので、形態素解析の結果を確認されたい場合はこちらを見てみてください。

定番ですが、すもももももももものうちのトークナイズ結果はこんな感じで表示され、スペースでトークンが区切られていることがわかります。

2F56F767D3B3E71A80425B12F9738915

API 経由でのRanking infoの確認

ここまで見てきたランキング情報等の詳細については当然ながら API を使って取得することも可能です。 検索リクエストのパラメータに getRankingInfo:trueを付与することで、以下のような _rankingInfo というオブジェクトがヒットしたレコードごとに返却されるようになります。 デフォルトではオフになっていますが、ランキングについてクライアント側でクエリルールなども加味したデバッグを行いたい場合にはこちらを参照いただくことが有効です。 各値の意味についてはドキュメントをご参照ください。

B61AE8399CB9AC928444896F4155D98E

ランキングのカスタマイズ

では、実際に検索結果に対するランキングはどのように設定・カスタマイズすれば良いのでしょうか。 Algolia のランキングの基本として抑えていただきたいのはsearchableAttributescustomRnakingです。

searchableAttributes のカスタマイズ

searchableAttributesは文字通り検索対象となるアトリビュートを指定するパラメータです。

25EB13AB1BCBF32452BFC379DF7EC0AD

インデックス作成時には設定値は空の状態(=すべてのアトリビュートが検索対象となる状態)となり、インデックス作成後に任意のアトリビュートを追加する必要があります。 基本的にはユーザーがクエリする可能性のある情報を持つアトリビュート(例えば書名、著者名、商品説明、関連タグなど)はできるだけ含めることをおすすめします。 一方で検索結果中でUI上での表示に使用するためのアトリビュート(画像リンクなど)はノイズとなる可能性があるため、指定を避けましょう。

searchableAttributesではアトリビュートの並び順もランキングに考慮されます。 上記の例でいうと、title でヒットしたレコードは authors でヒットしたレコードよりも上位に表示されます。 従って、例えば「岡崎」というクエリが'title' と 'authors' に含まれるレコードを検索した場合の結果は以下のような並び順になります。

50D006AAE54FA2B83B840B182875CF15

searchableAttributes に追加した各アトリビュートについてはordered またはunordered というプロパティを指定することができます。 これはアトリビュート内で検索語のマッチした位置を考慮するかどうかを設定するものです。ordered (デフォルト)ではマッチした位置を考慮し、同じアトリビュート内でもより早い位置に出てくるレコードを上位に位置づけられます。

例えば先程の「アイルランド」というクエリで検索してみると、ordered となっている 'title' アトリビュートでマッチした結果は以下のような並びとなります。

166CB63E95323B5DEC412DB070B96907

試しにこちらを unorderedに変更してみましょう。すると語の位置は考慮されずタイ(同順位)となるため、 attribute クライテリアはタイブレーカーにならず、カスタムランキングの'purchaseDate'によってタイブレーキングされる並びになりました。

CC5FD5CDA7A9EE30A4DE25B8656A0760
customRanking のカスタマイズについて

customRanking についてはその動作は前回ご説明したとおりですが、主な役割としては「テキスト関連性」の観点でタイブレークが発生しない検索結果に対するランキングの最終的な色付けを担います。Algolia Dashboard 上からは複数のカスタムランキング用アトリビュートや並び順を指定するsort-byアトリビュートの追加が可能です。

BF0E11027EC998B184B96F868D6B7DCC
その他のプロパティのカスタマイズ

これ以外にもタイポを含む検索結果を返却する条件の詳細を指定するパラメータexactランキングクライテリアの適用条件に関するパラメータなど、各ランキングクライテリアに対して細かな設定を行うためのパラメータが用意されており、ダッシュボード上からアクセスが可能です。これらのパラメータは基本的にはデフォルトでお使い頂いて問題ないよう設定されており、積極的なカスタマイズの必要は有りません。もしも検索結果のランキングの動作を確認する中でこれらのランキングクライテリアについての微調整が必要になった場合にはぜひ関連ドキュメントを参照してみてください。

なお、例えば特定のクエリに対して特定のレコードやカテゴリーをランキング上位に表示させたい、といったケースは ランキング設定を直接変更するよりも Algoliaのルール機能の使用を検討いただくことをおすすめします。 ランキングのカスタマイズは同一インデックスの検索結果全てに影響を及ぼしますが、ルールを使用することでその影響範囲をコントロールしつつ、より柔軟なカスタマイズが可能となるからです。

まとめ

ということで前回の記事を踏まえ、Algolia の検索結果におけるランキング情報の見方とカスタマイズについてまとめてみました。ランキングのカスタマイズについてはダッシュボードを活用することで比較的手軽にトライ&エラーを試すことができますので、実際に検索機能を実装する中でお試しいただければと思います。また、A/Bテスト機能などを使用して異なるランキング構成間でのパフォーマンス比較、といったテストを行うことも可能ですので、ぜひご活用ください。

明日は再び @shinodogg さんの記事で、「Algoliaで検索結果をグループ化して表示する方法」とのことです。お楽しみに!

© 2020 by blog.tatsuroh.com. All rights reserved.
Theme by LekoArts