ベクトル検索から強力なREST APIまで、Elasticsearchは開発者に最も広範な検索ツールキットを提供します。GitHubのサンプルノートブックにアクセスして新しいことを試してみましょう。また、無料トライアルを始めるか、ローカルでElasticsearchを実行することもできます。
この記事では、全文検索とベクトル検索の結果を組み合わせたハイブリッド検索を実装する方法を説明します。これら 2 つのアプローチを統合することにより、ハイブリッド検索では、両方の検索戦略の長所を活用して、結果の幅が広がります。
ハイブリッド検索の統合に加えて、検索ソリューションをさらに堅牢にする機能を追加する方法も紹介します。これには、ファセットやパーソナライズされた製品プロモーションが含まれます。さらに、Elastic の Behavioral Analytics ツールを使用して、ユーザーインタラクションをキャプチャし、貴重な洞察を生成する方法も紹介します。
この実装では、ユーザーが検索結果を表示して操作できるようにするインターフェースと、情報を返す API の両方を構築する方法について説明します。ソースコードを含むリポジトリにアクセスするには、以下のリンクを参照してください。
- https://github.com/elastic/elasticsearch-labs/tree/main/supporting-blog-content/hybrid-search-for-an-e-commerce-product-catalogue/product-store-search
- https://github.com/elastic/elasticsearch-labs/tree/main/supporting-blog-content/hybrid-search-for-an-e-commerce-product-catalogue/app-product-store
このガイドは、インデックスの作成からファセットや結果のパーソナライズなどの高度な機能の実装まで、いくつかのステップに分かれています。最後には、電子商取引のシナリオで使用できる強力な検索ソリューションが完成します。
電子商取引ハイブリッド検索の環境設定
実装を始める前に、環境を設定する必要があります。Elasticsearch を管理するには、Elastic Cloud 上のサービスまたはコンテナ化されたソリューションを使用するように選択できます。コンテナ化を選択した場合、Docker Compose 経由の構成はこのリポジトリにあります: docker-compose.yml 。
インデックス作成と製品カタログの取り込み
インデックスは、名前、説明、写真、カテゴリ、タグなどのフィールドを含む化粧品のカタログに基づいて作成されます。「名前」や「説明」などの全文検索に使用されるフィールドはtextとしてマッピングされますが、「カテゴリ」や「ブランド」などの集計に使用されるフィールドはファセットを有効にするためにkeywordとしてマッピングされます。
「説明」フィールドは、製品に関する詳細なコンテキストを提供するため、ベクター検索に使用されます。このフィールドは、説明のベクトル表現を格納するdense_vector,として定義されます。
インデックス マッピングは次のようになります。
インデックスを作成するためのスクリプトはここにあります。
埋め込み生成
製品の説明をベクトル化するために、モデル all-MiniLM-L6-v2 を使用します。この場合、アプリケーションはインデックス作成前に埋め込みを生成する必要があります。別のオプションとしては、モデルを Elasticsearch クラスターにインポートすることですが、このローカル環境では、アプリケーション内で直接ベクトル化を実行することを選択しました。
インデックスの作成には、 Kaggleで利用可能な化粧品データセットを使用し、データ取り込みの効率を向上させるためにバッチ処理を使用しました。この同じ取り込み段階で、「description」フィールドの埋め込みを生成し、新しいフィールド「description_embeddings」にインデックスを付けます。
完全なデータ取り込みプロセスは、リポジトリで利用可能なJupyter Notebookを通じて直接実行できます。このノートブックには、データがどのように読み取られ、処理され、Elasticsearch にインデックス付けされるかについてのステップバイステップのガイドが用意されており、簡単に複製および実験を行うことができます。
次のリンクからノートブックにアクセスできます: Ingestion Notebook。
ハイブリッド検索の実装
それでは、ハイブリッド検索を実装してみましょう。キーワードベースの検索では、「name」、「category」、「description」フィールドをターゲットとするmulti_matchクエリを使用します。これにより、これらのいずれかのフィールドに検索用語が含まれるドキュメントが取得されるようになります。
ベクトル検索には、 KNN クエリを使用します。クエリを実行する前に検索用語をベクトル化する必要があり、これは入力用語をベクトル化するメソッドを使用して実行されます。取り込み時に使用されたのと同じモデルが検索用語にも使用されることに注意してください。
両方の検索の組み合わせは、相互ランク融合 (RRF)アルゴリズムを使用して実現されます。このアルゴリズムは、2 つのクエリの結果を結合し、ノイズを減らすことで検索精度を向上させます。RRF を使用すると、キーワードベースの検索とベクトル検索の両方を連携させることができ、ユーザーのクエリの理解が向上します。
結果の比較: キーワード検索とハイブリッド検索
ここで、従来のキーワード検索とハイブリッド検索の結果を比較してみましょう。キーワード検索で「乾燥肌用ファンデーション」を検索すると、次のような結果が表示されます。

- レブロン カラーステイ メイクアップ (普通肌/乾燥肌用)説明: レブロン カラーステイ メイクアップは、軽い処方で、固まったり、色落ちしたり、擦り落ちたりしない、長持ちするカバー力を提供します。タイムリリーステクノロジーを採用した、オイルフリーの水分バランスフォーミュラは、特に普通肌または乾燥肌に継続的に水分を補給するように作られています。特徴:メイクアップは快適なつけ心地で、最大24時間持続します。ミディアムからフルカバー。美しい色合いが揃っています。
- メイベリン ドリームスムースムースファンデーション説明:気に入る理由ユニークなクリームホイップファンデーションが、100%赤ちゃんのような滑らかな肌を実現します。14時間、うるおいを保ち、肌荒れや乾燥を防ぎます。軽いつけ心地で、完璧な保湿効果を発揮します。シームレスにブレンドされ、一日中フレッシュな使い心地です。オイルフリー、無香料、皮膚科医テスト済み、アレルギーテスト済み、ノンコメドジェニック。毛穴を詰まらせません。安全です。敏感肌用。
分析:「乾燥肌用ファンデーション」を検索した場合、検索語のキーワードと製品のタイトルおよび説明が完全に一致する結果が得られました。ただし、この一致が必ずしも最良の選択を反映するとは限りません。たとえば、レブロン カラーステイ メイクアップ ノーマル / ドライ スキンは、特に乾燥肌向けに作られているので、良い選択肢です。オイルフリーでありながら、持続的な水分補給を実現する処方になっています。対照的に、メイベリン ドリーム スムース ムース ファンデーションも入手しました。オイルフリーで保湿効果もあると謳っていますが、オイルフリーの製品は乾燥肌に必要な水分補給よりも皮脂のコントロールに重点を置く傾向があるため、一般的に脂性肌や混合肌の方におすすめです。これは、乾燥肌の人々の特定のニーズを完全に満たさない製品が返される可能性がある、キーワードベースの検索の限界を浮き彫りにしています。
ここで、ハイブリッド アプローチを使用して同じ検索を実行すると、次のようになります。

- CoverGirl アウトラスト ステイ ルミナス ファンデーション クリーミー ナチュラル (820):説明: CoverGirl アウトラスト ステイ ルミナス ファンデーションは、みずみずしい仕上がりとほのかな輝きを実現するのに最適です。オイルフリーでべたつかない処方で、肌に自然な輝きを与え、一日中持続します。この一日中使えるファンデーションは、完璧なカバー力を提供しながら肌に潤いを与えます。分析:この製品は、乾燥肌のユーザーにとって重要な保湿を重視しているため、関連性があります。「肌に潤いを与える」と「みずみずしい仕上がり」という言葉は、乾燥肌用のファンデーションを探しているユーザーの意図と一致しています。ベクター検索では、水分補給の概念を理解し、それを乾燥肌に対応するファンデーションの必要性に結び付けたと考えられます。
- レブロン カラーステイ メイクアップ (普通肌/乾燥肌用):説明:レブロン カラーステイ メイクアップは、軽い処方で、固まったり、色落ちしたり、擦り落ちたりしない、長持ちするカバー力を提供します。タイムリリーステクノロジーを採用したこのオイルフリーの水分バランスフォーミュラは、普通肌や乾燥肌に継続的に水分を補給するために特別に配合されています。分析:この製品は、普通肌または乾燥肌向けに作られていることを明記しており、乾燥肌のユーザーのニーズに直接応えています。「モイスチャーバランス処方」と継続的な水分補給は、乾燥肌向けのファンデーションを探している人に最適です。ベクター検索では、キーワードの一致だけでなく、水分補給に重点が置かれ、ターゲット層として乾燥肌が具体的に言及されていたため、この結果が正常に取得されました。
- セラム ファンデーション説明:セラム ファンデーションは、軽量で中程度のカバー力を持つフォーミュラで、21 色にわたる幅広い色調が揃っています。これらのファンデーションは、適度なカバー力があり、自然な仕上がりで、非常に軽い美容液のような感触です。粘度は非常に低く、付属のポンプ、または必要に応じて別途購入できるオプションのガラス製スポイトを使用して注入します。分析:この場合、説明では、自然な感触の軽い美容液ファンデーションを強調しています。これは、乾燥肌の人のニーズに合致しています。乾燥肌の方は、優しく、保湿性があり、ケーキ状にならない仕上がりの製品を求めることが多いからです。ベクター検索では、軽量で自然なカバー力と美容液のようなテクスチャーという幅広い文脈が拾われたと思われます。これらは保湿性と快適な使用感に関連し、「乾燥肌」という言葉は明示的には使われていませんが、乾燥肌との関連性が感じられます。
ファセット実装
ファセットは、検索結果を効率的に絞り込み、フィルタリングするために不可欠であり、特に電子商取引などの多種多様な製品を扱うシナリオでは、ユーザーに焦点を絞ったナビゲーションを提供します。ユーザーはカテゴリ、ブランド、価格などの属性に基づいて結果を調整できるため、検索の精度が向上します。この機能を実装するために、インデックス作成段階でkeywordとして定義されたcategoryフィールドとbrandフィールドに対して用語の集計を使用します。
実装の完全なコードはここにあります。
「乾燥肌用ファンデーション」の検索結果を以下に示します。

結果のカスタマイズ: 固定されたクエリ
場合によっては、検索結果で特定の商品を宣伝すると有益なことがあります。このため、特定の商品を結果の上部に表示できるPinned Queriesを使用します。以下では、商品を宣伝せずに「Foundation」という用語を検索します。

この例では、「グルテンフリー」のタグが付いた商品を宣伝できます。製品 ID を使用することで、検索結果で製品が優先されるようになります。具体的には、セラムファンデーション(ID:1043)、カバレッジファンデーション(ID:1042)、リアリスト インビジブルセッティングパウダー(ID:1039)の3商品をプロモーションします。
特定の製品 ID を使用することで、クエリ結果で製品が優先されるようになります。クエリ構造には、上部に「固定」する必要がある製品 ID のリスト (この場合は ID 1043、1042、および 1039) が含まれており、残りの結果は、フィールド「名前」、「カテゴリ」、「説明」のテキスト クエリなどの条件の組み合わせを使用して、検索の自然な流れに従います。この方法により、通常の関連性に基づいて残りの検索を維持しながら、アイテムを制御された方法で宣伝してそれらの可視性を確保することが可能になります。
以下に、プロモーション対象製品を使用したクエリ実行の結果を示します。

完全なクエリ コードはここにあります。
行動分析による検索行動の分析
これまでに、検索結果の関連性を向上させ、製品の発見性を高めるための機能をすでに追加してきました。ここで、ユーザーの検索行動を分析し、結果の有無や検索結果のクリックなどのパターンを識別する機能を追加して、検索ソリューションを完成させます。そのためには、Elastic が提供する行動分析機能を使用します。これにより、わずか数ステップでユーザーの検索行動を監視および分析し、検索エクスペリエンスを最適化するための貴重な洞察を得ることができます。
行動分析コレクションの作成
最初のアクションは、すべての動作分析イベントを受信するコレクションを作成することです。コレクションを作成するには、 「検索」 > 「行動分析」で Kibana インターフェースにアクセスします。以下の例では、 tracking-searchという名前のコレクションを作成しました。

インターフェースに行動分析を統合する
フロントエンドアプリケーションは JavaScript で開発されており、Behavioral Analytics を統合するには、Elastic の公式ドキュメントに記載されている手順に従って、 Behavioral Analytics JavaScript Tracker をインストールします。
JavaScriptトラッカーの実装
ここで、トラッカー クライアントをアプリケーションにインポートし、メソッドtrackPageView 、 trackSearch 、 trackSearchClickを使用してユーザー操作をキャプチャします。
免責事項: 当社はユーザーのインタラクションデータを収集するためにツールを使用していますが、 GDPRへの準拠を確実にするために不可欠です。これは、どのようなデータが収集され、どのように使用されるかをユーザーに明確に通知し、追跡をオプトアウトするオプションを提供することを意味します。さらに、収集した情報を保護し、データへのアクセスや削除などのユーザーの権利を尊重するために、強力なセキュリティ対策を実施し、すべての手順が GDPR の原則に準拠していることを確認する必要があります。
ステップ1: トラッカーインスタンスの作成
まず、インタラクションを監視するトラッカー インスタンスを作成します。この構成では、ターゲット エンドポイント、コレクション名、API キーを定義します。
ステップ2: ページビューのキャプチャ
ページビューを追跡するには、 trackPageViewイベントを設定します。
trackPageViewイベントの詳細については、このドキュメントを参照してください。
ステップ3: 検索クエリのキャプチャ
ユーザーの検索アクションを監視するには、 trackSearchメソッドを使用します。
ここでは検索用語と検索結果を収集しています。
ステップ4: 検索結果のクリックを追跡する
最後に、検索結果のクリックをキャプチャするために、 trackSearchClickメソッドを使用します。
クリックされたドキュメントの ID、検索用語、検索結果に関する情報も収集します。
Kibanaでデータを分析する
ユーザーインタラクションイベントがキャプチャされるようになったので、検索アクションに関する貴重なデータを取得できるようになりました。Kibana は、行動分析ツールを使用して、この行動データを視覚化して分析します。結果を表示するには、 「検索」>「行動分析」>「マイコレクション」に移動するだけで、キャプチャされたイベントの概要が表示されます。

この概要では、インターフェースに統合された各アクションでキャプチャされたイベントの概要を示します。この情報から、ユーザーの検索行動に関する貴重な洞察を得ることができます。ただし、特定のシナリオに関連性の高いメトリクスを使用してカスタマイズされたダッシュボードを作成したい場合、Kibana はダッシュボードを構築するための強力なツールを提供しており、メトリクスのさまざまな視覚化を作成できます。
以下に、時間の経過に伴う最も検索された用語、結果を返さなかったクエリ、最も検索された用語を強調表示するワード クラウド、最後に検索アクセスの発生元を識別する地理的な視覚化などを監視するための視覚化とグラフをいくつか作成しました。

まとめ
この記事では、キーワード検索とベクター検索を組み合わせたハイブリッド検索ソリューションを実装し、ユーザーにとってより正確で関連性の高い結果を提供します。また、ファセットやピン留めされたクエリによる結果のパーソナライズなどの追加機能を使用して、より完全で効率的な検索エクスペリエンスを実現する方法についても検討しました。
さらに、Elastic のBehavioral Analytics を統合して、検索エンジンとのやり取り中のユーザー行動をキャプチャして分析しました。trackPageView 、 trackSearch 、 trackSearchClickなどのメソッドを使用することで、検索クエリ、検索結果のクリック、ページビューを監視し、検索行動に関する貴重な分析情報を生成することができました。
参照資料
データセット
https://www.kaggle.com/datasets/shivd24coder/コスメティックブランド製品データセット
トランス
https://huggingface.co/sentence-transformers/all-MiniLM-L6-v2
相互ランク融合
https://www.elastic.co/guide/en/elasticsearch/reference/current/rrf.html
https://www.elastic.co/guide/en/elasticsearch/reference/current/retriever.html#rrf-retriever
Knnクエリ
https://www.elastic.co/guide/en/elasticsearch/reference/current/knn-search.html
固定されたクエリ
https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-pinned-query.html
行動分析API
https://www.elastic.co/guide/en/elasticsearch/reference/current/behavioral-analytics-apis.html
https://www.elastic.co/guide/en/elasticsearch/reference/current/behavioral-analytics-overview.html




