Azure Cognitive Search での類似性とスコアリング

この記事では、一致する文書化のうち、フル テキスト検索クエリで関連性が最も高いのはどれかを判断する、Azure Cognitive Search によって使用される類似性ランク付けアルゴリズムについて説明します。 また、2 つの関連機能である "スコアリング プロファイル" (特定の一致の関連性を高める条件) と featuresMode パラメーター (検索スコアをアンパックして詳細を示す) についても説明しています。

注意

3 番目のセマンティック再ランク付けアルゴリズムは、現在パブリック プレビュー段階です。 詳細については、セマンティック検索の概要に関するページを参照してください。

類似性ランク付けアルゴリズム

Azure Cognitive Search では、2 つの類似性ランク付けアルゴリズムがサポートされています。

アルゴリズム スコア 可用性
BM25Similarity @search.score 2020 年 7 月 15 日以降に作成されたすべての検索サービスで使われます。
ClassicSimilarity @search.score 2014 年 3 月から 2020 年 7 月 15 日までに作成されたすべての検索サービスで使われます。 既定でクラシックを使用する古いサービスでは、BM25 にオプトインできます。

BM25 とクラシックはいずれも TF-IDF タイプの取得関数です。この関数では、単語の出現頻度 (TF) と逆文書頻度 (IDF) が変数として使用され、ドキュメントとクエリの組みごとに関連スコアが計算されます。ドキュメントとクエリの組みはその後、ランク付けに使用されます。 概念的にはクラシックと似ていますが、BM25 は確率論的情報取得に根ざしており、ユーザーの調査で測定した場合のように、より直感的な一致が生成されます。 BM25 には高度なカスタマイズ オプションもあります。たとえば、ユーザーは、一致した単語の出現頻度で関連性スコアが変動するしくみを決定できます。

次のビデオ セグメントは、Azure Cognitive Search で使用される一般公開ランク付けアルゴリズムの説明に早送りされます。 詳しい背景情報については、ビデオ全編をご覧ください。

関連性のスコアリング

スコアリングとは、フル テキスト検索クエリの検索結果に返されるすべての項目の検索スコアを計算することです。 スコアは、現在のクエリのコンテキストにおける項目の関連性を示すインジケーターです。 スコアが高いほど、項目の関連性が高くなります。 検索結果内の項目は、項目ごとに計算された検索スコアに基づいて、順位の高い順に並べられます。 すべてのドキュメントについて、スコアは "@search.score" という形式の応答で返されます。

既定では、上位 50 個が応答で返されます。しかし、 $top パラメーターを使用すれば、返される項目数を減らしたり増やしたりすることができ (1 回の応答で 1000 個まで)、 $skip を使用すれば、次の結果セットを取得することができます。

検索スコアは、データとクエリの統計プロパティに基づいて計算されます。 Azure Cognitive Search では、検索語句 (searchMode に応じて一部またはすべて) に一致するドキュメントが検索され、検索語句のインスタンスを多く含むドキュメントが優先されます。 データ インデックス全体での語句の出現頻度は低いがドキュメント内ではよく使用されている場合、検索スコアはより高くなります。 関連性を計算するこのアプローチの基礎となる手法は、TF-IDF (単語の出現頻度 - 逆文書頻度) と呼ばれています。

検索スコアの値は、結果セット全体で繰り返すことができます。 同じ検索スコアを持つ項目が複数ヒットした場合、同じスコアを持つ項目の順序付けは定義されていないので安定しません。 クエリを再度実行すると、特に、複数のレプリカで無料のサービスまたは課金対象サービスを使用している場合は、項目の位置が変わる場合があります。 同一スコアの項目が 2 つ存在する場合、最初に表示される項目を特定することはできません。

繰り返しスコアの間の関係を解除したい場合は、 $orderby 句を追加することで、まずスコアで並べ替えを行い、次に別の並べ替え可能なフィールド ($orderby=search.score() desc,Rating desc など) で並べ替えを行うことができます。 詳細については、$orderby に関するページを参照してください。

注意

@search.score = 1 は、スコア付けまたは順位付けが行われていない結果セットを示します。 スコアは、すべての結果にわたって均一です。 スコア付けされていない結果が発生するのは、クエリ フォームがファジー検索、ワイルドカード、または正規表現のクエリである場合、または空の検索である場合 (search=* がフィルターとペアで指定され、一致を返す主な手段がフィルターである場合があります) です。

スコアリング統計とスティッキー セッション

スケーラビリティのために、Azure Cognitive Search ではシャーディング プロセスを介して各インデックスが水平方向に分散されます。つまり、インデックスの各部が物理的に分離されます

既定では、ドキュメントのスコアは、"シャード内" のデータの統計プロパティに基づいて計算されます。 このアプローチは、一般に、データの大規模なコーパスでは問題にならず、すべてのシャードの情報に基づいてスコアを計算する必要がある場合よりもパフォーマンスが向上します。 ただし、このパフォーマンスの最適化を使用すると、2 つの非常に類似したドキュメント (またはまったく同一のドキュメント) は、それぞれが異なるシャードになる場合、関連性スコアが異なる可能性があります。

すべてのシャードの統計プロパティに基づいてスコアを計算する場合、これを行うには、scoringStatistics=globalクエリ パラメーターとして追加します (またはクエリ要求の本文パラメーターとして "scoringStatistics": "global" を追加します)。

POST https://[service name].search.windows.net/indexes/hotels/docs/search?api-version=2020-06-30
{
    "search": "<query string>",
    "scoringStatistics": "global"
}

scoringStatistics を使用すると、同じレプリカのすべてのシャードで同じ結果が得られるようになります。 ただし、レプリカはインデックスの最新の変更で常に更新されるため、それぞれ若干異なる場合があります。 一部のシナリオでは、ユーザーが "クエリ セッション" 中により一貫した結果を得られるようにすることが必要な場合があります。 このようなシナリオでは、クエリの一部として sessionId を指定できます。 sessionId は、一意のユーザー セッションを参照するために作成する一意の文字列です。

POST https://[service name].search.windows.net/indexes/hotels/docs/search?api-version=2020-06-30
{
    "search": "<query string>",
    "sessionId": "<string>"
}

同じ sessionId が使用されていれば、同じレプリカをターゲットにするためにベストエフォートの試行が行われるので、ユーザーに表示される結果の一貫性が向上します。

注意

同じ sessionId 値を繰り返し再利用すると、レプリカ間での要求の負荷分散が妨げられ、検索サービスのパフォーマンスに悪影響を与える可能性があります。 sessionId として使用される値は、'_' 文字で始めることはできません。

スコアリング プロファイル

さまざまなフィールドの順位付け方法をカスタマイズするには、"スコアリング プロファイル" を定義します。 スコアリング プロファイルでは、検索結果の項目の順位付けをより細かく制御できます。 たとえば、収益の可能性に基づいて項目をブーストしたり、より新しい項目を昇格させたり、場合によっては在庫期間が長すぎる項目をブーストしたりできます。

スコアリング プロファイルは、インデックス定義の一部であり、重み付けされたフィールド、関数、およびパラメーターで構成されます。 定義方法の詳細については、「スコアリング プロファイル」を参照してください。

featuresMode パラメーター (プレビュー)

ドキュメントの検索の要求には、フィールド レベルでの関連性に関する追加の詳細情報を提供できる新しい featuresMode パラメーターがあります。 @searchScore はドキュメント全体に対して計算されますが (このクエリのコンテキストにおけるこのドキュメントの関連度)、featuresMode を使用すると、@search.features 構造体で表現された、個々のフィールドに関する情報を取得できます。 この構造体には、クエリで使用されるすべてのフィールド (クエリ内の searchFields を介した特定のフィールド、またはインデックス内で検索可能として属性が付けられているすべてのフィールド) が含まれます。 フィールドごとに、次の値が取得されます。

  • フィールド内で見つかった一意のトークン数
  • 類似性スコア。つまり、クエリ用語に対するフィールド内容の類似度のメジャー
  • 用語の頻度。つまり、フィールド内でクエリ用語が見つかった回数

"Description" および "title" フィールドを対象とするクエリの場合、@search.features を含む応答は次のようになります。

"value": [
 {
    "@search.score": 5.1958685,
    "@search.features": {
        "description": {
            "uniqueTokenMatches": 1.0,
            "similarityScore": 0.29541412,
            "termFrequency" : 2
        },
        "title": {
            "uniqueTokenMatches": 3.0,
            "similarityScore": 1.75451557,
            "termFrequency" : 6
        }

カスタムのスコアリング ソリューションでこれらのデータ ポイントを使用したり、この情報を使用して検索の関連性の問題をデバッグしたりできます。

関連項目