全部产品
Search
文档中心

Tablestore:Buat indeks pencarian

更新时间:Dec 07, 2025

Gunakan metode CreateSearchIndex untuk membuat indeks pencarian pada tabel data. Satu tabel data dapat memiliki beberapa indeks pencarian. Saat membuat indeks pencarian, tambahkan bidang-bidang yang ingin Anda kueri ke dalam indeks tersebut. Anda juga dapat mengonfigurasi opsi lanjutan, seperti kunci routing kustom dan pengurutan awal.

Prasyarat

  • Inisialisasi klien Tablestore. Untuk informasi selengkapnya, lihat Initialize Tablestore Client.

  • Anda telah menyelesaikan pembuatan tabel data yang memenuhi kondisi berikut:

    • max versions harus bernilai 1.

    • time to live (TTL) bernilai -1, atau fitur pembaruan pada tabel dinonaktifkan.

Catatan

  • Saat membuat indeks pencarian, data type suatu bidang dalam indeks harus sesuai dengan tipe data bidang yang bersesuaian di tabel data.

  • Jika Anda ingin menetapkan TTL tertentu untuk indeks pencarian (nilai selain -1), Anda harus menonaktifkan fitur penulisan UpdateRow pada tabel data. TTL indeks pencarian harus kurang dari atau sama dengan TTL tabel data. Untuk informasi selengkapnya, lihat Lifecycle management.

Parameter

Saat membuat indeks pencarian, tentukan nama tabel (table_name), nama indeks pencarian (index_name), dan skema indeks (schema). Skema mencakup skema bidang (field_schemas), pengaturan indeks (index_setting), dan pengaturan pengurutan awal indeks (index_sort). Tabel berikut menjelaskan parameter-parameter tersebut.

Komponen

Deskripsi

table_name

Nama tabel data.

index_name

Nama indeks pencarian.

field_schemas

Daftar objek field_schema. Setiap field_schema berisi parameter berikut:

  • field_name (Wajib): Nama bidang yang akan ditambahkan ke indeks pencarian. Ini adalah nama kolom. Tipenya adalah String.

    Bidang ini dapat berupa kolom kunci primer atau kolom atribut.

  • field_type (Wajib): data type bidang tersebut. Tipenya adalah FieldType.XXX.

  • is_array (Opsional): Menentukan apakah bidang tersebut merupakan array. Tipenya adalah Boolean.

    Jika diatur ke True, kolom tersebut merupakan array. Saat menulis data, formatnya harus berupa array JSON, misalnya ["a","b","c"].

    Karena tipe Nested merupakan array, Anda tidak perlu mengatur parameter ini ketika field_type bernilai Nested.

  • index (Opsional): Menentukan apakah akan membuat indeks untuk bidang tersebut. Tipenya adalah Boolean.

    Nilai default-nya adalah True, artinya indeks terbalik atau indeks spasial dibuat untuk kolom tersebut. Jika diatur ke False, tidak ada indeks yang dibuat untuk kolom tersebut.

  • analyzer (Opsional): Jenis tokenizer. Parameter ini dapat diatur ketika tipe bidang adalah Text. Jika tidak diatur, tokenizer default yang digunakan adalah tokenisasi kata tunggal.

  • enable_sort_and_agg (Opsional): Menentukan apakah akan mengaktifkan pengurutan dan agregasi statistik. Tipenya adalah Boolean.

    Hanya bidang dengan enable_sort_and_agg bernilai True yang dapat digunakan untuk sorting.

    Penting

    Bidang Nested tidak mendukung pengurutan dan agregasi statistik. Namun, sub-kolom di dalam bidang Nested mendukung fitur ini.

  • sub_field_schemas (Opsional): Ketika tipe bidang adalah Nested, gunakan parameter ini untuk mengatur tipe indeks pada sub-kolom dalam dokumen bersarang. Tipenya adalah daftar objek field_schema.

  • is_virtual_field (Opsional): Menentukan apakah bidang tersebut merupakan virtual column. Tipenya adalah Boolean. Nilai default-nya adalah False. Untuk menggunakan kolom virtual, atur parameter ini ke True.

  • source_field_name (Opsional): Nama bidang di tabel data. Tipenya adalah String.

    Penting

    Parameter ini wajib diisi ketika is_virtual_field diatur ke True.

  • date_formats (Opsional): Format tanggal. Tipenya adalah String. Untuk informasi selengkapnya, lihat Date and time types.

    Penting

    Parameter ini wajib diisi ketika tipe bidang adalah Date.

  • enable_highlighting (Opsional): Menentukan apakah akan mengaktifkan fitur summary and highlighting. Tipenya adalah Boolean. Nilai default-nya adalah False. Untuk menggunakan summary dan highlighting, atur parameter ini ke True. Hanya bidang Text yang mendukung fitur ini.

    Penting

    Fitur ini didukung oleh Tablestore Python SDK mulai dari versi 6.0.0.

  • vector_options (Opsional): Parameter properti untuk bidang vektor. Parameter ini wajib diisi ketika tipe bidang adalah Vector. Isinya mencakup hal-hal berikut:

    • data_type: Tipe data vektor. Saat ini hanya float32 yang didukung. Jika Anda memerlukan tipe lain, submit a ticket untuk menghubungi kami.

    • dimension: Dimensi vektor. Jumlah dimensi maksimum yang didukung untuk bidang vektor adalah 4096.

    • metric_type: Algoritma yang digunakan untuk mengukur jarak antar vektor. Algoritma yang didukung meliputi Jarak Euclidean (euclidean), kemiripan kosinus (cosine), dan dot product (dot_product).

      • Jarak Euclidean (euclidean): Jarak garis lurus antara dua vektor dalam ruang multidimensi. Untuk alasan performa, algoritma Jarak Euclidean di Tablestore tidak melakukan perhitungan akar kuadrat akhir. Skor Jarak Euclidean yang lebih besar menunjukkan tingkat kemiripan yang lebih tinggi antara dua vektor.

      • Kemiripan kosinus (cosine): Kosinus sudut antara dua vektor dalam ruang vektor. Skor kemiripan kosinus yang lebih tinggi menunjukkan tingkat kemiripan yang lebih tinggi antara dua vektor. Ini sering digunakan untuk menghitung kemiripan data teks.

      • Dot product (dot_product): Mengalikan koordinat yang bersesuaian dari dua vektor dengan dimensi yang sama, lalu menjumlahkan hasilnya. Skor dot product yang lebih tinggi menunjukkan tingkat kemiripan yang lebih tinggi antara dua vektor.

      Untuk informasi selengkapnya tentang pemilihan algoritma pengukuran jarak, lihat Distance measure algorithms.

  • json_type (Opsional): Tipe indeks untuk data JSON. Tipe OBJECT dan NESTED didukung. Parameter ini wajib diisi ketika tipe bidang adalah JSON.

index_setting

Pengaturan indeks, yang mencakup pengaturan routing_fields.

routing_fields (Opsional): Bidang routing kustom. Anda dapat memilih beberapa kolom kunci primer sebagai bidang routing. Biasanya, Anda hanya perlu menetapkan satu bidang. Jika Anda menetapkan beberapa kunci routing, sistem akan menggabungkan nilai-nilainya menjadi satu nilai tunggal.

index_sort

Pengaturan pengurutan awal indeks, yang mencakup pengaturan sorters. Jika tidak diatur, data akan diurutkan berdasarkan kunci primer secara default.

Catatan

Indeks yang berisi bidang Nested tidak mendukung indexSort. Tidak ada pengurutan awal yang dilakukan.

sorters (Wajib): Metode pengurutan awal untuk indeks. Anda dapat mengurutkan berdasarkan kunci primer atau berdasarkan nilai bidang. Untuk informasi selengkapnya tentang pengurutan, lihat Sorting and pagination.

  • PrimaryKeySort mengurutkan data berdasarkan kunci primer dan mencakup pengaturan berikut:

    sort_order: Urutan pengurutan. Anda dapat mengurutkan secara ascending (SortOrder.ASC) atau descending. Default-nya adalah ascending.

  • FieldSort mengurutkan data berdasarkan nilai bidang dan mencakup pengaturan berikut:

    Hanya bidang yang diindeks dan memiliki pengurutan serta agregasi statistik yang diaktifkan yang dapat digunakan untuk pengurutan awal.

    • field_name: Nama bidang yang digunakan untuk pengurutan.

    • sort_order: Urutan pengurutan. Anda dapat mengurutkan secara ascending (SortOrder.ASC) atau descending. Default-nya adalah ascending.

    • sort_mode: Metode pengurutan yang digunakan ketika suatu bidang memiliki beberapa nilai.

Contoh

Tentukan analyzer saat membuat indeks pencarian

Contoh berikut menunjukkan cara menentukan tokenizer saat membuat indeks pencarian. Indeks pencarian berisi enam bidang: k (Keyword), t (Text), g (Geopoint), ka (Keyword array), la (Long array), dan n (Nested). Bidang n memiliki tiga sub-bidang: nk (Keyword), nl (Long), dan nt (Text).

def create_search_index(client):
    # A Keyword field. Create an index and enable statistical aggregation.
    field_a = FieldSchema('k', FieldType.KEYWORD, index=True, enable_sort_and_agg=True)
    # A Text field. Create an index and use single-word tokenization.
    field_b = FieldSchema('t', FieldType.TEXT, index=True, analyzer=AnalyzerType.SINGLEWORD)
    # A Text field. Create an index and use fuzzy tokenization.
    #field_b = FieldSchema('t', FieldType.TEXT, index=True, analyzer=AnalyzerType.FUZZY,analyzer_parameter=FuzzyAnalyzerParameter(1, 6))
    # A Text field. Create an index and use a custom separator (a comma) for tokenization.
    #field_b = FieldSchema('t', FieldType.TEXT, index=True, analyzer=AnalyzerType.SPLIT, analyzer_parameter = SplitAnalyzerParameter(","))
    # A Geopoint field. Create an index.
    field_c = FieldSchema('g', FieldType.GEOPOINT, index=True)
    # A Keyword array field. Create an index.
    field_d = FieldSchema('ka', FieldType.KEYWORD, index=True, is_array=True)
    # A Long array field. Create an index.
    field_e = FieldSchema('la', FieldType.LONG, index=True, is_array=True)

    # A Nested field that includes three sub-fields: nk (Keyword), nl (Long), and nt (Text).
    field_n = FieldSchema('n', FieldType.NESTED, sub_field_schemas=[
        FieldSchema('nk', FieldType.KEYWORD, index=True),
        FieldSchema('nl', FieldType.LONG, index=True),
        FieldSchema('nt', FieldType.TEXT, index=True),
    ])

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

    index_setting = IndexSetting(routing_fields=['PK1']) 
    index_sort = None # When a search index contains a Nested field, you cannot set index pre-sorting.
    #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)

Buat indeks pencarian dan konfigurasikan bidang vektor

Contoh berikut menunjukkan cara membuat indeks pencarian. Indeks pencarian berisi tiga bidang: col_keyword (Keyword), col_long (Long), dan col_vector (Vector). Algoritma pengukuran jarak untuk bidang vektor adalah dot product.

def create_search_index(client):
    index_meta = SearchIndexMeta([
        FieldSchema('col_keyword', FieldType.KEYWORD, index=True, enable_sort_and_agg=True),  # String type
        FieldSchema('col_long', FieldType.LONG, index=True),  # Numeric type
        FieldSchema("col_vector", FieldType.VECTOR,  # Vector type
                    vector_options=VectorOptions(
                        data_type=VectorDataType.VD_FLOAT_32,
                        dimension=4,  # The vector dimension is 4, and the similarity algorithm is dot product.
                        metric_type=VectorMetricType.VM_DOT_PRODUCT
                    )),

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

Aktifkan summary dan highlighting saat membuat indeks pencarian

Contoh berikut menunjukkan cara mengaktifkan fitur summary dan highlighting saat membuat indeks pencarian. Indeks pencarian berisi tiga bidang: k (Keyword), t (Text), dan n (Nested). Bidang n memiliki tiga sub-bidang: nk (Keyword), nl (Long), dan nt (Text). Fitur summary dan highlighting diaktifkan untuk bidang t dan sub-bidang nt dari bidang n.

def create_search_index0905(client):
    # A Keyword field. Create an index and enable statistical aggregation.
    field_a = FieldSchema('k', FieldType.KEYWORD, index=True, enable_sort_and_agg=True)
    # A Text field. Create an index, use single-word tokenization, and enable summary and highlighting for the field.
    field_b = FieldSchema('t', FieldType.TEXT, index=True, analyzer=AnalyzerType.SINGLEWORD,
                        enable_highlighting=True)

    # A Nested field that includes three sub-fields: nk (Keyword), nl (Long), and nt (Text). The summary and highlighting feature is enabled for the nt sub-column.
    field_n = FieldSchema('n', FieldType.NESTED, sub_field_schemas=[
        FieldSchema('nk', FieldType.KEYWORD, index=True),
        FieldSchema('nl', FieldType.LONG, index=True),
        FieldSchema('nt', FieldType.TEXT, index=True, enable_highlighting=True),
    ])

    fields = [field_a, field_b, field_n]

    index_setting = IndexSetting(routing_fields=['id'])
    index_sort = None  # When a search index contains a Nested field, you cannot set index pre-sorting.
    # 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

Referensi