Gunakan Tablestore SDK untuk Python untuk mengambil data tetangga terdekat dari search index berdasarkan kemiripan vektor.
Prasyarat
Instal Tablestore SDK untuk Python dan inisialisasi klien.
Fitur pencarian vektor memerlukan SDK versi 5.4.4 atau lebih baru. Disarankan untuk menggunakan versi SDK terbaru.
Search index yang berisi bidang Vector telah dibuat untuk tabel data.
Deskripsi
Pencarian vektor melakukan perhitungan approximate nearest neighbor (ANN) antara vektor kueri dan vektor dalam bidang Vector, memberikan skor hasil berdasarkan metrik jarak yang dikonfigurasi pada search index, lalu mengembalikan data tetangga terdekat. Dimensi bidang harus sama dengan dimensi vektor kueri.
KnnVectorQuery(
field_name,
top_k=None,
float32_query_vector=None,
filter=None,
weight=None,
min_score=None,
num_candidates=None,
)
Contoh berikut mengkueri tiga baris terdekat ke vektor empat dimensi tertentu dan mengembalikannya dalam urutan skor vektor menurun.
query = KnnVectorQuery(
"embedding",
top_k=3,
float32_query_vector=[1.0, 0.0, 0.0, 0.0],
)
response = client.search(
"example_table",
"example_index",
SearchQuery(
query,
sort=Sort([ScoreSort()]),
limit=3,
get_total_count=False,
),
ColumnsToGet(return_type=ColumnReturnType.ALL),
)
for hit in response.search_hits:
print(hit.score, hit.row)
Jangan atur get_total_count ke True untuk pencarian vektor. Terdapat batasan pada jumlah dan dimensi bidang vektor serta pada top_k. Untuk informasi selengkapnya, lihat Batasan search index.
Parameter
Permintaan pencarian
Metode search mencakup parameter berikut.
|
Nama |
Type |
Deskripsi |
|
table_name (wajib) |
|
Nama tabel data. |
|
index_name (wajib) |
|
Nama search index. |
|
search_query (wajib) |
|
Kondisi kueri dan konfigurasi kueri umum. |
|
columns_to_get (opsional) |
|
Konfigurasi kolom yang dikembalikan. Jika parameter ini tidak ditentukan, hanya kolom kunci primer yang dikembalikan. |
|
routing_keys (opsional) |
|
Nilai kunci primer dari bidang routing kustom. Parameter ini tidak diperlukan jika routing kustom tidak dikonfigurasi. |
|
timeout_s (opsional) |
|
Timeout permintaan dalam detik. Jika parameter ini tidak ditentukan, timeout tingkat client akan digunakan. |
Konfigurasi kueri
search_query bertipe SearchQuery dan mencakup parameter berikut.
|
Nama |
Tipe |
Deskripsi |
|
query (wajib) |
|
Kondisi kueri. Atur parameter ini ke |
|
sort (opsional) |
|
Urutan pengurutan hasil. Untuk informasi selengkapnya, lihat Mengurutkan dan membagi halaman hasil. |
|
get_total_count (opsional) |
|
Pencarian vektor tidak mendukung pelacakan jumlah total. Biarkan parameter ini diatur ke |
|
next_token (opsional) |
|
Token paginasi. Teruskan |
|
offset (opsional) |
|
Offset tempat kueri dimulai. Gunakan parameter ini untuk paginasi dangkal. |
|
limit (opsional) |
|
Jumlah maksimum baris yang dikembalikan. Jika parameter ini diatur ke |
|
aggs (opsional) |
|
Konfigurasi agregasi metrik. Untuk informasi selengkapnya, lihat Agregasi. |
|
group_bys (opsional) |
|
Konfigurasi pengelompokan. Untuk informasi selengkapnya, lihat Agregasi. |
|
collapse_field (opsional) |
|
Konfigurasi collapse hasil. Untuk informasi selengkapnya, lihat Collapse hasil kueri. |
Kondisi kueri vektor
search_query.query bertipe KnnVectorQuery dan mencakup parameter berikut.
|
Nama |
Type |
Deskripsi |
|
field_name (wajib) |
|
Nama bidang Vector. |
|
top_k (wajib) |
|
Jumlah vektor terdekat yang dikueri. Nilai maksimum: |
|
float32_query_vector (wajib) |
|
Vektor kueri Float32 yang digunakan untuk menghitung kemiripan. Panjangnya harus sama dengan dimensi bidang vektor. |
|
filter (opsional) |
|
Kondisi non-vektor yang juga harus dipenuhi oleh data tetangga terdekat. Gunakan |
|
weight (opsional) |
|
Bobot kueri vektor, yang harus lebih besar atau sama dengan |
|
min_score (opsional) |
|
Ambang batas skor minimum, yang harus lebih besar atau sama dengan |
|
num_candidates (opsional) |
|
Jumlah kandidat yang dikunjungi pada setiap partisi indeks. Nilai valid: |
Kolom yang dikembalikan
columns_to_get bertipe ColumnsToGet dan mencakup parameter berikut.
|
Nama |
Tipe |
Deskripsi |
|
column_names (opsional) |
|
Nama kolom atribut yang dikembalikan. Tentukan parameter ini hanya saat |
|
return_type (opsional) |
|
Mode kolom yang dikembalikan. |
Respons
Metode search mengembalikan objek SearchResponse. Tabel berikut menjelaskan bidang intinya.
|
Bidang |
Tipe |
Deskripsi |
|
rows |
|
Baris yang dikembalikan oleh kueri. Jumlahnya tidak melebihi |
|
next_token |
|
Token untuk halaman berikutnya. Nilai kosong menunjukkan tidak ada data tambahan yang tersedia. |
|
total_count |
|
Pencarian vektor tidak mendukung pelacakan jumlah total. Jangan gunakan bidang ini. |
|
is_all_succeed |
|
Menunjukkan apakah semua partisi indeks telah dikueri. Jika nilainya |
|
agg_results |
|
Hasil agregasi metrik. Bidang ini kosong jika |
|
group_by_results |
|
Hasil pengelompokan. Bidang ini kosong jika |
|
search_hits |
|
Hit pencarian, termasuk informasi tambahan seperti baris, skor relevansi, dan sorotan. |
Respons kompatibel tupel
Mulai dari Tablestore SDK untuk Python versi 5.2.0, API pencarian mengembalikan objek respons, bukan tupel. Versi 5.1.0 dan sebelumnya langsung mengembalikan tupel. Pada versi 5.2.1 dan seterusnya, Anda dapat memanggil SearchResponse.v1_response() untuk mendapatkan tupel yang kompatibel dengan versi sebelumnya. Untuk kode baru, akses atribut SearchResponse secara langsung guna menghindari error unpacking jika bidang respons diperluas.
(
rows,
next_token,
total_count,
is_all_succeed,
agg_results,
group_by_results,
search_hits,
) = response.v1_response()
Contoh
Filter berdasarkan kondisi non-vektor dan skor
Contoh berikut mengembalikan baris tetangga terdekat yang nilai category-nya diawali dengan book- dan skor vektornya lebih besar dari 0.1. Tiga baris teratas dipilih dari 10 kandidat pada setiap partisi indeks.
query = KnnVectorQuery(
"embedding",
top_k=3,
float32_query_vector=[1.0, 0.0, 0.0, 0.0],
filter=PrefixQuery("category", "book-"),
min_score=0.1,
num_candidates=10,
)
response = client.search(
"example_table",
"example_index",
SearchQuery(query, limit=3, get_total_count=False),
)
for hit in response.search_hits:
print(hit.score, hit.row)