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

Tablestore:検索インデックスの作成

最終更新日:Dec 28, 2024

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

前提条件

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

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

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

    • データテーブルの time_to_live パラメーターが -1 以外の値に設定されていること。更新を許可 パラメーターが いいえ に設定されていること。これは、データテーブルに対する更新操作が禁止されていることを指定します。

使用上の注意

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

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

パラメーター

検索インデックスを作成する際には、table_name、index_name、および schema パラメーターを指定する必要があります。schema パラメーターでは、field_schemas、index_setting、および index_sort パラメーターを構成します。次の表に、上記のパラメーターについて説明します。

パラメーター

説明

table_name

テーブルの名前。

index_name

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

field_schemas

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

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

    検索インデックス内のフィールドは、プライマリキー列または属性列です。

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

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

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

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

  • index (オプション): フィールドのインデックス作成を有効にするかどうかを指定します。型: ブール値。

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

  • analyzer (オプション): 使用するアナライザーの型。field_type パラメーターを Text に設定した場合、このパラメーターを構成できます。それ以外の場合は、単一単語トークン化がアナライザーとして自動的に使用されます。詳細については、トークン化を参照してください。

  • enable_sort_and_agg (オプション): フィールドのソートと集計を有効にするかどうかを指定します。型: ブール値。

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

    重要

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

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

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

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

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

  • source_field_name (オプション): データテーブル内の仮想列がマッピングされるソースフィールドの名前。型: 文字列。

    重要

    is_virtual_field パラメーターを true に設定した場合は、このパラメーターを構成する必要があります。

  • date_formats (オプション): 日付の形式。型: 文字列。詳細については、日付データ型を参照してください。

    重要

    field_type パラメーターを Date に設定した場合は、このパラメーターを構成する必要があります。

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

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

    • Tablestore SDK for Python V6.0.0 以降は、ハイライト機能をサポートしています。

  • vector_options (オプション): Vector フィールドのプロパティ。field_type パラメーターを Vector に設定した場合は、このパラメーターを構成する必要があります。Vector フィールドには、以下のプロパティが含まれています。

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

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

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

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

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

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

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

index_setting

検索インデックスの設定。routing_fields パラメーターの設定を含みます。

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

index_sort

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

説明

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

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

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

    sort_order: ソート順。データは昇順または降順でソートできます。デフォルトでは、データは昇順でソートされます。

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

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

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

    • sort_order: ソート順。データは昇順または降順でソートできます。デフォルトでは、データは昇順でソートされます。

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

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

次のサンプルコードは、アナライザータイプを指定して検索インデックスを作成する方法の例を示しています。この例では、検索インデックスは、Keyword タイプの k フィールド、Text タイプの t フィールド、Geo-point タイプの g フィールド、配列 Keyword タイプの ka フィールド、配列 Long タイプの la フィールド、および Nested タイプの n フィールドで構成されています。n フィールドは、Keyword タイプの nk サブフィールド、Long タイプの nl サブフィールド、および Text タイプの nt サブフィールドで構成されています。

def create_search_index(client):
    # Keyword フィールドにインデックスを作成し、フィールドの集計機能を有効にします。
    field_a = FieldSchema('k', FieldType.KEYWORD, index=True, enable_sort_and_agg=True, store=True)
    # Text フィールドにインデックスを作成し、アナライザータイプを単一単語トークン化に設定します。
    field_b = FieldSchema('t', FieldType.TEXT, index=True, store=True, analyzer=AnalyzerType.SINGLEWORD)
    # Text フィールドにインデックスを作成し、アナライザータイプをあいまいトークン化に設定します。
    #field_b = FieldSchema('t', FieldType.TEXT, index=True, store=True, analyzer=AnalyzerType.FUZZY,analyzer_parameter=FuzzyAnalyzerParameter(1, 6))
    # Text フィールドにインデックスを作成し、アナライザータイプを区切り文字トークン化に設定します。
    #field_b = FieldSchema('t', FieldType.TEXT, index=True, store=True, analyzer=AnalyzerType.SPLIT, analyzer_parameter = SplitAnalyzerParameter(","))
    # Geo-point フィールドにインデックスを作成します。
    field_c = FieldSchema('g', FieldType.GEOPOINT, index=True, store=True)
    # 配列 Keyword フィールドにインデックスを作成します。
    field_d = FieldSchema('ka', FieldType.KEYWORD, index=True, is_array=True, store=True)
    # 配列 Long フィールドにインデックスを作成します。
    field_e = FieldSchema('la', FieldType.LONG, index=True, is_array=True, store=True)

    # Nested フィールドは、Keyword タイプの nk サブフィールド、Long タイプの nl サブフィールド、および Text タイプの nt サブフィールドの 3 つのサブフィールドで構成されています。
    field_n = FieldSchema('n', FieldType.NESTED, sub_field_schemas=[
        FieldSchema('nk', FieldType.KEYWORD, index=True, store=True),
        FieldSchema('nl', FieldType.LONG, index=True, store=True),
        FieldSchema('nt', FieldType.TEXT, index=True, store=True),
    ])

    fields = [field_a, field_b, field_c, field_d, field_e, field_n]

    index_setting = IndexSetting(routing_fields=['PK1'])
    index_sort = None # 検索インデックスに Nested フィールドが含まれている場合、検索インデックスの事前ソートを構成することはできません。
    #index_sort = Sort(sorters=[PrimaryKeySort(SortOrder.ASC)])
    index_meta = SearchIndexMeta(fields, index_setting=index_setting, index_sort=index_sort)
    client.create_search_index('<TABLE_NAME>', '<SEARCH_INDEX_NAME>', index_meta)

Vector フィールドを含む検索インデックスを作成する

次のサンプルコードは、Vector フィールドを含む検索インデックスを作成する方法の例を示しています。この例では、検索インデックスは、Keyword タイプの col_keyword フィールド、Long タイプの col_long フィールド、および Vector タイプの col_vector フィールドで構成されています。ベクトルの距離を測定するためにドット積アルゴリズムが使用されます。

def create_search_index(client):
    index_meta = SearchIndexMeta([
        FieldSchema('col_keyword', FieldType.KEYWORD, index=True, enable_sort_and_agg=True, store=True),  # Keyword タイプ。
        FieldSchema('col_long', FieldType.LONG, index=True, store=True),  # Long タイプ。
        FieldSchema("col_vector", FieldType.VECTOR,  # Vector タイプ。
                    vector_options=VectorOptions(
                        data_type=VectorDataType.VD_FLOAT_32,
                        dimension=4,  # ベクトルの次元数: 4。ベクトルに使用される距離測定アルゴリズム: ドット積。
                        metric_type=VectorMetricType.VM_DOT_PRODUCT
                    )),

    ])
    client.create_search_index(table_name, index_name, index_meta)

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

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

def create_search_index0905(client):
    # Keyword フィールドにインデックスを作成し、フィールドの集計機能を有効にします。
    field_a = FieldSchema('k', FieldType.KEYWORD, index=True, enable_sort_and_agg=True, store=True)
    # Text フィールドにインデックスを作成し、フィールドのアナライザータイプを単一単語トークン化に設定し、フィールドのハイライト機能を有効にします。
    field_b = FieldSchema('t', FieldType.TEXT, index=True, store=True, analyzer=AnalyzerType.SINGLEWORD,
                        enable_highlighting=True)

    # Keyword タイプの nk フィールド、Long タイプの nl フィールド、および Text タイプの nt フィールドで構成される Nested フィールドにインデックスを作成します。Text タイプの nt サブフィールドでハイライト機能を有効にします。
    field_n = FieldSchema('n', FieldType.NESTED, sub_field_schemas=[
        FieldSchema('nk', FieldType.KEYWORD, index=True, store=True),
        FieldSchema('nl', FieldType.LONG, index=True, store=True),
        FieldSchema('nt', FieldType.TEXT, index=True, store=True, enable_highlighting=True),
    ])

    fields = [field_a, field_b, field_n]

    index_setting = IndexSetting(routing_fields=['id'])
    index_sort = None # 検索インデックスに Nested フィールドが含まれている場合、検索インデックスの事前ソートを構成することはできません。
    # index_sort = Sort(sorters=[PrimaryKeySort(SortOrder.ASC)])
    index_meta = SearchIndexMeta(fields, index_setting=index_setting, index_sort=index_sort)
    client.create_search_index('pythontest', 'pythontest_0905', index_meta)

FAQ

関連情報

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

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

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

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

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

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

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

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

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

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