互換性
この関数は、フィルター、ソート、および数式で使用できます。
関数のパラメーターとして使用するドキュメントフィールドは、属性として作成する必要があります。
tag_match: スコアリング用のタグマッチング
1. 概要
tag_match 関数は、多くのクエリとドキュメントのマッチング要件に対応します。この関数は、検索結果のパーソナライズに特に役立ちます。たとえば、ユーザーがお気に入りに登録したストアを優先的に表示したり、ユーザーが好むスポーツやエンターテインメントのニュースを表示したりできます。tag_match の基本的な機能は、ドキュメントの配列フィールドに一連のキーと値のペアを格納することです。次に、kvpairs 句を通じてクエリに対応するキーと値の情報を渡すことができます。tag_match 関数は、クエリで指定されたキーをドキュメント内で検索し、一致した各キーのスコアを計算してから、これらのスコアを最終的なスコアに統合します。この結果は、スコアリングと重み付け、またはフィルタリングに使用できます。
計算プロセスは次のとおりです。
2. 使用法
基本構文:
tag_match(query_key, doc_field, kv_op, merge_op)
詳細構文:
tag_match(query_key, doc_field, kv_op, merge_op, has_default, doc_kv, max_kv_count)
3. パラメーター
query_key: マッチングに使用するクエリのキーと値のペアを指定します。これらのペアは、kvpairs 句を通じて渡されます。キーと値は等号 (=) で区切られ、複数のキーと値のペアはコロン (:) で区切られます。たとえば、
kvpairs=query_tags:10=0.67:960=0.85:1=48は、query_tagsパラメーターに 3 つの要素 (10、960、1) とそれに対応する値 (0.67、0.85、48) が含まれていることを示します。クエリには、kvpairs=cats:10:960:1のように、キーのリストのみを含めることもできます。doc_field: キーと値のペアを格納するドキュメント内のフィールドを指定します。このフィールドは、整数配列 (
int_array) または浮動小数点配列 (float_array、double_array) である必要があります。浮動小数点配列を使用する場合、キー値はマッチングのためにint64にキャストされます。配列は、キーと値を交互に格納します:[key0, value0, key1, value1, ...]。キーは偶数インデックス (0、2 など) にあり、対応する値は後続の奇数インデックスにあります。kv_op: クエリとドキュメントのキーが一致したときに、それらの値に対して実行される操作です。サポートされている演算子には、
max(最大値)、min(最小値)、sum(合計)、avg(平均)、mul(積)、query_value(クエリキーの値を使用)、doc_value(ドキュメントの値を使用)、およびnumber(指定された定数) があります。merge_op: 複数のキーマッチの結果を統合します。サポートされている演算子には、
max(最大値)、min(最小値)、sum(合計)、avg(平均)、およびfirst_match(最初のkv_op計算の結果を使用し、残りを無視) があります。has_default: 初期スコアを使用するかどうかを指定するブール値です。既定値は
falseです。trueに設定すると、doc_fieldの最初の値がデフォルト値として扱われ、ベーススコアと同様に機能します。構造は[init_score, k0, v0, k1, v1, ...]になります。doc_kv:
doc_fieldの構造を指定するブール値です。既定値はtrueで、フィールドにキーと値のペアが含まれていることを意味します。falseに設定すると、フィールドにはキーのみが含まれます。max_kv_count: クエリで渡すことができるキーと値のペアの最大数です。既定値は 50 です。この制限を増やすことができますが、512 を超えることはできません。
4. 戻り値
最終的なスコアを表す double 値を返します。has_default が false で、一致するものが見つからない場合は、0 を返します。int64 の結果を返すには、int_tag_match 関数を使用します。int_tag_match 関数は、tag_match と機能的に同一ですが、ランキング式では使用できません。
5. ユースケース
シナリオ 1: 大規模なオンラインフォーラムでは、投稿にさまざまなタグ (コメディ、スポーツ、ニュース、音楽、科学など) を割り当てることができます。ドキュメントを OpenSearch に送信するときに、各タグにタグ ID を割り当て (たとえば、コメディ: 1、スポーツ: 5、ニュース: 3、音楽: 6)、これらのタグを tag フィールドに格納できます。投稿を前処理する場合は、各タグの重みを決定することもできます。たとえば、面白いスポーツニュースに関する投稿には、コメディの重みが 0.5、スポーツの重みが 0.5、ニュースの重みが 0.1 になる場合があります。この投稿の tag フィールドは [1, 0.5, 5, 0.5, 3, 0.1] になります。登録ユーザーの場合、時間の経過とともに興味のあるタグを学習できます。
たとえば、nba_fans という名前のユーザーは、スポーツとコメディに興味があり、対応する重みはそれぞれ 0.6 と 0.3 です。このユーザーがクエリを実行するときに、kvpairs 句を使用してこの情報をクエリに追加できます。kvpairs 句の名前が user_tag の場合、nba_fans の値は 5=0.6:1=0.3 になります。詳細ランキング式で tag_match(user_tag, tag, mul, sum) を設定することで、ユーザーの興味に一致する投稿をブーストし、より高くランク付けできます。
kv_op パラメーターを mul に設定すると、関数はクエリとドキュメントの値を乗算します。個々のスコアは次のように計算されます: スポーツ (0.5 * 0.6 = 0.3) とコメディ (0.5 * 0.3 = 0.15)。merge_op パラメーターを sum に設定すると、関数はスポーツとコメディのスコアを加算します (0.3 + 0.15 = 0.45)。この合計スコアは、最終的なランキングスコアに追加されます。このようにして、ユーザーの興味に基づいて投稿にスコアリングと重み付けを適用できます。
シナリオ 2:
製品には、複数の属性タグを設定できます。たとえば、1 は「若年層」 (年齢)、2 は「中年層」 (年齢)、3 は「ミニマリスト」 (スタイル)、4 は「ファッショナブル」 (スタイル)、5 は「女性」 (性別)、6 は「男性」 (性別) を表します。
製品のタグを重み付けせずにマークするだけの場合は、これらのタグを options フィールドに格納できます。たとえば、若い女性向けのファッショナブルな衣料品の options フィールドは [1, 4, 5] になります。この配列には、タグキーのみが含まれ、値は含まれていないことに注意してください。ユーザーにも、製品タグに対応する独自の属性タグがあります。たとえば、ミニマリストの服をよく購入する若い女性ユーザーのクエリは user_options=1:3:5 のようになります。この kvpairs 句にもタグキーのみが含まれていることに注意してください。
ユーザーのタグ設定に一致する製品をブーストするには、数式で tag_match(user_options, options, 10, sum, false, false) を使用できます。ここで、user_options と options は、それぞれクエリとドキュメントのタグ情報を指定します。kv_op は定数値 10 に設定され、一致する各タグに 10 のスコアが割り当てられます。has_default パラメーターは false です。これは、初期値が不要なためです。doc_kv パラメーターは false で、ドキュメントフィールドにはキーのみが格納されていることを示します。
若い女性ユーザーが上記の衣料品をクエリすると、「若年層」と「女性」のタグが一致します。各一致のスコアは 10 です。sum を merge_op として使用すると、この製品の最終的なブーストスコアは 20 になります。この方法により、タグの重み情報がない場合でも、一致したドキュメントにスコアリングと重み付けを適用できます。
注意事項
関数のパラメーターとして使用するフィールドは、属性として作成する必要があります。
filterまたはsort句でtag_matchを使用する場合は、query_key、kv_op、merge_op、has_default、およびdoc_kvパラメーターを二重引用符で囲みます。たとえば、sort=-tag_match("user_options", options, "mul", "sum", "false", "true", 100)のようにします。tag_match関数は、整数比較を使用してキーを照合します。したがって、クエリとドキュメントの両方のキーは整数である必要があります。キーが浮動小数点数の場合、tag_matchは比較のために整数にキャストします。
例
ドキュメントには、次の 10 種類のタグを設定できると仮定します:
1 - 金融
2 - テクノロジー
3 - スポーツ
4 - エンターテインメント
5 - ファッション
6 - 教育
7 - 旅行
8 - ゲーム
9 - 科学普及
10 - ヘルスケア例 1: 同じキーワード、異なるタグ
上の図に示すように、「バトルロワイヤル」を検索すると、2 つのドキュメントが返されます。ただし、ドキュメントのタイプは異なります: 1 - 金融 と 8 - ゲーム。「ゲーム」タグを持つドキュメントを最初に表示する場合は、tag_match 関数を設定できます。次のセクションでは、この関数をランキング式とsort 句で設定する方法を示します。
kvpairs: type:8
ランキング式: tag_match(type, type_arr, 10, max,false,false)
sort 句: tag_match("type", type_arr, 10, "max","false","false")ランキング式を使用した結果:
sort 句を使用した結果:
例 2: 複数のタグの統合スコア (ユーザーのパーソナライゼーション)
画像に示すように、プライマリタグが同じ場合、セカンダリタグのスコアを照合する必要があります。次の例は、ランキング式とsort 句で設定する方法を示しています:
kvpairs: type:3=2:10=1
ランキング式: tag_match(type, type_arr, 10, sum,false,true)
sort 句: tag_match("type", type_arr, 10, "sum","false","true")
例 3: 同じタイプの複数のタグと異なるスコア
画像に示すように、赤色で強調表示されたコンテンツには同じタグがありますが、各タグのスコアは異なります。次の例は、ランキング式とsort 句で設定する方法を示しています:
kvpairs: type:3=2:9=2
ランキング式: tag_match(type, type_arr, sum, sum,false,true)
sort 句: tag_match("type", type_arr, "sum", "sum","false","true")
Java SDK の例: Java SDK Search Demo