エンジニアリング

検索履歴に基づくElastic App Searchのパーソナライズ

著者

Elastic App Searchを使うと、アプリやWebサイトにスケーラブルで関連性にすぐれた検索エクスペリエンスを追加できます。App Searchには重み付けやブースト結果の精選など、検索結果をパーソナライズするオプションも搭載されており、いずれもすぐに使いはじめることができます。さらに、“検索履歴からのおすすめ”ドキュメントを提案する機能を追加することも可能です。具体的には、エンドユーザーが過去に検索したドキュメントに類似する付加的なコンテンツを表示します。このブログ記事は、頼れるApp Search APIを使ってこの機能を作成する方法と手順を説明します。

検索クライアントを構築する

検索クライアントは通常フロントエンドアプリケーションで構築されますが、今回の手順では“おすすめ”を実際に表示する画面の作成とは別に、バックエンドで次の2つの作業が必要です。

  • 各分析イベントをユーザーIDでタグ付けする。
    • たとえば、すべてのクエリとクリックについて、付加的な分析タグパラメーターを送信します。
    • curl -X GET 'https://154d5f7d80774345fg92c8381891faf7.ent-search.us-east-1.aws.cloud.es.io/api/as/v1/engines/national-parks-demo/search' \ 
      -H 'Content-Type: application/json' \ 
      -H 'Authorization:Bearer search-soaewu2ye6uc45dr8mcd54v8' \ 
      -d '{ 
        "query": "everglade",
        "analytics": { 
          "tags": ["UNIQUE_USER_ID"] 
        } 
      }'
          
  • おすすめの検索結果のリスト(検索リクエスト、ページ読み込みなど)が必要な場合に、外部コントローラーにリクエストを送信する。

外部コントローラーを構築する

外部コントローラーはバックエンドサービスです。ユーザーの過去の検索に基づいてドキュメントのリストをポピュレートするクエリを生成するには、外部コントローラーを構築する必要があります。リクエストを受信すると、外部コントローラーは次のアクションを実行します。

  1. ユーザーが過去に検索した用語を取得する
    1. App Search Analytics APIを呼び出し、m時間範囲で上位n個のクエリのリストを、ユーザーIDのタグでフィルタリングします。以下の例は、UNIQUE_USER_IDというタグを付けたエンドユーザーが2020年の直近2か月に実行した上位20個のクエリを返す記述です。
    2. curl -X GET 'https://154d5f7d80774345fg92c8381891faf7.ent-search.us-east-1.aws.cloud.es.io/api/as/v1/engines/national-parks-demo/analytics/queries' \ 
      -H 'Content-Type: application/json' \ 
      -H 'Authorization:Bearer private-xxxxxxxxxxxxxxxxxxxxxxxx' \ 
      -d '{ 
        "filters": {  
          "all": [ 
            { 
              "date": { 
                "from":"2020-10-31T12:00:00+00:00" 
                "to":"2020-12-31T00:00:00+00:00" 
              } 
            }, { 
              "tag":"UNIQUE_USER_ID" 
            } 
          ] 
        },
        "page": { 
          "size":20 
        } 
      }'
          
  2. (任意)たとえばユーザーがまだ見ていない可能性が高いコンテンツや商品を宣伝するなどの目的で、検索結果で表示済みのドキュメントを除外することが可能です。ユーザーが過去にクリックしたドキュメントを検索し、除外する手順は次の通りです。
    1. App Search Analytics APIを呼び出し、クリックされたドキュメントのリストをユーザーIDでフィルタリングします。
  3. おすすめのドキュメントを生成する
    1. 手順1で生成した検索用語を使い、App SearchのSearch APIに対して複合検索クエリをかけます。
    2. curl -X POST 'https://154d5f7d80774345fg92c8381891faf7.ent-search.us-east-1.aws.cloud.es.io/api/as/v1/engines/national-parks-demo/multi_search' \ 
      -H 'Content-Type: application/json' \ 
      -H 'Authorization:Bearer search-soaewu2ye6uc45dr8mcd54v8' \ 
      -d '{ 
        "queries": [ 
          {"query": "california"},
          {"query": "florida"} 
        ] 
      }'
              
    3. (任意)このクエリにフィルターを追加して、そのユーザーがすでにクリックしたドキュメント(手順2で生成したドキュメント)を除外します。
    4. クエリの結果をクライアントに返します。

FAQとその他の考慮事項

以下に、この手順についてよくある質問と、考慮すべき内容をまとめています。

エンドユーザーをさらに別の形でセグメント化してこの手順を使用できる?

はい、この手順はお好みのセグメント化手法で応用可能です。その場合、タグがポイントになります。タグはコード内で定義された文字列を使用します。したがって、ユーザー別、地理的地域別、またはエンドユーザーに関する既知の情報に基づいて定義可能なその他のコーホート別のセグメントを検討することができます。 

ただし、タグは検索イベントとクリックイベントによって定義する必要があることに留意してください。変更後にロギングができなくなった場合は、定義をやり直すか、コーホートを別の方法で推論する必要があります。

手元にある別の任意のユーザーデータに基づいて検索結果を表示するには?

素晴らしいアイデアです。データをクエリ用語に変換できる場合は、外部コントローラーを修正してその検索結果も含めることができます。

この機能を調整するには?

既存の関連性調整設定を使うやり方のほかに、検索結果を最適化する方法はいくつかあります。

  • 返されるユーザークエリの数をより厳密に制限する
  • 返されるユーザークエリの時間範囲をより厳密に制限する
  • 複合検索クエリから返される結果の合計数を制限する

この手順をフロントエンドで実行できない理由は?

たとえばcookieなど、クライアントがユーザーによるクエリのリストを保有している場合、またこれは任意ですが、ドキュメントのリストがある場合はフロントエンドで実行できます。ただし、Analytics APIへのアクセスにはプライベートキーが必要であり、これをエクスポーズすることは望ましくないことに留意してください。

おわりに

ご紹介した検索履歴ベースの表示機能を開発してみたい、という方はElastic CloudのApp Search無料トライアルを使って、またはセルフマネージド向けApp Searchをダウンロードして立ち上げることができます。ご質問がおありの場合や、プロジェクトの成果をシェアしていただける場合はディスカッションフォーラムをご活用ください。