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

Tablestore:検索インデックスを作成する

最終更新日:Dec 28, 2024

CreateSearchIndex オペレーションを呼び出して、データテーブルに1つ以上の検索インデックスを作成できます。検索インデックスを作成するときに、クエリを実行するフィールドを検索インデックスに追加し、検索インデックスの詳細設定を構成できます。たとえば、ルーティングキーと事前ソート設定を構成できます。

前提条件

  • OTSClient インスタンスが初期化されていること。詳細については、OTSClient インスタンスを初期化するを参照してください。

  • maxVersions パラメータが 1 に設定されたデータテーブルが作成されていること。さらに、データテーブルの timeToLive パラメータは、次のいずれかの条件を満たしている必要があります。詳細については、データテーブルを作成するを参照してください。

    • データテーブルの timeToLive パラメータが -1 に設定されていること。これは、データテーブル内のデータが期限切れにならないことを指定します。

    • データテーブルの timeToLive パラメータが -1 以外の値に設定されており、データテーブルの更新操作が禁止されていること。

使用上の注意

  • 検索インデックス内のフィールドのデータ型は、検索インデックスが作成されたデータテーブル内のフィールドのデータ型と一致している必要があります。詳細については、基本データ型のマッピングを参照してください。

  • 検索インデックスの timeToLive パラメータを -1 以外の値に設定するには、検索インデックスが作成されたデータテーブルで UpdateRow 操作が禁止されていることを確認してください。検索インデックスの timeToLive パラメータの値は、データテーブルの timeToLive パラメータの値以下である必要があります。詳細については、検索インデックスのTTLを指定するを参照してください。

パラメータ

検索インデックスを作成するときは、tableName、indexName、および schema パラメータを構成する必要があります。また、schema パラメータで fieldSchemas、indexSetting、および indexSort パラメータを構成する必要があります。次の表に、上記のパラメータについて説明します。

パラメータ

説明

tableName

データテーブルの名前。

indexName

検索インデックスの名前。

fieldSchemas

フィールドスキーマのリスト。各フィールドスキーマで、次のパラメータを構成します。

  • fieldName (必須): 検索インデックス内のフィールドの名前。この値は列名として使用されます。型: String。

    検索インデックス内のフィールドは、検索インデックスが作成されたデータテーブルのプライマリキー列または属性列です。

  • fieldType (必須): フィールドの型。TableStore.FieldType.XXX 形式で型を指定します。詳細については、基本データ型のマッピングを参照してください。

  • index (オプション): インデックス作成を有効にするかどうかを指定します。型: Boolean。

    デフォルト値: true。true の値は、Tablestore が逆インデックススキーマまたは時空間インデックススキーマを使用してフィールドにインデックスを作成することを指定します。false の値は、Tablestore がフィールドのインデックス作成を有効にしないことを指定します。

  • analyzer (オプション): 使用するアナライザーのタイプ。fieldType パラメータを Text に設定した場合、このパラメータを構成できます。このパラメータを構成しない場合、デフォルトのアナライザータイプである単一単語トークン化が使用されます。詳細については、トークン化を参照してください。

  • analyzerParameter (オプション): アナライザーの設定。指定したアナライザーのタイプに基づいて、このパラメータを構成します。詳細については、トークン化を参照してください。フィールドに analyzer パラメータを構成する場合は、フィールドにこのパラメータを構成する必要があります。

  • enableSortAndAgg (オプション): ソートと集計を有効にするかどうかを指定します。型: Boolean。

    ソートは、enableSortAndAgg パラメータが true に設定されているフィールドに対してのみ有効にできます。詳細については、ソートとページングを参照してください。

    重要

    ネストされたフィールドは、ソートと集計をサポートしていません。ネストされたフィールドのサブフィールドは、ソートと集計をサポートしています。

  • store (オプション): フィールドの値を検索インデックスに格納するかどうかを指定します。型: Boolean。

    store パラメータを true に設定すると、データテーブルをクエリすることなく、検索インデックスからフィールドの値を読み取ることができます。これにより、クエリのパフォーマンスが向上します。

  • isAnArray (オプション): 値が配列かどうかを指定します。型: Boolean。

    このパラメータを true に設定すると、フィールドはデータを配列として格納します。フィールドに書き込まれるデータは JSON 配列である必要があります。例: ["a","b","c"]。

    ネストされたフィールドの値は配列です。fieldType パラメータを Nested に設定した場合は、このパラメータを無視します。

  • fieldSchemas (オプション): サブフィールドのフィールドスキーマのリスト。フィールドがネストされたフィールドの場合、このパラメータを指定して、ネストされたフィールド内のサブフィールドのインデックスタイプを構成する必要があります。

  • isVirtualField (オプション): フィールドが仮想列かどうかを指定します。型: Boolean。デフォルト値: false。このパラメータを true に設定すると、仮想列を使用できます。詳細については、仮想列を参照してください。

  • sourceFieldName (オプション): データテーブル内で仮想列がマッピングされるソースフィールドの名前。型: String。isVirtualField パラメータを true に設定した場合は、このパラメータを構成する必要があります。

  • dateFormats (オプション): 日付の形式。型: String。fieldType パラメータを Date に設定した場合は、このパラメータを構成する必要があります。詳細については、日付データ型を参照してください。

  • enableHighlighting (オプション): ハイライト機能を有効にするかどうかを指定します。型: Boolean。デフォルト値: false。デフォルト値は、ハイライト機能が無効になっていることを指定します。このパラメータを true に設定すると、ハイライト機能を使用できます。Text フィールドのみがハイライト機能をサポートしています。

    重要
    • ハイライト機能は、Tablestore SDK を使用することによってのみ有効にできます。

    • Tablestore SDK for Node.js V5.5.0 以降は、ハイライト機能をサポートしています。

  • vectorOptions: このパラメータはオプションで、Vector フィールドのプロパティを指定します。fieldType パラメータを Vector に設定した場合は、このパラメータを構成する必要があります。次のパラメータを使用して、Vector フィールドのプロパティを指定できます。

    • dataType: ベクターデータのタイプ。float32 のみがサポートされています。他のタイプのベクターデータを使用する場合は、チケットを提出してください。

    • dimension: ベクトルの次元数。ベクトルの次元数の制限については、検索インデックスの制限を参照してください。

    • metricType: ベクトル間の距離を測定するために使用するアルゴリズム。有効な値: euclidean、cosine、および dot_product。

      • euclidean: 多次元空間における2つのベクトル間の最短経路を測定するユークリッド距離アルゴリズム。パフォーマンスを向上させるため、Tablestore のユークリッド距離アルゴリズムは、最終的な平方根計算を実行しません。ユークリッド距離アルゴリズムを使用して得られた値が大きいほど、2つのベクトル間の類似性が高いことを示します。

      • cosine: ベクトル空間における2つのベクトル間の角度の余弦を計算するコサイン類似度アルゴリズム。コサイン類似度アルゴリズムを使用して得られた値が大きいほど、2つのベクトル間の類似性が高いことを示します。ほとんどの場合、このアルゴリズムはテキストデータ間の類似性を計算するために使用されます。

      • dot_product: 同じ次元の2つのベクトルの対応する座標を乗算し、積を加算するドット積アルゴリズム。ドット積アルゴリズムを使用して得られた値が大きいほど、2つのベクトル間の類似性が高いことを示します。

      詳細については、付録: ベクトルの距離測定アルゴリズムを参照してください。

indexSetting

routingFields パラメータの設定を含む、検索インデックスの設定。

routingFields (オプション): カスタムルーティングフィールド。特定のプライマリキー列をルーティングフィールドとして指定できます。Tablestore は、指定されたルーティングフィールドに基づいて、検索インデックスに書き込まれたデータを異なるパーティションに分散します。同じルーティングフィールド値を持つデータは、同じパーティションに分散されます。

indexSort

sorters パラメータの設定を含む、検索インデックスの事前ソート設定。indexSort パラメータを構成しない場合、フィールド値はプライマリキーでソートされます。

説明

fieldType パラメータを Nested に設定した場合、indexSort パラメータを構成することはできません。

sorters: このパラメータは必須で、検索インデックスの事前ソート方法を指定します。有効な値: PrimaryKeySort および FieldSort。詳細については、ソートとページングを参照してください。

  • PrimaryKeySort: プライマリキーでデータをソートします。sorters パラメータを PrimaryKeySort に設定した場合、次のパラメータを構成する必要があります。

    order: ソート順。データは昇順または降順でソートできます。デフォルト値: TableStore.SortOrder.SORT_ORDER_ASC。これは、データが昇順でソートされることを指定します。

  • FieldSort: フィールド値でデータをソートします。sorters パラメータを FieldSort に設定した場合、次のパラメータを構成する必要があります。

    説明

    インデックスが作成され、enableSortAndAgg パラメータが true に設定されているフィールドのみを事前ソートできます。

    • fieldName: データのソートに使用するフィールドの名前。

    • order: ソート順。データは昇順または降順でソートできます。デフォルト値: TableStore.SortOrder.SORT_ORDER_ASC。これは、データが昇順でソートされることを指定します。

    • mode: フィールドに複数の値が含まれている場合に使用されるソート方法。

timeToLive

(オプション) 検索インデックス内のデータの保持期間。デフォルト値: -1。

データの保持期間が timeToLive パラメータの値を超えると、データは期限切れになります。Tablestore は、期限切れのデータを自動的に削除します。

このパラメータの値は 86400 以上である必要があります。値 86400 は 1 日を指定します。このパラメータを -1 に設定することもできます。これは、データが期限切れにならないことを指定します。

アナライザータイプを指定して検索インデックスを作成する

次のサンプルコードは、アナライザータイプを指定して検索インデックスを作成する方法の例を示しています。この例では、検索インデックスは次のフィールドで構成されています。Keyword タイプの pic_id フィールド、Long タイプの count フィールド、Long タイプの time_stamp フィールド、Text タイプの pic_description フィールド、Vector タイプの col_vector フィールド、Geo-point タイプの pos フィールド、Nested タイプの pic_tag フィールド、Date タイプの date フィールド、Text タイプの analyzer_single_word フィールド、Text タイプの analyzer_split フィールド、および Text タイプの analyzer_fuzzy フィールド。pic_tag フィールドは、Keyword タイプの sub_tag_name サブフィールドと Keyword タイプの tag_name サブフィールドで構成されています。アナライザータイプは、analyzer_single_word フィールドの場合は単一単語トークン化、analyzer_split フィールドの場合は区切り文字トークン化、analyzer_fuzzy フィールドの場合はあいまいトークン化です。

client.createSearchIndex({
    tableName: "<TABLE_NAME>", // データテーブルの名前を指定します。
    indexName: "<INDEX_NAME>", // 検索インデックスの名前を指定します。
    schema: {
        fieldSchemas: [
            {
                fieldName: "pic_id",
                fieldType: TableStore.FieldType.KEYWORD, // フィールドの名前とタイプを指定します。
                index: true, // フィールドのインデックス作成を有効にします。
                enableSortAndAgg: true, // フィールドのソートと集計を有効にします。
                store: false,
                isAnArray: false
            },
            {
                fieldName: "count",
                fieldType: TableStore.FieldType.LONG,
                index: true,
                enableSortAndAgg: true,
                store: true,
                isAnArray: false
            },
            {
                fieldName: "time_stamp",
                fieldType: TableStore.FieldType.LONG,
                index: true,
                enableSortAndAgg: false,
                store: true,
                isAnArray: false,
            },
            {
                fieldName: "pic_description",
                fieldType: TableStore.FieldType.TEXT,
                index: true,
                enableSortAndAgg: false,
                store: true,
                isAnArray: false,
            },
            {
                fieldName: "col_vector",
                fieldType: TableStore.FieldType.VECTOR,
                index: true,
                isAnArray: false,
                vectorOptions: {
                    dataType: TableStore.VectorDataType.VD_FLOAT_32,
                    dimension: 4,
                    metricType: TableStore.VectorMetricType.VM_COSINE,
                }
            },
            {
                fieldName: "pos",
                fieldType: TableStore.FieldType.GEO_POINT,
                index: true,
                enableSortAndAgg: true,
                store: true,
                isAnArray: false,
            },
            {
                fieldName: "pic_tag",
                fieldType: TableStore.FieldType.NESTED,
                index: false,
                enableSortAndAgg: false,
                store: false,
                fieldSchemas: [
                    {
                        fieldName: "sub_tag_name",
                        fieldType: TableStore.FieldType.KEYWORD,
                        index: true,
                        enableSortAndAgg: true,
                        store: false,
                    },
                    {
                        fieldName: "tag_name",
                        fieldType: TableStore.FieldType.KEYWORD,
                        index: true,
                        enableSortAndAgg: true,
                        store: false,
                    }
                ]
            },
            {
                fieldName: "date",
                fieldType: TableStore.FieldType.DATE,
                index: true,
                enableSortAndAgg: true,
                store: true,
                isAnArray: false,
                dateFormats: ["yyyy-MM-dd'T'HH:mm:ss.SSSSSS"],
            },
            {
                fieldName: "analyzer_single_word",
                fieldType: TableStore.FieldType.TEXT,
                analyzer: "single_word",
                index: true,
                enableSortAndAgg: false,
                store: true,
                isAnArray: false,
                analyzerParameter: {
                    caseSensitive: true,
                    delimitWord: false,
                }
            },
            {
                fieldName: "analyzer_split",
                fieldType: TableStore.FieldType.TEXT,
                analyzer: "split",
                index: true,
                enableSortAndAgg: false,
                store: true,
                isAnArray: false,
                analyzerParameter: {
                    delimiter: ",",
                }
            },
            {
                fieldName: "analyzer_fuzzy",
                fieldType: TableStore.FieldType.TEXT,
                analyzer: "fuzzy",
                index: true,
                enableSortAndAgg: false,
                store: true,
                isAnArray: false,
                analyzerParameter: {
                    minChars: 1,
                    maxChars: 5,
                }
            },
        ],
        indexSetting: { // 検索インデックスの設定を構成します。
            "routingFields": ["count", "pic_id"], // データテーブルのプライマリキー列のみを検索インデックスのルーティングフィールドとして指定できます。
            "routingPartitionSize": null
        },
        //indexSort: {// ネストされたフィールドを含む検索インデックスの事前ソート設定は省略できます。
            //sorters: [
                // { // indexSort パラメータを構成しない場合、データはプライマリキーの昇順でソートされます。
                //     primaryKeySort: {
                //         order: TableStore.SortOrder.SORT_ORDER_ASC
                //     }
                // },
                //{
                //   fieldSort: {
                //        fieldName: "Col_Keyword",
                //        order: TableStore.SortOrder.SORT_ORDER_DESC // インデックスのソート順を指定します。
                //    }
                //}
            //]
        //},
        timeToLive: 1000000, // データ保持期間を指定します。単位: 秒。
    }
}, function (err, data) {
    if (err) {
        console.log('error:', err);
        return;
    }
    console.log('success:',data);
});

ハイライト機能を有効にして検索インデックスを作成する

次のサンプルコードは、ハイライト機能を有効にして検索インデックスを作成する方法の例を示しています。この例では、検索インデックスは、Keyword タイプの k フィールド、Text タイプの t フィールド、および Nested タイプの n フィールドで構成されています。n フィールドは、Keyword タイプの nk サブフィールド、Long タイプの nk サブフィールド、および Text タイプの nt サブフィールドで構成されています。さらに、Text タイプの t フィールドと Text タイプの nt サブフィールドでハイライト機能が有効になっています。

client.createSearchIndex({
    tableName: "<TABLE_NAME>", // データテーブルの名前を指定します。
    indexName: "<SEARCH_INDEX_NAME>", // 検索インデックスの名前を指定します。
    schema: {
        fieldSchemas: [
            {
                fieldName: "k",
                fieldType: TableStore.FieldType.KEYWORD, // フィールドの名前とタイプを指定します。
                index: true, // フィールドのインデックス作成を有効にします。
                enableSortAndAgg: true, // フィールドのソートと集計を有効にします。
                store: false,
                isAnArray: false
            },
            {
                fieldName: "t",
                fieldType: TableStore.FieldType.TEXT,
                index: true,
                enableSortAndAgg: false,
                enableHighlighting: true, // フィールドのハイライトを有効にします。
                store: true,
                isAnArray: false,
            },
            {
                fieldName: "n",
                fieldType: TableStore.FieldType.NESTED,
                index: false,
                enableSortAndAgg: false,
                store: false,
                fieldSchemas: [
                    {
                        fieldName: "nk",
                        fieldType: TableStore.FieldType.KEYWORD,
                        index: true,
                        enableSortAndAgg: true,
                        store: false,
                    },
                    {
                        fieldName: "nl",
                        fieldType: TableStore.FieldType.LONG,
                        index: true,
                        enableSortAndAgg: true,
                        store: false,
                    },
                    {
                        fieldName: "nt",
                        fieldType: TableStore.FieldType.TEXT,
                        index: true,
                        enableSortAndAgg: false,
                        enableHighlighting: true, // フィールドのハイライトを有効にします。
                        store: false,
                    },
                ]
            },
        ],
        indexSetting: { // 検索インデックスの設定を構成します。
            "routingFields": ["id"], // データテーブルのプライマリキー列のみを検索インデックスのルーティングフィールドとして指定できます。
            "routingPartitionSize": null
        },
        //indexSort: {// ネストされたフィールドを含む検索インデックスの事前ソート設定は省略できます。
            //sorters: [
                // { // indexSort パラメータを構成しない場合、データはプライマリキーの昇順でソートされます。
                //     primaryKeySort: {
                //         order: TableStore.SortOrder.SORT_ORDER_ASC
                //     }
                // },
                //{
                //   fieldSort: {
                //        fieldName: "Col_Keyword",
                //        order: TableStore.SortOrder.SORT_ORDER_DESC // インデックスのソート順を指定します。
                //    }
                //}
            //]
        //},
        timeToLive: 1000000, // データ保持期間を指定します。単位: 秒。
    }
}, function (err, data) {
    if (err) {
        console.log('error:', err);
        return;
    }
    console.log('success:',data);
});

FAQ

参考文献

  • 検索インデックスを作成した後、検索インデックスで提供されるクエリメソッドを使用して、ビジネス要件に基づいて複数の次元からデータをクエリできます。検索インデックスは通常、次のクエリメソッドを提供します。用語クエリ用語クエリすべて一致クエリ一致クエリ一致フレーズクエリプレフィックスクエリ範囲クエリワイルドカードクエリ地理クエリブールクエリKNNベクトル検索クエリネストされたクエリ、および存在クエリ

    Search 操作を呼び出してデータをクエリする場合、ソートおよびページング機能を使用して、クエリ条件を満たす行をソートまたはページングできます。詳細については、ソートとページングを参照してください。

  • Search 操作を呼び出してデータをクエリする場合、折りたたみ(重複排除)機能を使用して、特定の列に基づいて結果セットを折りたたむことができます。このようにして、指定されたタイプのデータはクエリ結果に一度だけ表示されます。詳細については、折りたたみ(重複排除)を参照してください。

  • 検索インデックスの Time to Live(TTL)を指定して、検索インデックスの履歴データを削除したり、検索インデックスのデータの保持期間を延長したりできます。詳細については、検索インデックスの構成を更新するを参照してください。

  • テーブル内のデータを分析する場合、Search 操作を呼び出して集計機能または SQL クエリ機能を使用できます。たとえば、最大値と最小値、値の合計、行数をクエリできます。詳細については、集計SQL クエリを参照してください。

  • 行をソートすることなく、クエリ条件を満たすすべての行を取得する場合、ParallelScan および ComputeSplits 操作を呼び出して並列スキャン機能を使用できます。詳細については、並列スキャンを参照してください。

  • 検索インデックスのスキーマを動的に変更して、検索インデックスにインデックス列を追加、更新、または削除できます。詳細については、検索インデックスのスキーマを動的に変更するを参照してください。

  • ListSearchIndex 操作を呼び出して、データテーブルに作成されたすべての検索インデックスをクエリできます。詳細については、検索インデックスを一覧表示するを参照してください。

  • DescribeSearchIndex 操作を呼び出して、フィールド情報や検索インデックスの構成など、検索インデックスの説明をクエリできます。詳細については、検索インデックスの説明をクエリするを参照してください。

  • 不要になった検索インデックスを削除できます。詳細については、検索インデックスを削除するを参照してください。