Pencarian vektor dengan Tablestore SDK for Java mengembalikan data terdekat dalam indeks pencarian berdasarkan kemiripan vektor, serta mendukung ambang batas skor, jumlah kandidat, dan filter non-vektor.
Prasyarat
Instal Tablestore SDK for Java dan inisialisasi klien. Pencarian vektor memerlukan versi 5.17.0 atau yang lebih baru.
Untuk mengonfigurasi
minScoreataunumCandidates, gunakan versi 5.17.5 atau yang lebih baru.
Deskripsi fitur
Pencarian vektor melakukan pencarian tetangga terdekat aproksimasi (approximate nearest neighbor/ANN) antara vektor kueri dan vektor dalam bidang Vector. Tablestore memberi skor hasil berdasarkan metrik jarak yang dikonfigurasi saat pembuatan indeks pencarian, lalu mengembalikan data terdekat. Berbeda dengan kueri yang mencocokkan nilai bidang, pencarian vektor menentukan kemiripan berdasarkan jarak antar vektor.
Panggil search dan atur query menjadi KnnVectorQuery.
SearchResponse search(SearchRequest request)
Contoh berikut mengambil tiga vektor dalam bidang embedding yang paling dekat dengan [1.0, 0.0, 0.0, 0.0]. Hasil diurutkan berdasarkan skor secara menurun.
String tableName = "example_table";
String indexName = "example_index";
KnnVectorQuery query = new KnnVectorQuery();
query.setFieldName("embedding");
query.setTopK(3);
query.setFloat32QueryVector(new float[]{1.0f, 0.0f, 0.0f, 0.0f});
SearchQuery searchQuery = new SearchQuery();
searchQuery.setQuery(query);
searchQuery.setLimit(3);
searchQuery.setSort(new Sort(Collections.singletonList(new ScoreSort())));
SearchRequest request = new SearchRequest(tableName, indexName, searchQuery);
SearchRequest.ColumnsToGet columnsToGet = new SearchRequest.ColumnsToGet();
columnsToGet.setReturnAll(true);
request.setColumnsToGet(columnsToGet);
SearchResponse response = client.search(request);
for (SearchHit hit : response.getSearchHits()) {
System.out.println(hit.getScore() + ": " + hit.getRow());
}
Batas berlaku untuk jumlah dan dimensi bidang vektor serta nilai topK. Untuk detailnya, lihat Batas indeks pencarian.
Parameter
Permintaan pencarian
request adalah objek SearchRequest yang berisi parameter berikut.
|
Name |
Type |
Description |
|
tableName (required) |
String |
Nama tabel. |
|
indexName (required) |
String |
Nama indeks pencarian. |
|
searchQuery (required) |
SearchQuery |
Kondisi kueri dan konfigurasi kueri umum. |
|
columnsToGet (optional) |
SearchRequest.ColumnsToGet |
Konfigurasi kolom yang dikembalikan. Jika parameter ini tidak dikonfigurasi, hanya kolom kunci primer yang dikembalikan. |
|
timeoutInMillisecond (optional) |
int |
Timeout kueri tingkat permintaan dalam milidetik. Nilai default: |
|
routingValues (optional) |
|
Nilai kunci primer dari bidang routing kustom. Biarkan parameter ini tidak diatur jika routing kustom tidak dikonfigurasi. |
Konfigurasi kueri
request.searchQuery adalah objek SearchQuery yang berisi parameter berikut.
|
Name |
Type |
Description |
|
query (required) |
Query |
Kondisi kueri. Atur parameter ini ke |
|
offset (optional) |
Integer |
Posisi awal kueri. |
|
limit (optional) |
Integer |
Jumlah maksimum baris yang dikembalikan. Jika parameter ini diatur ke |
|
highlight (optional) |
Highlight |
Konfigurasi ringkasan dan penyorotan. Bidang vektor tidak mendukung ringkasan dan penyorotan. |
|
collapse (optional) |
Collapse |
Konfigurasi collapse untuk menghilangkan duplikasi hasil berdasarkan kolom tertentu. |
|
sort (optional) |
Sort |
Urutan pengurutan hasil. Gunakan |
|
trackTotalCount (optional) |
int |
Jumlah maksimum baris yang cocok untuk dihitung. Nilai default: |
|
filter (optional) |
SearchFilter |
Filter yang diterapkan pada hasil |
|
aggregationList (optional) |
|
Konfigurasi agregasi. |
|
groupByList (optional) |
|
Konfigurasi pengelompokan. |
|
token (optional) |
byte[] |
Token paginasi. Atur parameter ini ke |
Kondisi kueri vektor
request.searchQuery.query adalah objek KnnVectorQuery yang berisi parameter berikut.
|
Name |
Type |
Description |
|
fieldName (required) |
String |
Nama bidang vektor. Bidang harus bertipe Vector, dan dimensi vektor kueri harus sesuai dengan dimensi yang dikonfigurasi saat Anda membuat indeks pencarian. |
|
topK (required) |
Integer |
Jumlah vektor terdekat yang diambil. Maksimum: |
|
float32QueryVector (required) |
float[] |
Vektor kueri Float32 yang digunakan untuk menghitung kemiripan. Panjang array harus sesuai dengan dimensi bidang vektor. |
|
filter (optional) |
Query |
Kondisi kueri non-vektor yang juga harus dipenuhi oleh hasil pencarian vektor. Anda dapat menggabungkan beberapa objek |
|
weight (optional) |
Float |
Bobot relevansi kueri vektor. Nilainya harus lebih besar atau sama dengan |
|
minScore (optional) |
Float |
Ambang batas skor minimum. Nilainya harus lebih besar atau sama dengan |
|
numCandidates (optional) |
Integer |
Jumlah kandidat yang diakses di setiap partisi indeks saat menghitung tetangga terdekat. Nilai valid: |
Kolom yang dikembalikan
request.columnsToGet adalah objek SearchRequest.ColumnsToGet yang berisi parameter berikut.
|
Name |
Type |
Description |
|
columns (optional) |
|
Kolom atribut yang dikembalikan. Konfigurasikan parameter ini hanya jika |
|
returnAll (optional) |
boolean |
Menentukan apakah semua kolom atribut dalam tabel akan dikembalikan. Nilai default: |
|
returnAllFromIndex (optional) |
boolean |
Menentukan apakah semua kolom atribut yang diindeks akan dikembalikan. Nilai default: |
Respons
Respons pencarian
search mengembalikan objek SearchResponse. Tabel berikut menjelaskan bidang intinya.
|
Name |
Type |
Description |
|
totalCount |
long |
Jumlah baris yang cocok. Panggil |
|
rows |
|
Baris yang dikembalikan oleh kueri ini. Panggil |
|
searchHits |
|
Hasil pencarian. Panggil |
|
nextToken |
byte[] |
Token untuk halaman berikutnya. Panggil |
|
isAllSuccess |
boolean |
Menunjukkan apakah semua partisi indeks telah dikueri. Panggil |
Hasil pencarian
Setiap elemen dalam response.searchHits[] adalah objek SearchHit yang berisi bidang inti berikut.
|
Name |
Type |
Description |
|
row |
Row |
Baris yang cocok. Panggil |
|
score |
Double |
Skor kueri vektor. Panggil |
Contoh
Filter berdasarkan kondisi non-vektor dan skor minimum
Gunakan filter untuk mewajibkan tetangga terdekat memenuhi kondisi kueri non-vektor, dan gunakan minScore untuk mengecualikan data yang skornya tidak melebihi ambang batas. Contoh berikut hanya mengembalikan data di mana category bernilai book, price kurang dari 4, dan skor vektornya lebih besar dari 0.6.
KnnVectorQuery filteredQuery = new KnnVectorQuery();
filteredQuery.setFieldName("embedding");
filteredQuery.setTopK(10);
filteredQuery.setFloat32QueryVector(
new float[]{1.0f, 0.0f, 0.0f, 0.0f});
filteredQuery.setMinScore(0.6f);
filteredQuery.setFilter(QueryBuilders.bool()
.must(QueryBuilders.term("category", "book"))
.must(QueryBuilders.range("price").lessThan(4)));
SearchQuery searchQuery = new SearchQuery();
searchQuery.setQuery(filteredQuery);
searchQuery.setLimit(10);
Menyesuaikan jumlah kandidat
Atur numCandidates untuk memperluas set kandidat yang diakses di setiap partisi indeks saat menghitung tetangga terdekat. Contoh berikut mengambil tiga vektor terdekat dari empat kandidat.
KnnVectorQuery candidateQuery = new KnnVectorQuery();
candidateQuery.setFieldName("embedding");
candidateQuery.setTopK(3);
candidateQuery.setFloat32QueryVector(
new float[]{1.0f, 0.0f, 0.0f, 0.0f});
candidateQuery.setNumCandidates(4);
SearchQuery candidateSearchQuery = new SearchQuery();
candidateSearchQuery.setQuery(candidateQuery);
candidateSearchQuery.setLimit(3);