All Products
Search
Document Center

MaxCompute:Indeks vektor

Last Updated:Aug 16, 2026

Indeks vektor adalah mekanisme pengindeksan efisien di MaxCompute yang mempercepat pencarian kemiripan pada data vektor berskala besar. Dokumen ini menjelaskan cara menggunakan indeks vektor serta menyediakan contoh-contohnya.

Catatan

  • Sebelum membuat VECTOR INDEX, jalankan perintah SETPROJECT odps.schema.evolution.enable=true; untuk mengaktifkan Schema Evolution.

  • Saat ini, indeks vektor hanya dapat dibuat pada Delta Table.

  • Pemicu pembuatan indeks

    • Pembuatan sinkron: Terutama digunakan untuk pemrosesan batch offline. Setelah indeks didefinisikan dengan CREATE VECTOR INDEX, operasi INSERT secara sinkron memicu pembuatan indeks.

    • Pembangunan ulang penuh: Jika pengambilan indeks tidak efisien, bangun ulang indeks pada seluruh dataset. Hal ini dapat dipicu secara manual dengan perintah REBUILD INDEX atau secara otomatis oleh proses latar belakang yang mendeteksi efisiensi pengambilan yang rendah.

  • Sistem memblokir penghapusan kolom jika kolom tersebut dirujuk oleh indeks vektor. Untuk menghapus kolom tersebut, hapus terlebih dahulu indeks yang sesuai.

  • Untuk membangun ulang indeks vektor pada tabel partisi, tentukan rentang partisi dengan PARTITION (...). Jika tidak, kesalahan analisis semantik akan muncul.

  • Anda dapat menghapus indeks dari partisi tertentu pada tabel partisi.

  • Anda hanya dapat membuat satu indeks pada satu kolom.

  • Pada tabel yang sama, Anda dapat membuat indeks terpisah dengan nama berbeda untuk beberapa kolom vektor.

Buat indeks vektor

Buat indeks vektor

Buat indeks pada kolom vektor untuk mempercepat kueri pengambilan. Perintahnya adalah sebagai berikut:

CREATE VECTOR INDEX <index_name> 
ON <table_name> (<description_embedding>)
IDXPROPERTIES (
  'algorithm' = 'xxx', 
  'distance_type' = 'xxx', 
  'build_params' = 'xxx'
  ...
);

Parameter

Parameter

Deskripsi

index_name

Nama indeks.

table_name

Nama tabel tempat membangun indeks vektor. Saat ini, hanya Delta Table yang didukung.

description_embedding

Nama kolom vektor yang akan diindeks.

algorithm

Menentukan algoritma pembuatan untuk indeks vektor. Saat ini, satu-satunya algoritma yang didukung adalah hgraph.

distance_type

Menentukan metode untuk menghitung kemiripan antar vektor. Jenis-jenis berikut didukung:

  • cosine: Kemiripan kosinus, yang mengukur kemiripan antara arah dua vektor. Ini umum digunakan untuk vektor fitur teks dan gambar.

  • euclidean: Jarak Euclidean, yang merepresentasikan jarak garis lurus antara dua vektor dalam ruang.

  • dot_product: Produk titik (inner product). Metrik ini cocok untuk vektor yang telah dinormalisasi, di mana nilai yang lebih besar menunjukkan kemiripan yang lebih tinggi.

build_params

Menentukan parameter konfigurasi untuk pembuatan indeks dalam format JSON. Contoh: '{"max_degree": 16, "ef_construction": 128}'. Parameter-parameter ini mengontrol kualitas dan performa pembuatan indeks. Parameter umum meliputi:

  • max_degree: Mengontrol jumlah maksimum koneksi untuk setiap node dalam graf. Nilai yang lebih tinggi meningkatkan akurasi indeks tetapi dapat meningkatkan waktu pembuatan dan kueri.

  • ef_construction: Menentukan ukuran daftar kandidat selama fase pembuatan. Parameter ini memengaruhi efisiensi pembuatan dan kualitas pencarian. Nilai yang lebih besar meningkatkan waktu pembuatan tetapi dapat meningkatkan akurasi pencarian.

Indeks vektor juga mendukung kuantisasi vektor internal. Parameter berikut terkait dengan kuantisasi:

  • base_quantization_type: Pengkodean vektor yang digunakan selama traversal graf dan pengambilan kandidat. Nilai yang valid mencakup fp32, fp16, sq8, sq8_uniform, dan rabitq.

  • use_reorder: Menentukan apakah set kandidat yang diambil dari traversal graf harus diurutkan ulang dengan komputasi jarak presisi tinggi. Nilai default-nya adalah false. Jika pengurutan ulang diaktifkan, indeks harus menyimpan kedua pengkodean vektor dasar dan presisi. Oleh karena itu, kuantisasi dasar yang lebih agresif belum tentu menghasilkan ukuran indeks akhir yang lebih kecil. Ukuran indeks aktual juga bergantung pada precise_quantization_type, dimensi vektor, dan struktur HGraph.

  • precise_quantization_type: Presisi vektor yang digunakan dalam fase pengurutan ulang. Parameter ini hanya berlaku ketika use_reorder diatur ke true. Nilai umum adalah fp16 dan fp32.

Untuk informasi lebih lanjut tentang konfigurasi kuantisasi, lihat Mengonfigurasi Kuantisasi Indeks Vektor.

Konfigurasikan kuantisasi indeks vektor

Indeks vektor mendukung kuantisasi vektor internal untuk mengurangi ukuran penyimpanan indeks, jejak memori waktu proses, dan overhead akses memori selama pengambilan. Kuantisasi hanya mengubah pengkodean vektor dalam indeks dan tidak memengaruhi data VECTOR(FLOAT, dimension) asli dalam tabel maupun cara pemanggilan VECTOR_SEARCH. Indeks vektor MaxCompute mendukung dua metode pengambilan berikut:

  • Pengambilan satu tahap: Langsung menggunakan base_quantization_type untuk traversal graf dan perhitungan jarak. Metode ini menghasilkan struktur indeks yang lebih sederhana dan penggunaan memori yang lebih rendah.

  • Pengambilan dua tahap: Pertama menggunakan vektor dasar presisi rendah untuk pengambilan kandidat cepat, lalu menggunakan vektor presisi tinggi untuk menghitung ulang jarak. Metode ini menyeimbangkan performa pengambilan dan recall.

Tabel berikut menjelaskan kombinasi umum parameter kuantisasi.

Konfigurasi

Kombinasi parameter

Deskripsi

FP32

base_quantization_type=fp32

Fitur: Garis dasar presisi penuh dengan recall stabil tetapi penggunaan memori tinggi.

Kasus penggunaan: Skenario yang membutuhkan akurasi tinggi atau melibatkan dataset kecil.

FP16

base_quantization_type=fp16

Fitur: Mengurangi jejak memori vektor hingga sekitar 50% dari FP32, dengan recall yang hampir identik.

Kasus penggunaan: Skenario yang membutuhkan akurasi tinggi atau melibatkan dataset kecil. Menawarkan sedikit kompromi recall dibandingkan FP32.

SQ8

base_quantization_type=sq8

Fitur: Mengurangi jejak memori vektor hingga sekitar 25% dari FP32, dengan sedikit penurunan recall.

Kasus penggunaan: Skenario sensitif memori di mana penurunan kecil pada recall dapat diterima.

SQ8 + Pengurutan Ulang Presisi Tinggi

sq8 + fp16 atau fp32 reorder

Fitur: Menggunakan SQ8 untuk traversal graf dan kemudian memulihkan recall melalui perhitungan ulang jarak presisi tinggi.

Kasus penggunaan: Skenario yang perlu menyeimbangkan efisiensi pengambilan dan recall.

RaBitQ + Pengurutan Ulang Presisi Tinggi

rabitq + fp16 atau fp32 reorder

Fitur: Menggunakan pengkodean yang lebih ringkas untuk traversal graf dan mengurutkan ulang hasil kandidat dengan menggunakan vektor presisi tinggi.

Kasus penggunaan: Skenario dengan pembangunan ulang indeks yang sering dan membutuhkan recall tinggi.

Kuantisasi memberikan manfaat berikut:

  • Mengurangi ukuran file indeks dan jejak memori waktu proses.

  • Menurunkan overhead bandwidth memori selama pemuatan dan pengambilan indeks.

  • Meningkatkan pemanfaatan cache CPU, sehingga satu worker dapat memuat dan memproses lebih banyak vektor.

  • Memungkinkan Anda menyeimbangkan performa pengambilan, biaya sumber daya, dan recall dengan menggabungkan kuantisasi dasar dan pengurutan ulang presisi tinggi.

Kami merekomendasikan menggunakan FP16 saat membuat indeks HGraph. Untuk contoh lainnya, lihat Contoh: Buat indeks vektor dengan kuantisasi FP16 dan Contoh: Buat indeks vektor dengan traversal presisi rendah RaBitQ dan pengurutan ulang presisi tinggi.

Isi data

INSERT OVERWRITE TABLE <table_name> [PARTITION <partition_spec>]
SELECT ......

Bangun ulang indeks vektor

Gunakan perintah berikut untuk membangun ulang indeks vektor pada data yang sudah ada.

  • Bangun ulang indeks untuk tabel non-partisi.

ALTER TABLE <table_name> REBUILD INDEX <index_name> ;
  • Bangun ulang indeks untuk tabel partisi. Anda dapat membangun ulang indeks vektor untuk beberapa partisi sekaligus.

ALTER TABLE <table_name> PARTITION 
(<partition_name1=value1>[, partition_name2=value2, ...]) REBUILD INDEX <index_name> ;

ALTER TABLE <table_name> PARTITION(partition_name >=value) REBUILD INDEX <index_name> ;

Daftar indeks vektor untuk suatu tabel

SHOW INDEXES ON <table_name>;

Lihat informasi indeks vektor

DESC INDEX index_name ON  <table_name> [PARTITION <partition_spec>];

Hapus indeks vektor

DROP INDEX [IF EXISTS] index_name ON  <table_name> [PARTITION <partition_spec>];

Contoh

Siapkan data

SET odps.sql.type.system.odps2=true;
SET odps.sql.type.vector.enable=true;

DROP TABLE IF EXISTS vector_test;
DROP VIEW IF EXISTS vector_test;

CREATE TABLE IF NOT EXISTS vector_test(
  c0 int,
  c1 vector(float, 2),
  c2 vector(float, 3)
) STORED AS aliorc 
TBLPROPERTIES (
  'table.format.version'='2', 
  'acid.data.retain.hours'='24',
  'columnar.nested.type'='true', 
  'transactional'='true'
);


INSERT OVERWRITE vector_test SELECT 1, vector(1.1F,2.2F), vector(1.1F,2.2F,3.3F) UNION ALL 
SELECT 2, vector(2.2F,3.3F), vector(2.2F,3.3F,4.4F) 
UNION ALL 
SELECT 3, vector(3.3F,4.4F), vector(3.3F,4.4F,5.5F);

Contoh: Buat indeks vektor dan masukkan data

CREATE VECTOR INDEX c2_vector_index 
ON vector_test (c2) 
IDXPROPERTIES (
  'algorithm' = 'hgraph', 
  'distance_type' = 'cosine', 
  'build_params' = '{"max_degree": 16, "ef_construction": 128}');


ALTER TABLE vector_test REBUILD INDEX c2_vector_index; 


INSERT OVERWRITE vector_test SELECT 1, vector(1.1F,2.2F), vector(1.1F,2.2F,3.3F) 
UNION ALL  
SELECT 2, vector(2.2F,3.3F), vector(2.2F,3.3F,4.4F) 
UNION ALL 
SELECT 3, vector(3.3F,4.4F), vector(3.3F,4.4F,5.5F) 
UNION ALL 
SELECT 4, vector(4.4F,5.5F), vector(4.4F,5.5F,6.6F) 
UNION ALL 
SELECT 5, vector(5.5F,6.6F), vector(5.5F,6.6F,7.7F); 

Contoh: Bangun ulang indeks vektor

ALTER TABLE vector_test REBUILD INDEX c2_vector_index; 

SELECT * FROM vector_test; 
-- Hasil berikut dikembalikan:
+------+------+------+
| c0   | c1   | c2   |
+------+------+------+
| 1    | [1.1, 2.2] | [1.1, 2.2, 3.3] |
| 2    | [2.2, 3.3] | [2.2, 3.3, 4.4] |
| 3    | [3.3, 4.4] | [3.3, 4.4, 5.5] |
| 4    | [4.4, 5.5] | [4.4, 5.5, 6.6] |
| 5    | [5.5, 6.6] | [5.5, 6.6, 7.7] |
+------+------+------+

Contoh: Daftar indeks vektor

SHOW INDEXES ON vector_test;
-- Hasil berikut dikembalikan:
{"Indexes": [{
            "createTime": 1779900024105,
            "id": "512d520**45e1c7ba8",
            "indexColumns": [{"name": "c2"}],
            "name": "c2_vector_index",
            "properties": {
                "algorithm": "hgraph",
                "build_params": "{\"max_degree\": 16, \"ef_construction\": 128}",
                "distance_type": "cosine"},
            "type": "VECTOR"}]}

Contoh: Lihat informasi indeks vektor

DESC INDEX c2_vector_index ON vector_test;

-- Hasil berikut dikembalikan:
+------------------------------------------------------------------------------------+
| Index Detail                                                                       |
+------------------------------------------------------------------------------------+
| name:                     c2_vector_index                                          |
| id:                       512d520**e1c7ba8                         |
| index_type:               VECTOR                                                   |
| index_columns:            c2                                                       |
| status:                   ACTIVE                                                   |
| coverage_percentage:      100%                                                     |
| storage_size_bytes:       6940                                                     |
| properties:               build_params={"max_degree": 16, "ef_construction": 128}, distance_type=cosine, algorithm=hgraph |
+------------------------------------------------------------------------------------+

Contoh: Hapus indeks vektor

DROP INDEX c2_vector_index ON vector_test;

-- Hasil berikut dikembalikan:
{"Indexes": []}

Contoh: Buat indeks vektor dengan kuantisasi FP16

CREATE VECTOR INDEX doc_vector_index
ON doc_table (embedding)
IDXPROPERTIES (
  'algorithm' = 'hgraph',
  'distance_type' = 'dot_product',
  'build_params' = '{
    "max_degree":48,
    "ef_construction":400,
    "base_quantization_type":"fp16"
  }'
);

-- Setelah membuat indeks, Anda harus membangun ulangnya untuk data yang sudah ada.
ALTER TABLE doc_table PARTITION (pt='20260730') REBUILD INDEX doc_vector_index;

Contoh: Buat indeks vektor dengan RaBitQ dan pengurutan ulang

CREATE VECTOR INDEX doc_vector_index
ON doc_table (embedding)
IDXPROPERTIES (
  'algorithm' = 'hgraph',
  'distance_type' = 'dot_product',
  'build_params' ='{
    "max_degree":48,
    "ef_construction":400,
    "base_quantization_type":"rabitq",
    "use_reorder":true,
    "precise_quantization_type":"fp32"
  }'
);