— Algolia
本記事は Algolia Advent calendar 7日目の記事になります。
前回の記事で Algolia のランキングについて、タイブレーキングの動きやカスタムランキングなどについて、概要的な部分をご紹介しました。 本記事では、実際にAlgoliaを利用する際にこのランキング情報をどのように確認し、調整するのかといったところを見ていきたいと思います。
AlgoliaのWeb UI から確認できるダッシュボードにはデータをブラウズしたり、検索結果をテストする機能がついています。 ランキング情報についてもまずはこのUIを通じて確認するのが手っ取り早い方法です。
早速具体例で見てみましょう。インデックスとしてはこちらの記事で作成したKindle蔵書検索用インデックスを使ってみたいと思います。 こちらのリンクから実際に検索をお試しいただけます。
Algolia ダッシュボードからインデックスの画面を開くとデフォルトで「Browse」というタブが表示され、以下の画面のようにインデックスに対して検索クエリを試す画面が表示されます。 ここで、試しに何らかのクエリを入力したあとヒットした各レコードの右下にあるメダルマークをクリックしてみてください。
すると、以下の画像のようなポップアップが表示されるかと思います。
これが、Algolia ダッシュボード上で確認できるランキング情報です。 前回の記事で確認したようなインデックスのランキングストラテジーに対してレコードがどのように評価されたか、またタイブレーカーとなっているランキングクライテリア(基準)の情報を表示します。 この例でいうと、以下のような情報を読み取ることができます。
このインデックスのランキング設定は以下のようになっており、デフォルトランキングストラテジー+カスタムランキング(purchaseDate:降順)という比較的一般的な設定としています。 検索結果のレコード群については「鬼滅の刃」というクエリに関してはテキスト関連性の観点で差が出ないため、結果的にカスタムランキングに設定されたpurchaseDateの値(購入日・降順)が順位を決定していることがわかります。
少し違うパターンもみてみましょう。 今度は検索クエリを変えて「アイルランド」で検索してみます。 すると4件の書籍がヒットしましたが、4件目のデータについては「地球の歩き方のアイスランド」がヒットしています。
ランキング情報を見てみましょう。 すると、タイブレーカーは"Number of typoes"(タイポの数)となっていることがわかります。 すなわち、アイルランドの一字違いの検索結果として「アイスランド」がヒットしていますが、かつタイポ数が多いため typo ランキングクライテリアをタイブレーカーとして下位に位置づけられている状況ということになります。
なお、補足とはなりますがAlgolia で日本語のテキストに対して typo tolerance を有効にするには indexingLanguages
,queryLanguages
の設定に ['ja']
を含める必要があります。
こちらを設定することにより Kuromoji + UniDic ベースでの形態素解析によるトークナイズが有効になり、タイポのあるキーワードも検索結果で取得されるようになります。
上記の設定を行わない場合はキャラクターベースで検索する動作となり、日本語でのtypo toleranceは有効になりませんのでご注意ください。
また、日本語で形態素解析によるトークナイズを有効化した場合、トークナイズの結果については API レスポンスの parsedQuery
プロパティにて確認できます。
ダッシュボード上では 'Raw' を選択すると API から返却された JSON が参照することができますので、形態素解析の結果を確認されたい場合はこちらを見てみてください。
定番ですが、すもももももももものうちのトークナイズ結果はこんな感じで表示され、スペースでトークンが区切られていることがわかります。
ここまで見てきたランキング情報等の詳細については当然ながら API を使って取得することも可能です。
検索リクエストのパラメータに getRankingInfo:true
を付与することで、以下のような _rankingInfo
というオブジェクトがヒットしたレコードごとに返却されるようになります。
デフォルトではオフになっていますが、ランキングについてクライアント側でクエリルールなども加味したデバッグを行いたい場合にはこちらを参照いただくことが有効です。
各値の意味についてはドキュメントをご参照ください。
では、実際に検索結果に対するランキングはどのように設定・カスタマイズすれば良いのでしょうか。
Algolia のランキングの基本として抑えていただきたいのはsearchableAttributes
とcustomRnaking
です。
searchableAttributes
は文字通り検索対象となるアトリビュートを指定するパラメータです。
インデックス作成時には設定値は空の状態(=すべてのアトリビュートが検索対象となる状態)となり、インデックス作成後に任意のアトリビュートを追加する必要があります。 基本的にはユーザーがクエリする可能性のある情報を持つアトリビュート(例えば書名、著者名、商品説明、関連タグなど)はできるだけ含めることをおすすめします。 一方で検索結果中でUI上での表示に使用するためのアトリビュート(画像リンクなど)はノイズとなる可能性があるため、指定を避けましょう。
searchableAttributes
ではアトリビュートの並び順もランキングに考慮されます。
上記の例でいうと、title でヒットしたレコードは authors でヒットしたレコードよりも上位に表示されます。
従って、例えば「岡崎」というクエリが'title' と 'authors' に含まれるレコードを検索した場合の結果は以下のような並び順になります。
searchableAttributes に追加した各アトリビュートについてはordered
またはunordered
というプロパティを指定することができます。
これはアトリビュート内で検索語のマッチした位置を考慮するかどうかを設定するものです。ordered
(デフォルト)ではマッチした位置を考慮し、同じアトリビュート内でもより早い位置に出てくるレコードを上位に位置づけられます。
例えば先程の「アイルランド」というクエリで検索してみると、ordered
となっている 'title' アトリビュートでマッチした結果は以下のような並びとなります。
試しにこちらを unordered
に変更してみましょう。すると語の位置は考慮されずタイ(同順位)となるため、 attribute クライテリアはタイブレーカーにならず、カスタムランキングの'purchaseDate'によってタイブレーキングされる並びになりました。
customRanking
についてはその動作は前回ご説明したとおりですが、主な役割としては「テキスト関連性」の観点でタイブレークが発生しない検索結果に対するランキングの最終的な色付けを担います。Algolia Dashboard 上からは複数のカスタムランキング用アトリビュートや並び順を指定するsort-byアトリビュートの追加が可能です。
これ以外にもタイポを含む検索結果を返却する条件の詳細を指定するパラメータやexactランキングクライテリアの適用条件に関するパラメータなど、各ランキングクライテリアに対して細かな設定を行うためのパラメータが用意されており、ダッシュボード上からアクセスが可能です。これらのパラメータは基本的にはデフォルトでお使い頂いて問題ないよう設定されており、積極的なカスタマイズの必要は有りません。もしも検索結果のランキングの動作を確認する中でこれらのランキングクライテリアについての微調整が必要になった場合にはぜひ関連ドキュメントを参照してみてください。
なお、例えば特定のクエリに対して特定のレコードやカテゴリーをランキング上位に表示させたい、といったケースは ランキング設定を直接変更するよりも Algoliaのルール機能の使用を検討いただくことをおすすめします。 ランキングのカスタマイズは同一インデックスの検索結果全てに影響を及ぼしますが、ルールを使用することでその影響範囲をコントロールしつつ、より柔軟なカスタマイズが可能となるからです。
ということで前回の記事を踏まえ、Algolia の検索結果におけるランキング情報の見方とカスタマイズについてまとめてみました。ランキングのカスタマイズについてはダッシュボードを活用することで比較的手軽にトライ&エラーを試すことができますので、実際に検索機能を実装する中でお試しいただければと思います。また、A/Bテスト機能などを使用して異なるランキング構成間でのパフォーマンス比較、といったテストを行うことも可能ですので、ぜひご活用ください。
明日は再び @shinodogg さんの記事で、「Algoliaで検索結果をグループ化して表示する方法」とのことです。お楽しみに!