Alibaba Cloud Elasticsearch V8.0 dan versi setelahnya mendukung pencarian k-nearest neighbor (kNN), yang menemukan vektor paling mirip dengan vektor kueri. Pencarian kNN mendukung berbagai kasus penggunaan, seperti:
Pencarian gambar dan sidik jari video: Temukan gambar yang secara visual mirip atau segmen video yang hampir duplikat.
Pengenalan wajah dan suara: Cocokkan vektor biometrik dengan profil yang tersimpan.
Rekomendasi produk: Ambil item yang vektor fiturnya paling dekat dengan vektor preferensi pengguna.
Cara kerja
Simpan data Anda sebagai bidang dense_vector dalam Indeks Elasticsearch. Saat menjalankan pencarian kNN, Elasticsearch menghitung kemiripan antara vektor kueri dan setiap vektor dokumen, lalu mengembalikan k kecocokan terdekat.
Tersedia dua metode pencarian:
| Metode pencarian | Antarmuka kueri | Penyimpanan dalam memori | Persyaratan pemetaan |
|---|---|---|---|
| Pencarian kNN aproksimasi | Search API dengan parameter knn | Ya | Tetapkan index: true pada bidang dense_vector |
| Pencarian kNN eksak | script_score dengan fungsi vektor | Ya | Tetapkan index: false atau biarkan kosong |
Dalam sebagian besar kasus, gunakan pencarian kNN aproksimasi. Metode ini menghasilkan latensi lebih rendah dengan sedikit penurunan akurasi. Sebaliknya, pencarian kNN eksak menjamin hasil yang tepat tetapi melakukan pemindaian brute-force terhadap semua dokumen yang cocok, sehingga tidak cocok untuk set data berskala besar.
Prasyarat
Sebelum memulai, pastikan Anda telah memiliki:
Kluster Alibaba Cloud Elasticsearch V8.x. Panduan ini menggunakan V8.5.1 sebagai contoh. Untuk instruksi penyiapan, lihat Buat kluster Alibaba Cloud Elasticsearch.
Data bisnis yang telah dikonversi ke representasi vektor dan disimpan dalam bidang
dense_vector. Rancang vektor Anda sehingga dokumen yang lebih mirip dengan kueri memiliki vektor yang lebih dekat dengan vektor kueri, berdasarkan metrik kemiripan yang Anda pilih.
Catatan penggunaan
Bidang
dense_vectortidak mendukung agregasi atau pengurutan.Bidang tipe
nestedtidak mendukung pencarian kNN aproksimasi.Dalam skenario pencarian lintas klaster, parameter
ccs_minimize_roundtripstidak didukung dalam pencarian kNN.Pencarian kNN menggunakan tipe pencarian
dfs_query_then_fetchsecara default. Parametersearch_typetidak dapat diatur secara eksplisit saat menjalankan pencarian kNN.
Pencarian kNN aproksimasi
Pertimbangan performa
Pencarian kNN aproksimasi menggunakan graf Hierarchical Navigable Small World (HNSW) untuk mengindeks vektor padat per segmen. Membangun graf HNSW selama pengindeksan membutuhkan sumber daya tinggi. Untuk menjaga performa stabil:
Tingkatkan periode timeout klien dan gunakan permintaan tulis bulk saat mengindeks data vektor.
Kurangi jumlah segmen, atau gabungkan semua segmen menjadi satu, untuk meningkatkan kecepatan pencarian.
Pastikan memori node data melebihi ukuran gabungan semua data vektor dan struktur indeks HNSW.
Hindari operasi tulis atau pembaruan besar saat pencarian kNN aproksimasi sedang berjalan.
Buat indeks
Tetapkan index: true dan konfigurasikan parameter similarity saat mendefinisikan bidang dense_vector.
PUT image-index
{
"mappings": {
"properties": {
"image-vector": {
"type": "dense_vector",
"dims": 3,
"index": true,
"similarity": "l2_norm"
},
"title": {
"type": "text"
},
"file-type": {
"type": "keyword"
}
}
}
}Parameter bidang `dense_vector`
Untuk referensi lengkap parameter, lihat dense-vector.
| Parameter | Deskripsi |
|---|---|
type | Atur ke dense_vector. |
dims | Jumlah dimensi per vektor. Maksimum 1024 jika index: true, dan 2048 jika index: false. |
index | Atur ke true untuk membangun indeks HNSW guna pencarian kNN aproksimasi. Default: false. |
similarity | Algoritma kemiripan yang digunakan untuk memberi skor kecocokan. Wajib ditentukan jika index: true. Lihat tabel di bawah. |
Algoritma kemiripan yang didukung
| Nilai | Algoritma | Rumus skor |
|---|---|---|
l2_norm | Jarak Euclidean | 1 / (1 + l2_norm(query, vector)^2) |
dot_product (float) | Dot product — kedua vektor harus dinormalisasi ke panjang satuan | (1 + dot_product(query, vector)) / 2 |
dot_product (byte) | Dot product — kedua vektor harus memiliki panjang yang sama | 0.5 + (dot_product(query, vector) / (32768 × dims)) |
cosine | Kemiripan kosinus | (1 + cosine(query, vector)) / 2 |
Algoritma cosine tidak mendukung vektor dengan nilai 0.
Pencarian kNN aproksimasi didukung di Elasticsearch V8.0 dan versi setelahnya. Jika kluster Anda ditingkatkan dari versi sebelum V8.0, buat ulang indeks dan atur index: true pada semua bidang dense_vector sebelum menjalankan pencarian kNN aproksimasi.
Tulis data
POST image-index/_bulk?refresh=true
{ "index": { "_id": "1" } }
{ "image-vector": [1, 5, -20], "title": "moose family", "file-type": "jpg" }
{ "index": { "_id": "2" } }
{ "image-vector": [42, 8, -15], "title": "alpine lake", "file-type": "png" }
{ "index": { "_id": "3" } }
{ "image-vector": [15, 11, 23], "title": "full moon", "file-type": "jpg" }Jalankan pencarian kNN aproksimasi
Gunakan parameter knn dalam Search API. API pencarian kNN telah ditinggalkan (deprecated) di Elasticsearch V8.4 dan versi setelahnya.
POST image-index/_search
{
"knn": {
"field": "image-vector",
"query_vector": [-5, 9, -12],
"k": 10,
"num_candidates": 100
},
"fields": [ "title", "file-type" ]
}Parameter pencarian kNN
Untuk referensi lengkap parameter, lihat Search API.
| Parameter | Wajib | Deskripsi |
|---|---|---|
field | Ya | Nama bidang dense_vector yang akan dicari. |
query_vector | Ya | Vektor kueri. Harus memiliki jumlah dimensi yang sama dengan bidang target. |
k | Ya | Jumlah tetangga terdekat yang dikembalikan. Harus kurang dari num_candidates. |
num_candidates | Ya | Jumlah kandidat tetangga terdekat yang dievaluasi per shard. Maksimum: 10.000. Nilai yang lebih besar meningkatkan akurasi tetapi menambah latensi. |
filter | Tidak | Filter DSL kueri yang diterapkan selama pencarian. Mengembalikan k dokumen teratas yang sesuai dengan filter. Jika diabaikan, semua dokumen dipertimbangkan. |
Pencarian kNN eksak
Buat indeks
Tetapkan index: false (atau biarkan kosong) untuk melewati pembuatan indeks HNSW.
PUT zl-index
{
"mappings": {
"properties": {
"product-vector": {
"type": "dense_vector",
"dims": 5,
"index": false
},
"price": {
"type": "long"
}
}
}
}| Parameter | Deskripsi |
|---|---|
type | Atur ke dense_vector. |
dims | Jumlah dimensi per vektor. |
index | Default: false. Atur ke false atau biarkan kosong untuk meningkatkan efisiensi pencarian kNN eksak. |
Tulis data
POST zl-index/_bulk?refresh=true
{ "index": { "_id": "1" } }
{ "product-vector": [230.0, 300.33, -34.8988, 15.555, -200.0], "price": 1599 }
{ "index": { "_id": "2" } }
{ "product-vector": [-0.5, 100.0, -13.0, 14.8, -156.0], "price": 799 }
{ "index": { "_id": "3" } }
{ "product-vector": [0.5, 111.3, -13.0, 14.8, -156.0], "price": 1099 }Jalankan pencarian kNN eksak
Gunakan kueri script_score dengan fungsi vektor. Contoh berikut menggunakan cosineSimilarity dan menerapkan filter untuk membatasi dokumen yang dievaluasi oleh fungsi vektor — mengurangi jumlah dokumen yang dipindai meningkatkan performa.
POST zl-index/_search
{
"query": {
"script_score": {
"query": {
"bool": {
"filter": {
"range": {
"price": {
"gte": 1000
}
}
}
}
},
"script": {
"source": "cosineSimilarity(params.queryVector, 'product-vector') + 1.0",
"params": {
"queryVector": [-0.5, 90.0, -10, 14.8, -156.0]
}
}
}
}
}Fungsi vektor yang didukung
Untuk referensi lengkap fungsi, lihat Fungsi untuk bidang vektor.
| Fungsi | Deskripsi |
|---|---|
cosineSimilarity | Kemiripan kosinus antara vektor kueri dan vektor dokumen |
dotProduct | Dot product dari vektor kueri dan vektor dokumen |
l1norm | Jarak L1 (jarak Manhattan) antara vektor kueri dan vektor dokumen |
l2norm | Jarak L2 (Jarak Euclidean) antara vektor kueri dan vektor dokumen |
Langkah selanjutnya
Pencarian k-nearest neighbor (kNN) — dokumentasi referensi Elasticsearch