概要
用語の重み機能を使用して、用語の重み付け介入辞書を作成し、クエリ分析に適用して用語の重みを調整できます。これにより、システムに組み込まれている用語の重み辞書に手動で介入できます。介入プロセスは次の 4 つの手順で構成されます。
-
用語の重み付け介入辞書を作成します。
[検索アルゴリズムセンター] > [Retrieval Configuration] > [Dictionary Management]に移動します。[Query Analysis Intervention Dictionaries] ページで、右上の [Create] をクリックします。辞書タイプを選択し、辞書名を入力します。新しい辞書が作成され、辞書リストに表示されます。 -
介入エントリを追加します。辞書を作成した後、リスト内の辞書名または [Manage Entries] をクリックして詳細ページを開きます。このページで、介入エントリを追加および管理できます。アナライザーを選択してクエリを形態素解析します。使用可能なアナライザーには、汎用アナライザー、E コマースアナライザー、IT コンテンツアナライザー、およびこれら 3 つを基にしたカスタムアナライザーがあります。形態素解析後、各用語の重みを調整できます。重みは High、Medium、または Low に設定できます。
-
介入辞書を使用します。 用語の重み付け介入辞書を作成してエントリを追加した後、アプリケーションのクエリルールで選択できます。
-
辞書をテストして公開します。 介入辞書をクエリ分析ルールに適用した後、検索結果をテストして期待どおりであることを確認します。その後、変更を公開します。
有効化ルール
介入データは、次のルールに基づいて有効になります。
-
クエリ全体の完全一致が最優先です。
-
一致する位置が優先されます。
-
同じ開始位置で複数のエントリが一致する場合は、最長一致が優先されます。長さは、形態素解析された用語数で測定されます。各用語の長さは 1 です。最大一致長は 5 用語です。たとえば、クエリ "MySQL database" は "MySQL" と "database" の 2 つの用語に形態素解析されます。長さは 2 です。
-
クエリ分析用に用語の重み付け介入辞書を設定する際に、クエリ内のスペースを無視するかどうかを選択できます。
例
-
介入データは次のとおりです。
-
database permission management -> database:7 | permission:4 | management:1
-
MySQL database -> MySQL:7 | database:1
-
database permission -> database:4 | permission:1
-
MySQL database permission management in linux environment -> linux:7 | environment:1 | in:1 | of:1 | MySQL:7 | database:4 | permission:1 | management:1 (このエントリの一致長は 5 用語の上限を超えています)
-
-
検索クエリ:
-
MySQL database permission management => ルール b が適用されます (位置の優先順位)。
-
sqlserver database permission management => ルール a が適用されます (同じ位置の場合、長さが優先されます)。
-
how to set database permission => ルール c が適用されます (位置の優先順位)。
-
database set permission => 介入ルールは適用されません (一致なし)。
-
MySQL database management permission settings in linux environment => ルール b が適用されます (位置の優先順位)。
-
guide to MySQL database management permission settings in linux environment => ルール b が適用されます。ルール d はこのクエリの一部ですが、形態素解析された用語が 5 つを超えるため一致しません。
-
MySQL database's database permission settings => ルール b とルール c の両方が適用されます。
-
エラーコード
-
クエリリライト中に 2 つのクエリが生成される場合があります。最初のクエリは、重みが 7 と 4 の用語を使用して検索します。2つ目のクエリはリトライ用です。デフォルトでは、最初のクエリで結果が返されない場合にのみ、システムはリトライを実行します。検索範囲を広げるために、リトライクエリでは重みが 7 の用語のみを使用します。
-
エラーコード 6612: term_weight makeup data fail。このエラーは、介入データが有効にならなかったことを示します。
-
現在、用語の重み付け介入エントリの追加は、カスタムモデルアナライザーを使用する専有構成でのみサポートされています。
手順
シナリオ: コンテンツプロバイダーが、OpenSearch のアプリケーションインスタンスで用語の重み機能を使用するクエリ分析ルールを利用しています。オンラインの検索結果に問題があることを発見し、介入機能を使用することにしました。
問題: ユーザーがクエリ data permission management を検索します。リライト後のクエリは default:'permission' RANK default:'data' RANK default:'management' です。しかし、ユーザーは「data」が「permission」よりも関連性が高いことを意図していました。
診断: 組み込みの用語の重み機能がこの問題の原因です。用語の重み付け介入を使用して解決できます。
解決策: 新しい用語の重み付け介入辞書を作成し、オンライン環境で使用されているクエリ分析ルールに適用します。
手順:
-
コンソールで、
[Feature Extensions] > [Dictionary Management]に移動し、用語の重み辞書を作成します。
[Name] を入力し、辞書タイプに [Term Weight] を選択して、[Save] をクリックします。
-
新しい介入辞書で介入エントリを追加します。
queryを入力し、クエリ分析で設定されているタイプに基づいて、アナライザータイプに [System Built-in Analyzer/Custom Analyzer] を選択し、形態素解析された用語の重みを設定します。
[Retrieve] をクリックします。システムは [中国語] アナライザーを使用してクエリを形態素解析します。デフォルトの用語の重みの結果は、data - Medium、permission - High、management - Medium です。ドロップダウンリストを使用して、各用語の重みを High、Medium、または Low に調整できます。
クエリ分析で設定されたインデックスがカスタムモデルアナライザーを使用している場合は、[Analyzer Type] を [Custom Model Analyzer] に設定し、[Instance] を [Ha3 Engine] に設定して、対応する [Application Name] を選択します。選択したアナライザーが、クエリ分析で設定されているものと同一であることを確認してください。
-
クエリ分析の画面で、新しく作成した用語の重み付け介入辞書をテスト環境のクエリ分析ルールに適用し、結果を検証します。
[Ignore Spaces] 機能は、用語の重み付け介入の実行中にクエリ内のスペースを無視するかどうかを決定します。この機能はデフォルトで無効です。例: クエリが "sql database" で、介入エントリが "sqldatabase" の場合、[Yes] を選択すると介入が適用されますが、[No] を選択すると適用されません。
-
検索をテストして、結果が期待どおりであることを確認します。「data」の重みが増加しています:
[Search Test] ページで介入効果を確認します: [os_test] アプリケーションと [Online Application] を選択し、クエリとして
default:データ権限管理を入力し、qp パラメータをqp_1に設定して検索を実行します。実際のクエリは(default:データ RANK default:権限 RANK default:管理)になり、介入後に「データ」に最も高い重みが割り当てられ、先頭にランク付けされていることを示します。
SDK を使用した用語の重み付け介入辞書の作成
Java SDK: Maven 依存関係:
<dependency>
<groupId>com.aliyun</groupId>
<artifactId>aliyun-java-sdk-opensearch</artifactId>
<version>0.7.0</version>
</dependency>
<dependency>
<groupId>com.aliyun</groupId>
<artifactId>aliyun-java-sdk-core</artifactId>
<version>4.5.0</version>
</dependency>
Java SDK デモ:
public class TestTermWeightingInQueryProcessor {
private static DefaultAcsClient client;
public static void main(String[] args) throws Exception {
String regionId = "cn-hangzhou"; // リージョン ID。
IClientProfile profile = DefaultProfile.getProfile(regionId, "{ak}", "{secret}");
DefaultProfile.addEndpoint(regionId, regionId, "Opensearch", "opensearch." + regionId + ".aliyuncs.com");
DefaultAcsClient client = new DefaultAcsClient(profile);
String dictionaryName = "dictionary_qp_name"; // 作成する辞書およびクエリプロセッサの名前。
String appName = "app_name"; // 使用するアプリケーションの名前。
int versionId = 1234; // アプリケーションのバージョン ID。
// System.out.println("List intervention dictionaries");
// listInterventionDictionaries();
Thread.sleep(10000);
System.out.println("Create intervention dictionary: " + dictionaryName);
createDictionary(dictionaryName);
//
// Thread.sleep(10000);
// System.out.println("Describe intervention dictionary");
// describeInterventionDictionary(dictionaryName);
//
// Thread.sleep(10000);
// System.out.println("List intervention dictionary entries before");
// listEntries(dictionaryName);
Thread.sleep(10000);
System.out.println("Post dictionary entries added");
postEntries(dictionaryName, "add");
Thread.sleep(10000);
System.out.println("List intervention dictionary entries after add");
listEntries(dictionaryName);
Thread.sleep(10000);
System.out.print("Set intervention dictionary to qp");
setQueryProcessor(appName, versionId, dictionaryName);
// 注意して使用してください。検索テストページで期待どおりであることを確認した後にのみ、現在のクエリプロセッサをデフォルトとして設定してください。
Thread.sleep(10000);
System.out.println("Set default query processor");
setDefaultQueryProcessor(appName, versionId, dictionaryName);
// Thread.sleep(10000);
// System.out.println("Delete dictionary");
// deleteDictionary(dictionaryName);
}
public static void listInterventionDictionaries() throws ClientException {
ListInterventionDictionariesRequest listInterventionDictionariesRequest = new ListInterventionDictionariesRequest();
listInterventionDictionariesRequest.setPageSize(50);
HttpResponse response = client.doAction(listInterventionDictionariesRequest);
System.out.println(response.getHttpContentString());
}
public static void createDictionary(String dictionaryName) throws UnsupportedEncodingException, ClientException {
CreateInterventionDictionaryRequest request = new CreateInterventionDictionaryRequest();
String body = "{\"name\": \"" + dictionaryName + "\", \"type\": \"term_weighting\"}";
request.setHttpContent(body.getBytes("UTF-8"), "UTF-8", FormatType.JSON);
HttpResponse response = client.doAction(request);
System.out.println(response.getHttpContentString());
}
public static void describeInterventionDictionary(String dictionaryName) throws ClientException {
DescribeInterventionDictionaryRequest request = new DescribeInterventionDictionaryRequest();
request.setName(dictionaryName);
HttpResponse response = client.doAction(request);
System.out.println(response.getHttpContentString());
}
public static void listEntries(String dictionaryName) throws ClientException {
ListInterventionDictionaryEntriesRequest request = new ListInterventionDictionaryEntriesRequest();
request.setName(dictionaryName);
HttpResponse response = client.doAction(request);
System.out.println(response.getHttpContentString());
}
public static void postEntries(String dictionaryName, String cmd) throws UnsupportedEncodingException, ClientException {
PushInterventionDictionaryEntriesRequest request = new PushInterventionDictionaryEntriesRequest();
request.setName(dictionaryName);
// 介入エントリデータを変更します。High、Medium、Low の重みはそれぞれ 7、4、1 です。
String body = "[{\n" +
" \"word\": \"data permission management\",\n" +
" \"cmd\": \"" + cmd + "\",\n" +
" \"tokens\": [\n" +
" {\n" +
" \"token\": \"data\",\n" +
" \"weight\": 7\n" +
" },\n" +
" {\n" +
" \"token\": \"permission\",\n" +
" \"weight\": 4\n" +
" },\n" +
" {\n" +
" \"token\": \"management\",\n" +
" \"weight\": 1\n" +
" }\n" +
" ]\n" +
"}]";
request.setHttpContent(body.getBytes("UTF-8"), "UTF-8", FormatType.JSON);
HttpResponse response = client.doAction(request);
System.out.println(response.getHttpContentString());
}
public static void deleteDictionary(String dictionaryName) throws ClientException {
RemoveInterventionDictionaryRequest request = new RemoveInterventionDictionaryRequest();
request.setName(dictionaryName);
HttpResponse response = client.doAction(request);
System.out.println(response.getHttpContentString());
}
public static void setQueryProcessor(String appName, int versionId, String dictionaryName) throws UnsupportedEncodingException, ClientException {
CreateQueryProcessorRequest request = new CreateQueryProcessorRequest();
request.setAppGroupIdentity(appName);
request.setAppId(versionId);
String body = "{\"name\":\""+ dictionaryName +"\",\"domain\":\"GENERAL\",\"indexes\":[\"default\"],\"processors\":[{\"name\":\"term_weighting\",\"useSystemDictionary\":true, \"interventionDictionary\":\""+dictionaryName+"\"}]}";
request.setHttpContent(body.getBytes("UTF-8"), "UTF-8", FormatType.JSON);
HttpResponse response = client.doAction(request);
System.out.println(response.getHttpContentString());
}
public static void setDefaultQueryProcessor(String appName, int versionId, String dictionaryName) throws UnsupportedEncodingException, ClientException {
ModifyQueryProcessorRequest request = new ModifyQueryProcessorRequest();
request.setAppGroupIdentity(appName);
request.setAppId(versionId);
request.setName(dictionaryName);
String body = "{\"active\":true}";
request.setHttpContent(body.getBytes("UTF-8"), "UTF-8", FormatType.JSON);
HttpResponse response = client.doAction(request);
System.out.println(response.getHttpContentString());
}
public static void deleteQueryProcessor(String appName, int versionId, String dictionaryName) throws ClientException {
RemoveQueryProcessorRequest request = new RemoveQueryProcessorRequest();
request.setAppGroupIdentity(appName);
request.setAppId(versionId);
request.setName(dictionaryName);
HttpResponse response = client.doAction(request);
System.out.println(response.getHttpContentString());
}
public static void listQueryProcessors(String appName, int versionId) throws ClientException {
ListQueryProcessorsRequest request = new ListQueryProcessorsRequest();
request.setAppGroupIdentity(appName);
request.setAppId(versionId);
HttpResponse response = client.doAction(listQueryProcessorsRequest);
System.out.println(response.getHttpContentString());
}
}
データ構造の詳細については、「InterventionDictionaryEntry」をご参照ください。
QueryProcessor のボディの詳細については、「QueryProcessor」をご参照ください。
制限
-
最大 20 個の用語の重み付け介入辞書を作成できます。
-
各用語の重み付け介入辞書には、最大 500 件の介入エントリを含めることができます。
-
クエリに英単語が含まれる場合は、すべて小文字を使用する必要があります。
-
介入エントリ内のクエリは、最大 30 個の用語に形態素解析できます。