すべてのプロダクト
Search
ドキュメントセンター

OpenSearch:用語の重み分析のための介入辞書

最終更新日:Dec 28, 2024

概要

用語の重み分析のための介入辞書を作成した後、クエリ分析ルールを作成または変更するときに、介入辞書を指定できます。これにより、用語の重みの分析に介入できます。OpenSearchは、用語の重みを分析するための組み込み辞書を提供します。用語の重み分析に介入するには、次の手順を実行します。

  1. 用語の重み分析のための介入辞書を作成します。介入辞書を作成するには、OpenSearchコンソールにログインします。左側のナビゲーションペインで、検索アルゴリズムセンター > 検索設定を選択します。基本設定ページで、左側のペインにある辞書管理をクリックします。辞書管理ページで、作成をクリックします。クエリ分析辞書の作成パネルで、介入辞書の名前を入力し、辞書の種類を選択して、保存をクリックします。介入辞書が作成されると、辞書リストに表示されます。

  2. 介入辞書に介入エントリを追加および管理します。辞書リストで作成した辞書を見つけ、アクション列のエントリ管理をクリックして、エントリ管理ページに移動します。このページで、必要に応じて介入エントリを追加および管理します。介入エントリに検索クエリを指定し、検索クエリを用語にセグメント化するためのアナライザーを選択できます。サポートされているアナライザーには、一般的なアナライザー、Eコマースアナライザー、ITコンテンツアナライザー、およびこれらのアナライザータイプのいずれかをベースに開発されたカスタムアナライザーが含まれます。次に、各用語に高、中、または低の優先レベルを指定できます。

  3. 介入辞書を使用します。介入辞書に介入エントリを追加した後、必要に応じて、アプリケーションのクエリ分析ルールに介入辞書を関連付けることができます。

  4. 介入辞書をテストおよび公開します。介入辞書がクエリ分析ルールに関連付けられた後、ルールをオンライン環境に適用する前に検索テストを実行することをお勧めします。これにより、期待される検索パフォーマンスが確保されます。

介入ルール

介入検索クエリは、次のルールに基づいて実際の検索クエリに介入するために使用されます。

  1. ルール1:実際の検索クエリが介入検索クエリと完全または部分的に一致する場合、この介入エントリは他の介入エントリよりも優先されます。実際の検索クエリが介入検索クエリと部分的に一致する場合、一致する用語の数は5を超えることはできません。

  2. ルール2:介入検索クエリの用語が実際の検索クエリの先頭に近い用語と一致する場合、この介入検索クエリは優先順位が高くなります。

  3. ルール3:2つの介入検索クエリの1つ以上の用語が実際の検索クエリの同じ用語と一致する場合、実際の検索クエリの用語と一致する用語が多い介入検索クエリが優先されます。最大5つの一致する用語がサポートされています。たとえば、検索クエリ「mysqldatabase」には、「mysql」と「database」の2つの用語が含まれています。

  4. ルール4:用語の重み分析のための介入辞書をクエリ分析ルールに関連付けるときに、検索クエリでスペースを無視するかどうかを指定できます。

  • 介入検索クエリの例:

    1. データベース権限管理:この検索クエリは、データベース、権限、管理の3つの用語にセグメント化できます。3つの用語の重みは、順番に7、4、1です。

    2. MySQLデータベース:この検索クエリは、MySQLとデータベースの2つの用語にセグメント化できます。2つの用語の重みは、順番に7と1です。

    3. データベース権限:この検索クエリは、データベースと権限の2つの用語にセグメント化できます。2つの用語の重みは、順番に4と1です。

    4. Linux環境でのMySQLデータベース権限管理:この検索クエリは、MySQL、データベース、権限、管理、in、the、Linux、環境の8つの用語にセグメント化できます。8つの用語の重みは、7、4、1、1、1、1、7、1です。この検索クエリの用語の数は5を超えています。

  • 実際の検索クエリ:

    • MySQLデータベース権限管理:ルール2に基づいて、介入検索クエリ「MySQLデータベース」が有効になります。

    • SQL Serverデータベース権限管理:ルール3に基づいて、介入検索クエリ「データベース権限管理」が有効になります。

    • データベース権限設定:ルール2に基づいて、介入検索クエリ「データベース権限」が有効になります。

    • データベース権限の設定:一致する介入検索クエリはありません。

    • Linux環境でのMySQLデータベース権限管理:ルール1に基づいて、介入検索クエリ「Linux環境でのMySQLデータベース権限管理」が有効になります。

    • Linux環境でのMySQLデータベース権限管理に関する説明:この実際の検索クエリは、介入検索クエリ「Linux環境でのMySQLデータベース権限管理」と部分的に一致します。ただし、分析後の一致する用語の数は5を超えています。その結果、介入検索クエリは有効になりません。

    • MySQLデータベース権限設定:介入検索クエリ「MySQLデータベース」と「データベース権限」が有効になります。

重要

  • OpenSearchが検索クエリに介入すると、検索クエリは2つのバージョンに変更される場合があります。最初のバージョンは、重みが7または4の用語に基づいてドキュメントを取得するために使用されます。2番目のバージョンは、再検索に使用されます。デフォルトでは、最初のバージョンを使用して検索結果が返されない場合にのみ、再検索が必要になります。取得されるドキュメントの数を増やすために、再検索は2番目のバージョンの重みが7の用語のみに基づいて実行されます。

  • エラーコード6612:term_weight makeup data fail。このエラーは、有効な介入検索クエリがないことを示します。

  • 用語の重み分析のための介入辞書に介入エントリを追加するときに、専用のアプリケーション用に調整されたモデルアナライザーを設定できます。

シナリオ:EコマースショッピングガイドサービスのOpenSearchアプリケーション用に、用語の重み分析機能を備えたクエリ分析ルールを作成しました。これらのルールをオンラインアプリケーションに適用した後、返される検索結果は満足のいくものではありませんでした。この問題を解決するために、用語の重み分析への介入が実装されています。

問題の説明:ユーザーが検索クエリdata permission managementを入力します。用語の重み分析の後、クエリ句はdefault:'permission' RANK default:'data' RANK default:'management'に書き換えられます。ただし、ユーザーは検索クエリで「permission」ではなく「data」をヒットさせたいと考えています。

原因:用語の重み分析用の組み込み辞書が要件を満たしていません。

解決策:用語の重み分析のための介入辞書を作成し、その介入辞書をオンラインアプリケーションのクエリ分析ルールに関連付けます。

手順

  1. OpenSearchコンソールにログインします。左側のナビゲーションペインで、検索アルゴリズムセンター > 検索設定を選択します。基本設定ページで、左側のペインにある辞書管理をクリックします。辞書管理ページで、作成をクリックします。

image

クエリ分析辞書の作成パネルで、介入辞書の名前を入力し、辞書の種類パラメーターを用語の重みに設定します。

image

  1. 作成した介入辞書を見つけ、アクション列のエントリ管理をクリックします。表示されるページで、介入エントリの追加をクリックします。介入エントリの追加パネルで、検索クエリを入力し、アナライザーの種類パラメーターを組み込みアナライザーまたはカスタムアナライザーに設定して、各用語の重みを指定します。使用するクエリ分析ルールで指定されたインデックスで使用されるアナライザーの種類に基づいて、アナライザーの種類を選択できます。

imageクエリ分析ルールで指定されたインデックスに調整されたモデルアナライザーが使用されている場合は、アナライザーの種類パラメーターを調整されたモデルアナライザーに設定し、インスタンスの選択ドロップダウンリストからアプリケーションの名前を選択して、調整されたモデルアナライザーを選択します。

image

  1. クエリ分析ルールの設定ページで、作成した用語の重み分析のための介入辞書をクエリ分析ルールに関連付けます。この手順では、ルールをオンラインアプリケーションに適用しないでください。

image

重要

用語の重み分析への介入中に、検索クエリでスペースを無視するかどうかを指定できます。デフォルトでは、スペースは無視されません。:実際の検索クエリは「sql database」です。介入検索クエリは「sqldatabase」です。スペースを無視することを選択した場合、介入は介入検索クエリに指定された用語の重みに基づいて実装されます。スペースを無視しないことを選択した場合、介入は実装されません。

  1. 検索テストを実行します。この例では、用語「data」の重みは用語「permission」の重みよりも高くなっています。

image

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 = "介入辞書の名前"; // 作成する介入辞書の名前。
        String appName = "アプリケーション名"; // 使用するアプリケーションの名前。
        int versionId = 1234;  // アプリケーションのバージョンID。
//        System.out.println("介入辞書の一覧表示");
//        listInterventionDictionaries();
        Thread.sleep(10000);
        System.out.println("介入辞書の作成: " + dictionaryName);
        createDictionary(dictionaryName);
//
//        Thread.sleep(10000);
//        System.out.println("介入辞書の説明");
//        describeInterventionDictionary(dictionaryName);
//
//        Thread.sleep(10000);
//        System.out.println("追加前の介入辞書エントリの一覧表示");
//        listEntries(dictionaryName);
        Thread.sleep(10000);
        System.out.println("追加された辞書エントリの投稿");
        postEntries(dictionaryName, "add");
        Thread.sleep(10000);
        System.out.println("追加後の介入辞書エントリの一覧表示");
        listEntries(dictionaryName);
        Thread.sleep(10000);
        System.out.print("介入辞書をqpに設定");
        setQueryProcessor(appName, versionId, dictionaryName);
        // 注意して進めてください。検索テストでクエリ分析ルールをテストします。要件を満たすまで、クエリ分析ルールをデフォルトにしないでください。
        Thread.sleep(10000);
        System.out.println("デフォルトのクエリプロセッサの設定");
        setDefaultQueryProcessor(appName, versionId, dictionaryName);
//        Thread.sleep(10000);
//        System.out.println("辞書の削除");
//        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);
        // 次の検索クエリを介入する検索クエリに置き換えます。この例では、用語の重みは降順に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(request);
        System.out.println(response.getHttpContentString());
    }
}
説明

  • 介入エントリのデータ構造の詳細については、InterventionDictionaryEntryを参照してください。

  • クエリに英語が含まれている場合は、すべて小文字の英語を使用してください。

  • クエリ分析ルールのデータ構造の詳細については、QueryProcessorを参照してください。