全部产品
Search
文档中心

Hologres:Panduan indeks HGraph (Direkomendasikan)

更新时间:Feb 07, 2026

Komputasi vektor di Hologres mendukung berbagai skenario, seperti pencarian kemiripan, pengambilan gambar, dan pengenalan adegan. Gunakan komputasi vektor untuk meningkatkan pemrosesan dan analisis data serta membangun fitur pencarian dan rekomendasi yang lebih akurat. Topik ini menjelaskan cara menggunakan komputasi vektor di Hologres dan menyediakan contoh lengkap.

Catatan

  • Hologres mendukung algoritma pengambilan vektor HGraph mulai dari V4.0.

  • Anda hanya dapat membuat indeks vektor pada tabel berorientasi kolom dan tabel hibrid baris-kolom. Tabel berorientasi baris tidak didukung.

  • Jika Anda menghapus atau membangun ulang tabel yang memiliki indeks vektor—misalnya dengan menggunakan `INSERT OVERWRITE`—jangan aktifkan fitur recycle bin. Tabel dalam recycle bin tetap mengonsumsi sebagian memori.

  • Setelah Anda membuat indeks vektor, file indeks dibuat selama proses compaction yang mengikuti impor data.

  • Data dalam tabel memori (Mem Tables) tidak memiliki indeks vektor. Saat Anda menjalankan permintaan pengambilan vektor, data ini diproses menggunakan perhitungan brute-force.

  • Gunakan resource Serverless Computing untuk melakukan impor data batch. Resource serverless menyelesaikan compaction dan pembuatan indeks secara sinkron selama impor data. Untuk informasi selengkapnya, lihat Gunakan Serverless Computing untuk menjalankan pekerjaan baca dan tulis dan Gunakan Serverless Computing untuk menjalankan pekerjaan compaction.

  • Jika Anda tidak menggunakan resource serverless, jalankan perintah berikut secara manual untuk memicu compaction setelah mengimpor data secara batch atau memodifikasi indeks. Untuk informasi selengkapnya, lihat Compaction (Beta).

  • SELECT hologres.hg_full_compact_table('<SCHEMA_NAME>.<TABLE_NAME>', 'max_file_size_mb=4096');
  • Anda dapat menggunakan resource Serverless Computing untuk menjalankan kueri pengambilan vektor.

Kelola indeks vektor

Buat indeks

Sintaks: Buat indeks vektor saat Anda membuat tabel.

Deskripsi: Di Hologres, vektor direpresentasikan oleh array float4. Dimensi vektor ditentukan oleh panjang array satu dimensi, yaitu `array_length` dalam sintaks berikut.

CREATE TABLE <TABLE_NAME> (
    <VECTOR_COLUMN_NAME> float4[] CHECK (array_ndims(<VECTOR_COLUMN_NAME>) = 1 AND array_length(<VECTOR_COLUMN_NAME>, 1) = <DIM>)
)
WITH (
    vectors = '{
    "<VECTOR_COLUMN_NAME>": {
        "algorithm": "<ALGORITHM>",
        "distance_method": "<DISTANCE_METHOD>",
        "builder_params": {
            "<BUILDER_PARAMETERS_NAME>": <VALUE>
            [, ...]
        }
    }
    [ , "<VECTOR_COLUMN_NAME_2>": { ... } ]
  }'
);

Deskripsi parameter:

Parameter

Deskripsi

table_name

Nama tabel target.

vector_column_name

Nama bidang vektor target.

dim

Dimensi vektor kolom target.

Nilai parameter indeks vektor `vectors` harus memenuhi persyaratan berikut:

  • Hanya string berformat JSON yang didukung. Pada level teratas, hanya satu kunci `vector_column_name` yang didukung. Kunci ini menentukan nama bidang vektor yang akan diindeks.

  • Nilai kunci `vector_column_name` adalah objek JSON yang digunakan untuk mengonfigurasi parameter indeks vektor. Kunci berikut didukung.

Kunci

Deskripsi

algorithm

Algoritma indeks vektor. Parameter ini wajib diisi. Hanya HGraph yang didukung.

distance_method

Metode perhitungan jarak vektor. Parameter ini wajib diisi. Nilai berikut didukung:

  • Euclidean: Jarak Euclidean. Hanya mendukung urutan ascending, yaitu `ORDER BY distance ASC`.

  • InnerProduct: Jarak inner product. Hanya mendukung urutan descending, yaitu `ORDER BY distance DESC`.

  • Cosine: Jarak Cosine. Hanya mendukung urutan descending, yaitu `ORDER BY distance DESC`.

Catatan: Fungsi perhitungan jarak yang digunakan untuk pengambilan vektor harus sesuai dengan metode perhitungan jarak yang digunakan untuk indeks vektor, dan persyaratan pengurutan harus dipenuhi. Jika tidak, indeks vektor tidak dapat digunakan.

builder_params

Parameter pembuatan indeks vektor. Hanya string berformat JSON yang didukung. Untuk informasi selengkapnya tentang parameter, lihat bagian berikut.

  • max_degree

  • ef_construction

  • base_quantization_type

  • use_reorder

  • precise_quantization_type

  • precise_io_type

Parameter `builder_params` mendukung parameter berikut:

Parameter

Deskripsi

max_degree

Selama proses pembuatan indeks, setiap vertex mencoba menghubungkan ke max_degree vertex terdekatnya. Opsional. Nilai default adalah 64. Nilai yang lebih besar meningkatkan cakupan pencarian dan efisiensi pencarian setiap vertex, tetapi juga meningkatkan biaya pembuatan graf dan penyimpanan. Secara umum, kami tidak merekomendasikan melebihi 96.

ef_construction

Mengontrol kedalaman pencarian selama pembuatan indeks. Parameter ini opsional. Nilai default adalah 400. Nilai yang lebih besar mencakup lebih banyak kandidat untuk vektor tetangga suatu vertex selama pembuatan indeks. Hal ini meningkatkan akurasi indeks tetapi juga meningkatkan waktu dan kompleksitas komputasi pembuatan indeks. Kami menyarankan agar Anda tidak mengatur nilai ini lebih dari 600.

base_quantization_type

Metode kuantisasi untuk indeks presisi rendah HGraph. Parameter ini wajib diisi. Metode berikut didukung:

  • sq8

  • sq8_uniform

  • fp16

  • fp32

  • rabitq

use_reorder

Menentukan apakah akan menggunakan indeks presisi tinggi HGraph. Parameter ini opsional. Nilai default adalah FALSE.

precise_quantization_type

Metode kuantisasi untuk indeks presisi tinggi HGraph. Parameter ini opsional dan hanya berlaku ketika `use_reorder` bernilai TRUE. Nilai default adalah fp32. Kami menyarankan agar Anda tidak mengubah nilai ini. Metode berikut didukung. Kami menyarankan Anda memilih metode kuantisasi dengan presisi lebih tinggi daripada `base_quantization_type`.

  • sq8

  • sq8_uniform

  • fp16

  • fp32

precise_io_type

Media penyimpanan untuk indeks hibrid HGraph yang menggunakan indeks presisi tinggi dan rendah. Parameter ini opsional dan hanya berlaku ketika `use_reorder` bernilai TRUE. Nilai default adalah `block_memory_io`. Nilai berikut didukung:

  • block_memory_io: Indeks presisi rendah dan tinggi disimpan di memori.

  • reader_io: Indeks presisi rendah disimpan di memori, dan indeks presisi tinggi disimpan di disk.

builder_thread_count

Parameter ini opsional. Nilai default adalah 4. Parameter ini mengontrol jumlah thread untuk membangun indeks vektor selama penulisan data. Biasanya Anda tidak perlu menyesuaikan parameter ini. Meningkatkan nilai ini dapat menyebabkan penggunaan CPU tinggi. Oleh karena itu, kami menyarankan agar Anda tidak mengubah parameter ini dalam sebagian besar skenario. Memodifikasi parameter ini tidak memicu pengindeksan ulang.

graph_storage_type

Parameter ini opsional. Nilai default adalah `flat`. Parameter ini mengontrol kompresi indeks graf di memori. Nilai berikut didukung:

  • flat (default): Tidak mengompresi indeks graf.

  • compressed: Mengompresi indeks graf. Ini dapat menghemat 50% memori, dan QPS maksimum hanya menurun sekitar 5%.

Catatan

Anda dapat mengatur parameter ini di Hologres V4.0.10 dan versi yang lebih baru.

extra_columns

Menambahkan informasi kolom ke indeks vektor. Fitur ini didukung di V4.1.1 dan versi yang lebih baru. Parameter ini opsional. Hanya kolom bertipe INT, BIGINT, dan SMALLINT yang didukung. Selama pengambilan, Anda dapat langsung memperoleh nilai kolom dari indeks tanpa perlu mengkueri kolom yang sesuai di tabel target. Hal ini meningkatkan performa pengambilan vektor. Contoh: "extra_columns": "id"

Modifikasi indeks

Sintaks:

ALTER TABLE <TABLE_NAME>
SET (
    vectors = '{
    "<VECTOR_COLUMN_NAME>": {
        "algorithm": "<ALGORITHM>",
        "distance_method": "<DISTANCE_METHOD>",
        "builder_params": {
            "<BUILDER_PARAMETERS_NAME>": <VALUE>
            [, ...]
        }
    }
  }'
);

Hapus indeks

-- Hapus indeks vektor semua kolom dalam tabel.
ALTER TABLE <TABLE_NAME>
SET (
    vectors = '{}'
);

-- Jika tabel memiliki indeks vektor pada kolom col1 dan col2, dan Anda perlu menghapus indeks pada kolom col2, jalankan pernyataan ALTER TABLE untuk hanya menyimpan indeks pada kolom col1.
ALTER TABLE <TABLE_NAME>
SET (
    vectors = '{
    "col1": { ... }
  }'
);

Lihat indeks

Hologres menyediakan tabel sistem `hologres.hg_table_properties`. Anda dapat menggunakan tabel ini untuk melihat indeks vektor yang telah dibuat.

SELECT
    *
FROM
    hologres.hg_table_properties
WHERE 
    table_name = '<TABLE_NAME>'
    AND property_key = 'vectors';

Gunakan indeks vektor untuk pengambilan vektor

Fungsi perhitungan jarak vektor

Pengambilan vektor di Hologres mendukung pengambilan perkiraan dan pengambilan eksak. Hanya fungsi pengambilan perkiraan yang dapat menggunakan indeks vektor yang telah dibuat untuk mempercepat kueri. Fungsi tersebut harus sesuai dengan `distance_method` indeks vektor. Fungsi pengambilan eksak tidak dapat menggunakan indeks vektor.

Catatan: Fungsi perhitungan jarak vektor tidak mendukung parameter input konstan penuh.

Fungsi

Jenis pengambilan

Parameter input

Nilai kembalian

Deskripsi

approx_euclidean_distance

Pengambilan perkiraan








float4[], float4[]

float4

Fungsi pengambilan perkiraan untuk jarak Euclidean.

approx_inner_product_distance

Pengambilan perkiraan

float4[], float4[]

float4

Fungsi pengambilan perkiraan untuk jarak inner product.

approx_cosine_distance

Pengambilan perkiraan

float4[], float4[]

float4

Fungsi pengambilan perkiraan untuk jarak cosine.

euclidean_distance

Pengambilan eksak

float4[], float4[]

float4

Fungsi pengambilan eksak untuk jarak Euclidean.

inner_product_distance

Pengambilan eksak

float4[], float4[]

float4

Fungsi pengambilan eksak untuk jarak inner product.

cosine_distance

Pengambilan eksak

float4[], float4[]

float4

Fungsi pengambilan eksak untuk jarak cosine.

Verifikasi penggunaan indeks vektor

Anda dapat melihat rencana eksekusi untuk memeriksa apakah pernyataan SQL menggunakan indeks vektor. Jika rencana tersebut berisi "Vector Filter", indeks berhasil digunakan. Untuk informasi selengkapnya, lihat EXPLAIN dan EXPLAIN ANALYZE.

  • Contoh SQL:

    SELECT
        id,
        approx_euclidean_distance (feature, '{0.1,0.2,0.3,0.4}') AS distance
    FROM
        feature_tb
    ORDER BY
        distance
    LIMIT 40;
  • Rencana eksekusi:

    Limit  (cost=0.00..182.75 rows=40 width=12)
      ->  Sort  (cost=0.00..182.75 rows=160 width=12)
            Sort Key: (VectorDistanceRef)
            ->  Gather  (cost=0.00..181.95 rows=160 width=12)
                  ->  Limit  (cost=0.00..181.94 rows=160 width=12)
                        ->  Sort  (cost=0.00..181.94 rows=40000 width=12)
                              Sort Key: (VectorDistanceRef)
                              ->  Local Gather  (cost=0.00..91.53 rows=40000 width=12)
                                    ->  Limit  (cost=0.00..91.53 rows=40000 width=12)
                                          ->  Sort  (cost=0.00..91.53 rows=40000 width=12)
                                                Sort Key: (VectorDistanceRef)
                                                ->  Project  (cost=0.00..1.12 rows=40000 width=12)
                                                      ->  Index Scan using Clustering_index on feature_tb  (cost=0.00..1.00 rows=40000 width=8)
                                                            Vector Filter: VectorCond => KNN: '40'::bigint distance_method: approx_euclidean_distance search_params: {NULL} args: {feature'{0.100000001,0.200000003,0.300000012,0.400000006}'::real[]}
    Query Queue: init_warehouse.default_queue
    Optimizer: HQO version 4.0.0

Contoh

  • Buat tabel.

    -- Buat kelompok tabel dengan jumlah shard 4.
    CALL HG_CREATE_TABLE_GROUP ('test_tg_shard_4', 4);
    
    -- Buat tabel.
    CREATE TABLE feature_tb (
        id bigint,
      	feature float4[] CHECK(array_ndims(feature) = 1 AND array_length(feature, 1) = 4)
    )
    WITH (
        table_group = 'test_tg_shard_4',
        vectors = '{
        "feature": {
            "algorithm": "HGraph",
            "distance_method": "Cosine",
            "builder_params": {
                "base_quantization_type": "rabitq",
                "graph_storage_type": "compressed",
                "max_degree": 64,
                "ef_construction": 400,
                "precise_quantization_type": "fp32",
                "use_reorder": true,
                "extra_columns": "id",
                "max_total_size_to_merge_mb" : 4096
            }
        }
        }'
    );
  • Impor data.

    -- (Opsional) Gunakan Serverless Computing untuk menjalankan pekerjaan impor data offline skala besar dan ETL. Compaction dan pembuatan indeks diselesaikan secara sinkron selama impor.
    SET hg_computing_resource = 'serverless';
    SET hg_serverless_computing_run_compaction_before_commit_bulk_load = on;
    
    INSERT INTO feature_tb SELECT i, array[random(), random(), random(), random()]::float4[] FROM generate_series(1, 100000) i;
    
    -- Atur ulang konfigurasi untuk memastikan pernyataan SQL yang tidak perlu tidak menggunakan resource serverless.
    RESET hg_computing_resource;
  • Lakukan pengambilan vektor perkiraan.

    -- Hitung 40 hasil teratas untuk jarak cosine.
    SELECT
        id,
        approx_cosine_distance (feature, '{0.1,0.2,0.3,0.4}') AS distance
    FROM
        feature_tb
    ORDER BY
        distance DESC
    LIMIT 40;
    Catatan

    Ketika parameter "extra_columns": "id" diatur untuk tabel target, contoh pencarian vektor perkiraan ini dapat mengambil nilai dari kolom id langsung dari indeks vektor tanpa perlu mengkueri kolom id pada tabel target. Anda dapat memeriksa parameter vector_index_extra_columns_used dalam hasil EXPLAIN ANALYZE untuk melihat jumlah file manifest vektor yang mengambil nilai menggunakan `extra_columns`.

  • Lakukan pengambilan vektor eksak.

    -- Pengambilan eksak tidak menggunakan indeks vektor. Oleh karena itu, fungsi perhitungan jarak tidak perlu sama dengan distance_method indeks vektor.
    SELECT
        id,
        cosine_distance (feature, '{0.1,0.2,0.3,0.4}') AS distance
    FROM
        feature_tb
    ORDER BY
        distance DESC
    LIMIT 40;

Penyetelan performa

Gunakan indeks vektor secara efisien

Ketika volume data kecil (misalnya, puluhan ribu baris) atau instans memiliki sumber daya komputasi yang cukup, hindari penggunaan indeks vektor. Gunakan perhitungan brute-force sebagai gantinya. Gunakan indeks vektor hanya ketika perhitungan brute-force tidak memenuhi kebutuhan Anda terkait latensi, throughput, atau metrik lainnya. Hal ini karena:

  • Indeks vektor bersifat lossy, sehingga akurasi (tingkat recall) tidak dapat mencapai 100%.

  • Indeks vektor mungkin mengembalikan lebih sedikit item daripada yang diminta. Misalnya, kueri dengan `LIMIT 1000` mungkin hanya mengembalikan 500 item.

Jika Anda memutuskan untuk menggunakan indeks vektor, konfigurasikan sebagai berikut (menggunakan tabel non-partisi dengan satu bidang vektor berdimensi 768 sebagai contoh):

  • Skema sensitif latensi: Gunakan indeks hanya di memori. Untuk metode kuantisasi indeks, kami merekomendasikan `sq8_uniform` atau `rabitq`. Volume data yang direkomendasikan tidak lebih dari 5 juta baris per shard.

  • Skema tidak sensitif latensi atau volume data besar: Gunakan indeks hibrid memori-disk. Untuk metode kuantisasi indeks, kami merekomendasikan `rabitq`. Volume data yang direkomendasikan tidak lebih dari 30 juta hingga 50 juta baris per shard.

  • Catatan: Untuk mengatur indeks vektor pada beberapa kolom, volume data yang direkomendasikan per shard harus dikurangi secara proporsional. Dimensi vektor juga memengaruhi rekomendasi ini.

Contoh:

-- Contoh lengkap indeks hibrid
CREATE TABLE feature_tb (
    id bigint,
  	feature float4[] CHECK(array_ndims(feature) = 1 AND array_length(feature, 1) = 4)
)
WITH (
    table_group = 'test_tg_shard_4',
    vectors = '{
    "feature": {
        "algorithm": "HGraph",
        "distance_method": "Cosine",
        "builder_params": {
            "base_quantization_type": "rabitq",
            "graph_storage_type": "compressed",
            "max_degree": 64,
            "ef_construction": 400,
            "precise_quantization_type": "fp32",
            "precise_io_type": "reader_io",
            "use_reorder": true,
            "max_total_size_to_merge_mb" : 4096
        }
    }
    }'
);


-- Contoh lengkap indeks hanya di memori
CREATE TABLE feature_tb (
    id bigint,
  	feature float4[] CHECK(array_ndims(feature) = 1 AND array_length(feature, 1) = 4)
)
WITH (
    table_group = 'test_tg_shard_4',
    vectors = '{
    "feature": {
        "algorithm": "HGraph",
        "distance_method": "Cosine",
        "builder_params": {
            "base_quantization_type": "sq8_uniform",
            "graph_storage_type": "compressed",
            "max_degree": 64,
            "ef_construction": 400,
            "precise_quantization_type": "fp32",
            "use_reorder": true,
            "max_total_size_to_merge_mb" : 4096
        }
    }
    }'
);

Tingkatkan tingkat recall

Bagian ini menggunakan dataset VectorDBBench sebagai contoh untuk menjelaskan cara meningkatkan tingkat recall.

Beberapa faktor dapat memengaruhi tingkat recall. Dengan pengaturan parameter indeks berikut, tingkat recall default sistem biasanya dapat mencapai lebih dari 95%:

  • Parameter indeks:

    • `base_quantization_type` adalah `rabitq` atau `sq8_uniform`

    • `precise_quantization_type` adalah `fp32`

    • `max_degree` adalah `64`

    • `ef_construction` adalah `400`

  • Parameter kueri (GUC):

    • `hg_vector_ef_search`: Nilai yang direkomendasikan adalah nilai default 80. Parameter ini mengontrol ukuran daftar kandidat selama pengambilan untuk menyeimbangkan akurasi dan kecepatan. Nilai yang lebih besar memberikan akurasi lebih tinggi tetapi juga meningkatkan overhead sumber daya.

Untuk lebih meningkatkan tingkat recall hingga lebih dari 99%, Anda dapat menjalankan SET hg_vector_ef_search = 400; sambil mempertahankan parameter lainnya. Namun, peningkatan tingkat recall meningkatkan latensi kueri dan penggunaan sumber daya komputasi.

Untuk lebih meningkatkan tingkat recall hingga 99,5%–99,7%, Anda dapat menyesuaikan parameter `max_degree`, `ef_construction`, dan `hg_vector_ef_search`. Hal ini meningkatkan latensi kueri, konsumsi sumber daya kueri, waktu pembuatan indeks, dan konsumsi sumber daya pembuatan indeks. Contohnya:

  • `max_degree` = 96.

  • `ef_construction` = 500 atau 600.

  • `hg_vector_ef_search` = 500 atau 600.

Atur jumlah shard yang sesuai

Jumlah shard yang lebih tinggi menghasilkan lebih banyak file indeks yang dibuat, yang mengurangi throughput kueri vektor perkiraan. Oleh karena itu, atur jumlah shard yang sesuai untuk aplikasi Anda. Anda biasanya dapat mengikuti langkah-langkah berikut:

  1. Pilih spesifikasi instans yang sesuai berdasarkan volume data vektor. Contoh berikut untuk vektor berdimensi 768. Untuk informasi tentang dimensi lainnya, lihat Tipe instans yang direkomendasikan untuk komputasi vektor.

    1. Indeks hanya di memori: 5 juta vektor per worker.

    2. Indeks hibrid memori-disk: 100 juta vektor per worker.

  2. Tentukan jumlah shard berdasarkan spesifikasi instans. Biasanya, Anda dapat mengatur jumlah shard sama dengan jumlah worker. Misalnya, untuk instans 64 CU, Anda dapat mengatur `shard_count` menjadi 4.

    Berikut adalah contoh SQL:

    -- Buat tabel vektor dan tempatkan dalam kelompok tabel dengan jumlah shard 4.
    CALL HG_CREATE_TABLE_GROUP ('test_tg_shard_4', 4);
    
    CREATE TABLE feature_tb (
        id bigint,
      	feature float4[] CHECK(array_ndims(feature) = 1 AND array_length(feature, 1) = 4)
    )
    WITH (
        table_group = 'test_tg_shard_4',
        vectors = '{
        "feature": {
            "algorithm": "HGraph",
            "distance_method": "Cosine",
            "builder_params": {
                "base_quantization_type": "sq8_uniform",
                "graph_storage_type": "compressed",
                "max_degree": 64,
                "ef_construction": 400,
                "precise_quantization_type": "fp32",
                "use_reorder": true,
                "max_total_size_to_merge_mb" : 4096
            }
        }
        }'
    );

Skema kueri hibrid vektor dan skalar

Untuk pengambilan vektor dengan kondisi filter, berikut adalah skenario penyaringan umum:

Skema kueri 1: Kolom string digunakan sebagai kondisi filter

Berikut adalah contoh kueri. Skema umum adalah menemukan data vektor yang sesuai dalam suatu organisasi, seperti menemukan data wajah dalam suatu kelas.

SELECT(feature, '{1,2,3,4}') AS d FROM feature_tb WHERE uuid = 'x' ORDER BY d LIMIT 10;

Kami merekomendasikan optimasi berikut:

  • Atur `uuid` sebagai kunci distribusi. Hal ini memastikan bahwa data dengan kondisi filter yang sama disimpan dalam shard yang sama. Kueri kemudian hanya mengakses satu shard.

  • Atur `uuid` sebagai kunci pengelompokan untuk tabel. Data diurutkan dalam file berdasarkan kunci pengelompokan.

Skema kueri 2: Bidang waktu digunakan sebagai kondisi filter

Berikut adalah contoh kueri. Ini biasanya digunakan untuk menyaring data vektor berdasarkan bidang waktu. Kami merekomendasikan agar Anda mengatur bidang waktu `time_field` sebagai kunci segmen untuk tabel. Hal ini memungkinkan Anda dengan cepat menemukan file tempat data berada.

SELECT xx_distance(feature, '{1,2,3,4}') AS d FROM feature_tb WHERE time_field BETWEEN '2020-08-30 00:00:00' AND '2020-08-30 12:00:00' ORDER BY d LIMIT 10;

Oleh karena itu, untuk pengambilan vektor dengan kondisi filter apa pun, pernyataan `CREATE TABLE` biasanya sebagai berikut:

-- Catatan: Jika Anda tidak menyaring berdasarkan waktu, Anda dapat menghapus indeks terkait time_field.
CREATE TABLE feature_tb (
    time_field timestamptz NOT NULL,
    uuid text NOT NULL,
    feature float4[] CHECK(array_ndims(feature) = 1 AND array_length(feature, 1) = 4)
)
WITH (
    distribution_key = 'uuid',
    segment_key = 'time_field',
    clustering_key = 'uuid',
    vectors = '{
    "feature": {
        "algorithm": "HGraph",
        "distance_method": "Cosine",
        "builder_params": {
            "base_quantization_type": "sq8_uniform",
            "graph_storage_type": "compressed",
            "max_degree": 64,
            "ef_construction": 400,
            "precise_quantization_type": "fp32",
            "use_reorder": true,
            "max_total_size_to_merge_mb" : 4096
        }
    }
    }'
);

Pengindeksan ulang menggunakan resource serverless

Jika Anda memodifikasi properti tabel, compaction mungkin dipicu dan indeks mungkin dibangun ulang, yang mengonsumsi banyak sumber daya CPU. Untuk memodifikasi properti tabel berikut, lakukan langkah-langkah di bawah ini:

  • Memodifikasi `bitmap_columns`, `dictionary_encoding_columns`, atau indeks vektor memicu compaction dan pengindeksan ulang. Oleh karena itu, jangan gunakan sintaks `ALTER TABLE xxx SET`. Sebagai gantinya, jalankan perintah berikut untuk menggunakan sintaks `REBUILD` dengan resource Serverless Computing. Untuk informasi selengkapnya, lihat REBUILD.

ASYNC REBUILD TABLE <table_name> 
WITH (
    rebuild_guc_hg_computing_resource = 'serverless'
)
SET (
    bitmap_columns = '<col1>,<col2>',
    dictionary_encoding_columns = '<col1>:on,<col2>:off',
    vectors = '{
    "<col_vector>": {
        "algorithm": "HGraph",
        "distance_method": "Cosine",
        "builder_params": {
            "base_quantization_type": "rabitq",
            "graph_storage_type": "compressed",
            "max_degree": 64,
            "ef_construction": 400,
            "precise_quantization_type": "fp32",
            "use_reorder": true,
            "max_total_size_to_merge_mb" : 4096
        }
    }
    }'
);
  • Memodifikasi kolom JSONB berorientasi kolom atau kolom indeks teks penuh juga memicu compaction dan pengindeksan ulang. Sintaks `REBUILD` tidak didukung untuk modifikasi ini. Sebagai gantinya, buat tabel sementara dengan mengikuti langkah-langkah berikut:

BEGIN ;
-- Bersihkan tabel sementara yang mungkin ada.
DROP TABLE IF EXISTS <table_new>;
-- Buat tabel sementara.
SET hg_experimental_enable_create_table_like_properties=on;
CALL HG_CREATE_TABLE_LIKE ('<table_new>', 'select * from <table>');
COMMIT ;

-- Aktifkan penyimpanan berorientasi kolom untuk data berformat JSON pada kolom yang sesuai.
ALTER TABLE <table_new> ALTER COLUMN <column_name> SET (enable_columnar_type = ON);
-- Buat indeks teks penuh pada kolom yang sesuai.
CREATE INDEX <idx_name> ON <table_new> USING FULLTEXT (column_name);

-- Masukkan data ke tabel sementara, gunakan resource serverless untuk menjalankan pekerjaan, dan selesaikan pembuatan indeks secara sinkron.
SET hg_computing_resource = 'serverless';
INSERT INTO <table_new> SELECT * FROM <table>;
ANALYZE <table_new>;

BEGIN ;
-- Hapus tabel lama.
DROP TABLE IF EXISTS  <table>;
-- Ubah nama tabel sementara.
ALTER TABLE <table_new> RENAME TO <table>;
COMMIT ;
  • Untuk memodifikasi properti lain, seperti `distribution_key`, `clustering_key`, `segment_key`, dan format penyimpanan, gunakan sintaks `REBUILD` dengan resource Serverless Computing.

FAQ

  • Q: Saya menerima error "Writting column: feature with array size: 5 violates fixed size list (4) constraint declared in schema".

    A: Error ini terjadi karena dimensi data yang ditulis ke bidang vektor fitur tidak konsisten dengan dimensi yang didefinisikan dalam tabel. Periksa adanya data kotor.

  • Q: Saya menerima error "The size of two array must be the same in DistanceFunction, size of left array: 4, size of right array: x".

    A: Error ini terjadi karena dimensi `left` berbeda dari dimensi `right` dalam `xx_distance(left, right)`.

  • Q: Bagaimana cara menulis data vektor menggunakan Java?

    A: Berikut adalah contoh kode Java:

    private static void insertIntoVector(Connection conn) throws Exception {
        try (PreparedStatement stmt = conn.prepareStatement("INSERT INTO feature_tb VALUES(?,?);")) {
            for (int i = 0; i < 100; ++i) {
               stmt.setInt(1, i);
               Float[] featureVector = {0.1f,0.2f,0.3f,0.4f};
               Array array = conn.createArrayOf("FLOAT4", featureVector);
               stmt.setArray(2, array);
               stmt.execute();
            }
        }
    }
  • Q: Bagaimana cara mengubah indeks Proxima Graph menjadi indeks HGraph?

    A: Untuk mengubah indeks Proxima Graph menjadi indeks HGraph, lakukan dua langkah berikut secara berurutan:

    • Langkah 1: Hapus indeks Proxima Graph yang ada dari tabel. Perintah SQL-nya sebagai berikut:

    CALL set_table_property ('<TABLE_NAME>', 'proxima_vectors', '{}');
    Ganti <TABLE_NAME> dengan nama tabel yang sebenarnya.
    • Langkah 2: Setelah indeks Proxima Graph asli dihapus, buat indeks HGraph baru. Untuk informasi selengkapnya, lihat Buat indeks.