全部产品
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, Anda harus menambahkan bidang-bidang yang ingin dikueri serta mengonfigurasi opsi lanjutan seperti bidang routing dan pengurutan awal.

Prasyarat

  • Klien Tablestore telah diinisialisasi. Untuk informasi selengkapnya, lihat Initialize the Tablestore client.

  • Anda telah membuat tabel data yang memenuhi kondisi berikut. Untuk informasi selengkapnya, lihat Create a data table.

    • max versions harus bernilai 1.

    • time to live (TTL) bernilai -1, atau pembaruan dinonaktifkan untuk tabel data tersebut.

Catatan

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

  • Jika Anda ingin menetapkan TTL tertentu untuk indeks pencarian yang bukan -1, Anda harus menonaktifkan pembaruan 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, Anda harus menentukan nama tabel (TableName), nama indeks pencarian (IndexName), dan struktur indeks (IndexSchema). Parameter IndexSchema mencakup FieldSchemas (pengaturan untuk semua bidang indeks), IndexSetting (pengaturan indeks), dan IndexSort (pengaturan pengurutan awal untuk indeks). Tabel berikut menjelaskan parameter-parameter ini secara rinci.

Parameter

Deskripsi

TableName

Nama tabel data.

IndexName

Nama indeks pencarian.

FieldSchemas

Daftar objek FieldSchema. Setiap FieldSchema berisi parameter berikut:

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

    Bidang dalam indeks pencarian dapat berupa kolom kunci primer atau kolom atribut.

  • FieldType (Wajib): data type bidang tersebut. Tipenya adalah tablestore.FieldType_XXX.

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

    Jika Anda menyetel parameter ini 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 menyetel parameter ini ketika FieldType bernilai Nested.

  • Index (Opsional): Menentukan apakah pengindeksan diaktifkan untuk bidang tersebut. Tipenya adalah Boolean.

    Nilai default-nya adalah true. Artinya, indeks terbalik atau indeks spasial dibuat untuk kolom tersebut. Jika Anda menyetel parameter ini ke false, tidak ada indeks yang dibuat untuk kolom tersebut.

  • Analyzer (Opsional): Jenis tokenizer. Anda dapat menyetel parameter ini ketika tipe bidang adalah Text. Jika tidak disetel, tokenizer default yang digunakan adalah tokenisasi kata tunggal.

  • EnableSortAndAgg (Opsional): Menentukan apakah pengurutan dan agregasi statistik diaktifkan. Tipenya adalah Boolean.

    Anda hanya dapat mengurutkan hasil berdasarkan bidang yang EnableSortAndAgg-nya disetel ke true.

    Penting

    Pengurutan dan agregasi statistik tidak didukung untuk bidang bertipe Nested. Namun, fitur tersebut didukung untuk sub-kolom di dalam bidang bertipe Nested.

  • DateFormats (Opsional): Format tanggal. Tipenya adalah String. Anda harus menyetel parameter ini ketika tipe bidang adalah Date. Untuk informasi selengkapnya, lihat Date and time types.

  • EnableHighlighting (Opsional): Menentukan apakah fitur summary and highlighting diaktifkan. Tipenya adalah Boolean. Nilai default-nya adalah false. Untuk menggunakan fitur summary and highlighting, setel parameter ini ke true. Hanya bidang bertipe Text yang mendukung fitur ini.

  • VectorOptions (Opsional): Parameter properti untuk bidang vektor. Anda harus menyetel parameter ini ketika tipe bidang adalah Vector. Parameter ini mencakup hal-hal berikut:

    • DataType: 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.

    • MetricType: 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. Fitur 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 tentang cara memilih algoritma pengukuran jarak, lihat Distance measure algorithms.

  • JsonType (Opsional): Jenis indeks untuk data JSON. Jenis yang didukung adalah OBJECT dan NESTED. Anda harus menyetel parameter ini ketika tipe bidang adalah JSON.

IndexSetting

Pengaturan indeks. Ini mencakup pengaturan RoutingFields.

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

IndexSort

Pengaturan pengurutan awal indeks. Ini mencakup pengaturan Sorters. Jika tidak disetel, data akan diurutkan berdasarkan kunci primer secara default.

Catatan

IndexSort tidak didukung untuk indeks yang berisi bidang bertipe Nested. Indeks semacam ini tidak memiliki pengurutan awal.

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 berdasarkan kunci primer. Pengaturan ini mencakup hal berikut:

    Order: Urutan pengurutan. Anda dapat mengurutkan secara ascending atau descending. Default-nya adalah ascending.

  • FieldSort: Mengurutkan berdasarkan nilai bidang. Pengaturan ini mencakup hal-hal berikut:

    Anda hanya dapat melakukan pengurutan awal berdasarkan bidang yang telah diindeks dan memiliki pengurutan serta agregasi statistik yang diaktifkan.

    • FieldName: Nama bidang yang digunakan untuk pengurutan.

    • Order: Urutan pengurutan. Anda dapat mengurutkan secara ascending atau descending. Default-nya adalah ascending.

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

TimeToLive

Untuk informasi selengkapnya tentang siklus hidup indeks pencarian, lihat Lifecycle management.

Contoh

Buat indeks pencarian dengan konfigurasi default

Contoh berikut menunjukkan cara membuat indeks pencarian yang berisi tiga kolom: col_keyword (tipe Keyword), col_long (tipe Long), dan col_vector (tipe Vector).

func createSearchIndex(client *tablestore.TableStoreClient) {
    request := &tablestore.CreateSearchIndexRequest{}
    request.TableName = "<TABLE_NAME>"
    request.IndexName = "<SEARCH_INDEX_NAME>"
    request.IndexSchema = &tablestore.IndexSchema{
        FieldSchemas: []*tablestore.FieldSchema{
            {
                FieldName:        proto.String("col_keyword"),
                FieldType:        tablestore.FieldType_KEYWORD, // String type
                Index:            proto.Bool(true),
                EnableSortAndAgg: proto.Bool(true),
            },
            {
                FieldName:        proto.String("col_long"),
                FieldType:        tablestore.FieldType_LONG, // Numeric type
                Index:            proto.Bool(true),
                EnableSortAndAgg: proto.Bool(true),
            },
            {
                FieldName: proto.String("col_vector"),
                FieldType: tablestore.FieldType_VECTOR, // Vector type
                Index:     proto.Bool(true),
                VectorOptions: &tablestore.VectorOptions{
                    VectorDataType:   tablestore.VectorDataType_FLOAT_32.Enum(),
                    Dimension:        proto.Int32(4), // The vector dimension is 4, and the similarity algorithm is dot product.
                    VectorMetricType: tablestore.VectorMetricType_DOT_PRODUCT.Enum(),
                },
            },
        },
    }
    _, err := client.CreateSearchIndex(request)
    if err != nil {
        fmt.Println("Failed to create searchIndex with error:", err)
        return
    }
}

Tentukan IndexSort saat membuat indeks pencarian

Contoh berikut menunjukkan cara membuat indeks pencarian dan menentukan pengurutan awal untuk indeks tersebut. Indeks pencarian tersebut berisi dua kolom: col1 (tipe Keyword) dan col2 (tipe Long).

func createSearchIndex_withIndexSort(client *tablestore.TableStoreClient){
    request := &tablestore.CreateSearchIndexRequest{}
    request.TableName = "<TABLE_NAME>" // Set the table name.
    request.IndexName = "<SEARCH_INDEX_NAME>" // Set the search index name.

    schemas := []*tablestore.FieldSchema{}
    field1 := &tablestore.FieldSchema{
        FieldName: proto.String("col1"), // Set the field name. Use proto.String to get the string pointer.
        FieldType: tablestore.FieldType_KEYWORD, // Set the field type.
        Index:     proto.Bool(true), // Enable indexing.
        EnableSortAndAgg: proto.Bool(true), // Enable sorting and statistical aggregation.
    }
    field2 := &tablestore.FieldSchema{
        FieldName: proto.String("col2"),
        FieldType: tablestore.FieldType_LONG,
        Index:     proto.Bool(true),
        EnableSortAndAgg: proto.Bool(true),
    }

    schemas = append(schemas, field1, field2)
    request.IndexSchema = &tablestore.IndexSchema{
        FieldSchemas: schemas, // Set the fields to include in the search index.
        IndexSort: &search.Sort{ // Specify index pre-sorting. Sort by col2 in ascending order, then by col1 in descending order.
            Sorters: []search.Sorter{
                &search.FieldSort{
                    FieldName: "col2",
                    Order:     search.SortOrder_ASC.Enum(),
                },
                &search.FieldSort{
                    FieldName: "col1",
                    Order:     search.SortOrder_DESC.Enum(),
                },
            },
        },
    }
    resp, err := client.CreateSearchIndex(request) // Call the client to create the search index.
    if err != nil {
        fmt.Println("error :", err)
        return
    }
    fmt.Println("CreateSearchIndex finished, requestId:", resp.ResponseInfo.RequestId)
}

Tetapkan time to live saat membuat indeks pencarian

Penting

Pastikan bahwa pembaruan dinonaktifkan untuk tabel data tersebut.

func createIndexWithTTL(client *tablestore.TableStoreClient) {
    request := &tablestore.CreateSearchIndexRequest{}
    request.TableName = "<TABLE_NAME>"
    request.IndexName = "<SEARCH_INDEX_NAME>"
    schemas := []*tablestore.FieldSchema{}
    field1 := &tablestore.FieldSchema{
        FieldName:        proto.String("col1"),         // Set the field name. Use proto.String to get the string pointer.
        FieldType:        tablestore.FieldType_KEYWORD, // Set the field type.
        Index:            proto.Bool(true),             // Enable indexing.
        EnableSortAndAgg: proto.Bool(true),             // Enable sorting and statistical aggregation.
    }
    field2 := &tablestore.FieldSchema{
        FieldName:        proto.String("col2"),
        FieldType:        tablestore.FieldType_LONG,
        Index:            proto.Bool(true),
        EnableSortAndAgg: proto.Bool(true),
    }
    schemas = append(schemas, field1, field2)
    request.IndexSchema = &tablestore.IndexSchema{
        FieldSchemas: schemas, // Set the fields to include in the search index.
    }
    request.TimeToLive = proto.Int32(3600 * 24 * 7) // Set the TTL of the search index to 7 days.
    resp, err := client.CreateSearchIndex(request)
    if err != nil {
       fmt.Println("error :", err)
       return
   }
    fmt.Println("createIndexWithTTL finished, requestId:", resp.ResponseInfo.RequestId)
}

Aktifkan penyorotan kueri saat membuat indeks pencarian

Contoh berikut menunjukkan cara membuat indeks pencarian dengan empat kolom: col_keyword (tipe Keyword), col_long (tipe Long), col_text (tipe Text), dan col_nested (tipe Nested). Kolom col_nested berisi dua sub-kolom: level1_text (tipe Text) dan level1_nested (tipe Nested). Sub-kolom level1_nested, pada gilirannya, berisi sub-kolom level2_text (tipe Text). Penyorotan kueri diaktifkan untuk kolom col_text, sub-kolom level1_text dari col_nested, dan sub-kolom level2_text dari col_nested.level1_nested.

func createSearchIndexwithHighlighting(client *tablestore.TableStoreClient) {
    request := &tablestore.CreateSearchIndexRequest{}
    request.TableName = "<TABLE_NAME>"
    request.IndexName = "<SEARCH_INDEX_NAME>"
    request.IndexSchema = &tablestore.IndexSchema{
        FieldSchemas: []*tablestore.FieldSchema{
            {
                FieldName:        proto.String("col_keyword"),
                FieldType:        tablestore.FieldType_KEYWORD, // String type.
                Index:            proto.Bool(true),
                EnableSortAndAgg: proto.Bool(true),
            },
            {
                FieldName:        proto.String("col_long"),
                FieldType:        tablestore.FieldType_LONG, // Numeric type.
                Index:            proto.Bool(true),
                EnableSortAndAgg: proto.Bool(true),
            },
            {// Enable query highlighting for a non-nested type.
                FieldName: proto.String("col_text"),
                FieldType: tablestore.FieldType_TEXT, // Tokenizable string type.
                Index:     proto.Bool(true),
                EnableSortAndAgg: proto.Bool(true),
                EnableHighlighting: proto.Bool(true),
            },
            {// Enable query highlighting for sub-columns in a nested type field.
                FieldName: proto.String("col_nested"),
                FieldType: tablestore.FieldType_NESTED,
                FieldSchemas: []*tablestore.FieldSchema{
                    {
                        FieldName:          proto.String("level1_text"),
                        FieldType:          tablestore.FieldType_TEXT,
                        Index:              proto.Bool(true),
                        EnableHighlighting: proto.Bool(true),
                    },
                    {
                        FieldName: proto.String("level1_nested"),
                        FieldType: tablestore.FieldType_NESTED,
                        FieldSchemas: []*tablestore.FieldSchema{
                            {
                                FieldName:          proto.String("level2_text"),
                                FieldType:          tablestore.FieldType_TEXT,
                                Index:              proto.Bool(true),
                                EnableHighlighting: proto.Bool(true),
                            },
                        },
                    },
                },
            },
        },
    }
    _, err := client.CreateSearchIndex(request)
    if err != nil {
        fmt.Println("Failed to create searchIndex with error:", err)
        return
    }
}

FAQ

Referensi