検索候補は OpenSearch の基本的な機能です。ユーザーが入力するにつれて、候補クエリを推奨することで入力効率を向上させ、ユーザーが関連コンテンツをより速く見つけられるように支援します。
概要
検索候補機能は、ドキュメントのコンテンツからクエリを抽出します。前方一致マッチング、ピンイン完全一致、ピンイン頭文字、漢字とピンインの混合、形態素解析後のプレフィックス、同音異義語など、中国語のさまざまなマッチング方法に基づいて候補クエリを生成できます。
例えば、次のようにロングドレスを検索できます。
-
中国語のプレフィックス:
连, 连衣, … -
ピンインのプレフィックス (完全一致):
l, li, lian, lianyi, lianyiqun, … -
ピンインのプレフィックス (頭文字):
l, ly, lyq, … -
漢字 + ピンイン:
连yi, 连衣qun, … -
形態素解析後のプレフィックス:
long style, long style dress, dress long, … -
中国語の同音異義語および類似音の誤字:
连衣群, 联谊群, …
手動介入を使用して、検索候補の結果に影響を与えることもできます。検索候補の主要なパフォーマンスメトリクスを表示するには、「検索候補レポート」をご参照ください。
データソース
検索候補は、アプリケーションドキュメントとエンドユーザーのクエリからのデータを使用します。ドキュメントとクエリの両方にフィルターを適用できます。
ドキュメントからの候補クエリ
各検索候補モデルのデータソースとして、アプリケーションから最大 3 つのフィールドを選択できます。処理中、システムはドキュメントのサンプル (最大 100 万件) を選択し、指定されたルールに従って選択されたフィールドを処理して候補クエリを生成します。その後、システムはそれらのサブセットを最終的な検索候補として保持します。「元の値から抽出」と「元の値を保持」の 2 つの生成ルールがサポートされています。
-
元の値から抽出:このメソッドは、膨大な量の自然言語データでトレーニングされた Alibaba 独自の NLP アナライザを使用します。フィールドのコンテンツに形態素解析を適用し、意味のある term を抽出し、それらを組み合わせて候補クエリを形成します。このアプローチにより、生成された検索候補が対応するドキュメントを取得できることが保証されます。
-
元の値を保持:このメソッドは、形態素解析を行わずに、フィールドの生のコンテンツを候補クエリとして使用します。コンテンツが 30 文字を超える場合は、最初の 30 文字に切り捨てられます。このメソッドは、店舗名、ユーザー名、曲名など、形態素解析を必要としないフィールド、または事前に生成された独自の候補クエリを提供する場合に適しています。このメソッドには、短く明確なコンテンツを持つフィールドを使用することを推奨します。
ユーザーのクエリからの候補クエリ
システムは、過去 N 日間 (デフォルトは 7) のユーザー検索履歴を分析し、検索頻度、平均結果数、履歴用語の重み、最近のクエリ成功率などのメトリックを考慮します。この分析に基づいて、代表的なクエリを候補として選択します。
履歴検索クエリ機能:履歴検索クエリのオプションを有効にして、現在のユーザーの過去のクエリに基づいて検索候補の優先順位を付けることもできます。これには、リクエストで raw_query および user_id パラメーターを渡す必要があります。履歴検索クエリ機能は拡張機能であり、各トレーニングジョブが消費するコンピューティング時間に基づいてトレーニング料金が発生します。
エンドユーザーのクエリデータソースを無効にするには、biz_type=not_exist のように、決して満たされることのないクエリフィルター条件を設定します。
履歴検索クエリ機能を有効にした後、パーソナライズされた結果を配信するために、検索候補リクエストに user_id パラメーターを含める必要があります。
履歴検索クエリは各ユーザーに固有です。システムは user_id パラメーターを使用してユーザーを区別します。例えば、ユーザー A が最近「dishwasher」を検索した場合、「dishwasher」が再び検索候補として表示されることがあります。しかし、それを検索したことのないユーザー B の検索候補には、その term は表示されません。
手動介入
次の方法で、検索候補に手動で影響を与えることができます:
-
ブラックリストとホワイトリストを使用して候補クエリを管理します。
-
ソースアプリケーションドキュメントにフィルター条件を設定します。フィルターを適用すると、システムは条件に一致するドキュメントのみを使用して候補クエリを生成します。
|
パラメーター |
説明 |
|
フィルター条件 |
OpenSearch アプリケーションスキーマのフィールドに基づいてフィルター条件を指定します。フィルターは、アプリケーション内のすべてのドキュメントに適用されます。注:
例:フィルター条件を |
コンソールの [検索候補モデルの作成] ページで、次の設定を構成できます:
-
対象アプリケーション:候補のソースデータを含むアプリケーションを選択します。
-
モデル名:1〜30 文字の名前を入力します。文字で始まり、大文字、小文字、数字、アンダースコア (_) を含めることができます。名前は、すべてのモデルで一意である必要があります。
-
トレーニングフィールド:対象アプリケーションからソースフィールドを選択し、各フィールドの処理メソッド (元の値から抽出または元の値を保持) を指定します。
-
履歴検索クエリ:トグルを使用して、履歴検索クエリ機能を有効または無効にします。
-
ドキュメントフィルター条件とクエリフィルター条件:これらは、それぞれアプリケーションドキュメントのデータソースとエンドユーザーのクエリデータソースに適用されるフィルター条件です (例:
status=1またはbiz_type=phone)。構文ルールについては、上記のフィルター条件の説明をご参照ください。
検索候補結果の制御
ブラックリスト:ブラックリストは部分一致マッチングをサポートします。ブラックリストに登録されたキーワードを含むクエリは、検索候補の結果から除外されます。望ましくない検索候補が表示された場合は、関連するキーワードをブラックリストに追加してブロックします。
ホワイトリスト:ホワイトリスト内のクエリが推奨基準を満たす場合、検索候補の結果で優先されます。高品質のクエリが表示されない、またはランクが低すぎる場合は、ホワイトリストに追加して表示を促進します。**ブラックリストとホワイトリストの設定方法の詳細については、こちらをクリックしてください。
-
標準版アプリケーションは検索候補をサポートしていません。この機能は高級版アプリケーションでのみ利用可能です。
-
アプリケーションごとに最大 10 個の検索候補モデルを作成できます。
-
モデル名はアカウント内で一意である必要があります。これには、検索候補、人気度モデル、カテゴリ予測モデル、トレンドモデル、ヒントワードモデルが含まれます。
-
TEXT、SHORT_TEXT、LITERAL、または INT 型のインデックスフィールドのみが、検索候補のデータソースとして使用できます。
-
1 つのモデルに対して最大 3 つのトレーニングフィールドを選択できます。
-
アプリケーションスキーマを変更する際、検索候補モデルが使用するフィールドは変更できません。
-
検索候補モデルをトレーニングするには、アプリケーションテーブル (
raw_queryと保存データを含む) に 1,000 件以上のエントリが含まれている必要があります。そうでない場合、データ不足によりモデルトレーニングが失敗する可能性があります。 -
アプリケーションを削除すると、関連する検索候補モデルも削除されます。
-
検索候補の検索では、
queryパラメーターは UTF-8 エンコーディングで最大 30 バイト (最大 10 文字の漢字) の長さをサポートします。制限を超えると、システムはエラーを報告し、結果を返しません。 -
検索候補の検索では、
hitパラメーターは 1 から 30 までの整数 (両端を含む) である必要があります。この範囲外の値 (0、-1、31 など) を指定した場合、システムはデフォルト値の 30 を使用し、エラーメッセージを返します。 -
ブラックリストには最大 500 個のキーワードを含めることができます。
-
ホワイトリストには最大 500 個のクエリを含めることができます。
-
ブラックリストとホワイトリストの間に競合がある場合、ブラックリストが優先されます。
-
ブラックリストとホワイトリストへの変更はリアルタイムで有効になります。
-
検索候補モデルが作成されると、デフォルトでスケジュールされた日次トレーニングが有効になります。検索候補データは、各トレーニングサイクルで定期的に更新されます。
-
検索候補モデルのトレーニング時間は、データ量とシステムの負荷によって異なります。トレーニングに 30 分以上かかる場合は、お問い合わせください。
-
中国語の同音異義語マッチング機能はデフォルトで有効になっています。リクエストにパラメーター
re_search="disable"を追加することで無効にできます。 -
基本的な検索候補機能は現在無料です。コンピューティングリソースとストレージリソースはシステムによって割り当てられます。各モデルには、約 100 QPS のコンピューティングリソースと、約 200 万件の候補クエリ用のストレージが割り当てられます。
-
検索リクエストに
raw_queryパラメーターを設定して、システムがユーザーによって入力された元のクエリを識別できるようにします。詳細については、「検索処理ドキュメント」をご参照ください。 -
履歴検索クエリ機能を有効にすると、消費されたコンピューティング時間に基づいて各トレーニングジョブに対して課金されます。詳細については、「課金の概要」をご参照ください。
-
raw_query、user_id、および from_request_id パラメーターの詳細については、こちらをクリックしてください。
-
デフォルトで高頻度検索クエリ機能を有効にするには、検索リクエストに raw_query パラメーターを含めるか、query 句にデフォルトインデックスを含める必要があります。
-
独立した raw_query:トレーニングのプロモーションに必要な
raw_queryパラメーターは、結果を返す一意のクエリである必要があります。 -
検索候補モデルのトレーニングデータは毎日 (T+1) 更新されます。特定日にアップロードされたデータは、翌日のトレーニングが完了した後に有効になります。
ベストプラクティス
-
検索候補の効果 (検索候補による検索やクリックスルー率など) を向上させるには、検索候補リクエストを検索リクエストに関連付けます。手順については、このトピックの最後にある「検索候補リクエストと検索リクエストの関連付け」セクションをご参照ください。
-
ドキュメントの主要なトピックに関連する、簡潔なコンテンツを持つフィールドを選択します。
-
ニーズに応じて、「元の値から抽出」と「元の値を保持」のルールを適切に使用します。
-
レスポンスでは、
suggestionsには検索結果が含まれ、errorsはエラーが発生したかどうかを示します。errorsフィールドが空でないからといって、必ずしもsuggestionsフィールドが空であるとは限りません。したがって、レスポンスを解析する際には、suggestionsが空かどうかを確認して、データを表示するかどうかを判断します。
操作手順
1. コンソールで、[検索アルゴリズムセンター] > [検索ガイダンス] > [検索候補] に移動し、[作成] をクリックします。
2. [モデル名] を入力し、[トレーニングフィールド] と抽出方法を選択し、[履歴検索クエリ] を有効にし (任意)、[フィルター条件] を入力して (任意)、[送信] をクリックします。
3. [検索候補] リストページで、作成したモデルを見つけ、[トレーニング] をクリックしてトレーニングを開始します。

4. トレーニングを開始した後、プロセスが完了するまでに通常 20〜30 分かかります。
5. モデルがトレーニングされた後、検索候補をテストできます。次の図は、「元の値から抽出」と「元の値を保持」メソッドの結果を示しています。
元の値を保持:
元の値から抽出:
6. オンラインで候補クエリを照会するには、以下のデモをご参照ください。詳細な API 情報については、「検索候補開発ガイド」をご参照ください。
UI リファレンス
検索候補リストページ
OpenSearch コンソールで、[検索アルゴリズムセンター] > [検索ガイダンス] > [検索候補] に移動してリストページにアクセスします (下図参照)。
リストページには、各検索候補モデルの情報が表示されます。これには、[モデル名]、[作成時刻]、[ステータス]、および [最新バージョンのステータス] (トレーニング待ち、トレーニング中、トレーニング済みで合格、またはデータ異常) が含まれます。[操作] 列では、モデルの詳細の表示、トレーニング、または削除ができます。
検索候補モデル詳細ページ
[基本情報] セクションには、モデルの作成時刻、ステータス、最終トレーニング開始時刻、および最新バージョンのステータスが表示されます。ステータスが [データ異常] の場合、例外レポートへのリンクが表示されます。
[設定情報] セクションには、設定されたトレーニングフィールド、フィルター条件、ブラックリスト/ホワイトリスト、およびスケジュールされたトレーニングと履歴検索クエリのステータスが表示されます。
[データ検証] セクションには、モデルトレーニングのためのデータの完全性と整合性のレベルが表示されます。
[トレーニング履歴] セクションには、モデルのトレーニングレコードが表示されます。
コアメトリックデータ
さまざまな時間範囲を選択して、検索候補モデルのコアメトリックを表示できます。データはテーブルと折れ線グラフで表示されます。
注:特定のメトリックの定義については、「検索候補レポート」をご参照ください。
SDK デモ
API:
GET v3/openapi/suggestions/{suggestion_name}/actions/search?hit=10&query={your_query}&re_search=homonym&user_id=xxx
Java SDK Maven 依存関係:
<dependency>
<groupId>com.aliyun.opensearch</groupId>
<artifactId>aliyun-sdk-opensearch</artifactId>
<version>4.0.0</version>
</dependency>
関連リンク:「リリースノート」
コードサンプル:
package com.example.opensearch;
import com.aliyun.opensearch.OpenSearchClient;
import com.aliyun.opensearch.SuggestionClient;
import com.aliyun.opensearch.sdk.generated.OpenSearch;
import com.aliyun.opensearch.sdk.generated.commons.OpenSearchClientException;
import com.aliyun.opensearch.sdk.generated.commons.OpenSearchException;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import java.nio.charset.Charset;
public class SuggestDemo {
static private final String accesskey = "YOUR_ACCESSKEY_ID";
static private final String secret = "YOUR_ACCESSKEY_SECRET";
static private final String host = "THE_ENDPOINT_OF_THE_REGION_WHERE_YOUR_APP_IS_LOCATED";
OpenSearch openSearch;
OpenSearchClient openSearchClient;
static private final byte hits = 8; // 返す検索候補の最大数。
static private final String suggestionName = "YOUR_SUGGESTION_MODEL_NAME"; // ご利用の検索候補モデルの名前。
@Before
public void setUp() {
// OpenSearch オブジェクトを初期化します。
openSearch = new OpenSearch(accesskey, secret, host);
openSearchClient = new OpenSearchClient(openSearch);
}
@Test
public void TestEnv() {
// ファイルとデフォルトのエンコード形式を表示します。
System.out.println(String.format("file.encoding: %s", System.getProperty("file.encoding")));
System.out.println(String.format("defaultCharset: %s", Charset.defaultCharset().name()));
// SuggestionClient オブジェクトを作成します。
SuggestionClient suggestionClient = new SuggestionClient("YOUR_APP_NAME", suggestionName, openSearchClient);
String query = "YOUR_SEARCH_QUERY";
try {
SuggestParams suggestParams = new SuggestParams();
suggestParams.setQuery(query); // クエリを設定します。
suggestParams.setHits(10); // 返す検索候補の最大数を設定します。
suggestParams.setUserId("12345678"); // ユーザー ID を設定します。
// 中国語の同音異義語マッチング機能はデフォルトで有効になっています。re_search パラメーターを使用してこれを調整できます。
// この機能を無効にするには、ReSearch.findByValue(1) を使用します。デフォルトでは有効になっています (ReSearch.findByValue(0) またはパラメーターの省略に相当します)。
suggestParams.setReSearch(ReSearch.findByValue(1));
SearchResult result = suggestionClient.execute(suggestParams);
System.out.println(result); // 結果を出力します。
} catch (OpenSearchException e) {
e.printStackTrace();
} catch (OpenSearchClientException e) {
e.printStackTrace();
}
}
@After
public void clean() {
openSearch.clear();
}
}
検索候補 Java SDK の詳細については、「検索候補デモ」をご参照ください。
レスポンス例:
{
"request_id": "159851481919726888064081",
"searchtime": 0.006246,
"suggestions": [
{
"suggestion": "trendy skirts"
},
{
"suggestion": "dresses for petite women"
},
{
"suggestion": "polka dot dresses"
},
{
"suggestion": "youthful skirts"
},
{
"suggestion": "polka dot skirt"
},
{
"suggestion": "skirts for petite women"
},
{
"suggestion": "polka dot skirts for petite women"
}
]
}
注:レスポンスで返される request_id を使用して、検索候補を後続の検索リクエストに関連付けることができます。
検索候補リクエストと検索リクエストの関連付け
検索候補リクエストと検索リクエストを関連付けると、次の利点があります:
-
検索候補が検索パフォーマンスに与える影響を測定するためのメトリックを収集できます。これらのメトリックには、検索候補による検索の PV、クリックスルー率、ゼロ/低結果率が含まれます。詳細については、「検索候補レポート」をご参照ください。
-
関連付けられたリクエストデータは、検索候補のクリックデータなどのインサイトを提供します。これは、検索候補のランキングモデルを最適化し、検索候補による検索の効果を向上させるために使用できます。
関連付け方法:
ユーザーが検索候補を選択して検索を開始した場合、検索リクエストに
from_request_id={from_request_id}パラメーターを含めます。from_request_idパラメーターは、検索のソースを示します。現在のクエリが検索候補、トレンドモデル、ヒントワードモデルなどの推奨リストからのものである場合、その推奨リクエストのrequest_idをこのパラメーターに割り当てることができます。これらのイベントを関連付けることで、上流の機能の主要なメトリックを計算し、その効果を測定し、最適化のためのデータを収集できます。このパラメーターは、「検索処理ドキュメント」でも説明されています。
例:
検索候補 API 呼び出しが 159851481919726888064081 の request_id を返すと仮定します。以下に示すように、それを検索リクエストに関連付けることができます:
SearchParams searchParams = new SearchParams(config);
searchParams.setQuery("title:'skirts for petite women'"); // 検索候補によって誘導されたクエリ。
// from_request_id パラメーターを追加します。
Map<String, String> customParam =new HashMap<>();
customParam.put("from_request_id","159851481919726888064081");
searchParams.setCustomParam(customParam);
// クエリを実行し、SearchResult オブジェクトを返します。
SearchResult execute = searcherClient.execute(searchParams);
// クエリデータを文字列として返します。
String result = execute.getResult();
System.out.println(result);