Alibaba Cloud Elasticsearch V8.0 dan versi lebih baru menyediakan fitur pencarian k-tetangga terdekat (kNN). Fitur ini memungkinkan Anda menggunakan ruang vektor secara efisien untuk memenuhi kebutuhan bisnis dalam berbagai skenario pencarian, seperti pencarian gambar, sidik jari video, pengenalan wajah, pengenalan suara, dan rekomendasi produk. Topik ini menjelaskan cara menggunakan fitur pencarian kNN.
Informasi latar belakang
Untuk informasi lebih lanjut tentang fitur pencarian kNN dari Elasticsearch, lihat Pencarian k-tetangga terdekat (kNN).
Prasyarat
- Sebuah kluster Alibaba Cloud Elasticsearch V8.X telah dibuat. Dalam contoh ini, sebuah kluster Alibaba Cloud Elasticsearch V8.5.1 dibuat. Untuk informasi lebih lanjut, lihat Buat Kluster Alibaba Cloud Elasticsearch.
- Data bisnis dikonversi menjadi data vektor, dan data vektor disimpan di bidang tipe dense_vector. Anda dapat merancang vektor berdasarkan metrik kemiripan. Jika vektor dokumen lebih dekat dengan vektor kueri, tingkat kemiripannya lebih tinggi.
Peringatan
- Anda harus menyimpan data vektor di bidang tipe dense_vector. Bidang tipe dense_vector tidak mendukung operasi agregasi atau pengurutan.
- Bidang tipe nested tidak mendukung pencarian kNN perkiraan.
- Jika Anda menggunakan fitur pencarian kNN dalam skenario pencarian lintas kluster, parameter ccs_minimize_roundtrips tidak didukung.
- Secara default, pencarian kNN menggunakan tipe pencarian dfs_query_then_fetch. Saat menggunakan fitur pencarian kNN, Anda tidak dapat mengonfigurasi parameter search_type secara eksplisit.
Metode pencarian yang didukung oleh pencarian kNN
Pencarian kNN mendukung dua metode pencarian: Pencarian kNN Perkiraan dan Pencarian kNN Tepat. Tabel berikut menjelaskan perbedaan antara kedua metode tersebut.
| Metode pencarian | Antarmuka kueri | Penyimpanan dalam memori | Persyaratan pemetaan | Deskripsi |
| Pencarian kNN perkiraan | Gunakan API pencarian untuk mengonfigurasi parameter kNN. | Ya | Anda harus menyetel parameter indeks ke true untuk bidang tipe dense_vector untuk mengaktifkan pencarian kNN perkiraan. null Metode pencarian kNN perkiraan didukung di Elasticsearch V8.0 dan versi lebih baru. Di versi sebelumnya Elasticsearch, Anda tidak dapat menyetel parameter indeks ke true di pemetaan untuk bidang tipe dense_vector. Jika kluster Elasticsearch Anda ditingkatkan dari versi sebelum V8.0 ke V8.5 dan Anda ingin melakukan pencarian kNN di kluster tersebut, pastikan bahwa indeks yang Anda buat berisi bidang tipe dense_vector. Untuk melakukan pencarian kNN perkiraan, Anda juga harus membuat ulang indeks dan menyetel parameter indeks ke true di pemetaan untuk indeks tersebut. | Pencarian kNN perkiraan mengorbankan beberapa kecepatan pengindeksan dan akurasi demi latensi yang lebih rendah. |
| Pencarian kNN tepat | Gunakan query script_score dengan fungsi vektor. | Ya | Anda dapat menyetel parameter indeks ke false atau biarkan parameter kosong untuk bidang tipe dense_vector untuk meningkatkan efisiensi pencarian. | Query script_score memindai setiap dokumen yang cocok untuk menghitung fungsi vektor. Ini memperlambat kecepatan pencarian. Anda dapat mengonfigurasi klausa query untuk membatasi jumlah dokumen yang dapat dilewatkan ke fungsi vektor untuk meningkatkan efisiensi pencarian. |
Pencarian kNN perkiraan
Optimalkan kinerja
Metode pencarian kNN perkiraan membantu Anda menemukan k vektor yang paling dekat dengan vektor kueri secara cepat. Logika metode pencarian ini berbeda dari metode pencarian lainnya. Metode pencarian kNN perkiraan memiliki persyaratan khusus untuk kinerja kluster Elasticsearch. Anda dapat mengoptimalkan kinerja kluster Elasticsearch Anda berdasarkan instruksi berikut:
- Elasticsearch menyimpan vektor padat dari setiap segmen dalam grafik Hierarchical Navigable Small World (HNSW). Pembuatan grafik HNSW memerlukan waktu lama selama pengindeksan data vektor. Kami merekomendasikan agar Anda meningkatkan periode timeout klien dan menggunakan permintaan penulisan massal untuk menulis data.
- Anda dapat mengurangi jumlah segmen indeks atau menggabungkan semua segmen indeks menjadi satu segmen untuk meningkatkan efisiensi pencarian.
- Pastikan bahwa ruang memori node data di kluster Elasticsearch Anda lebih besar dari total ruang yang ditempati oleh semua data vektor dan struktur indeks.
- Jangan tulis sejumlah besar data atau perbarui data di kluster Elasticsearch Anda selama pencarian kNN perkiraan.
Buat indeks
Saat membuat indeks untuk melakukan pencarian kNN perkiraan, atur parameter indeks ke true dan konfigurasikan parameter kemiripan dalam pemetaan untuk indeks. Kode berikut memberikan contoh konfigurasi:
PUT image-index
{
"mappings": {
"properties": {
"image-vector": {
"type": "dense_vector",
"dims": 3,
"index": true,
"similarity": "l2_norm"
},
"title": {
"type": "text"
},
"file-type": {
"type": "keyword"
}
}
}
}Tabel berikut menjelaskan parameter yang digunakan untuk mendefinisikan pengaturan terkait bidang tipe dense_vector. Untuk informasi lebih lanjut, lihat dense-vector.| Parameter | Deskripsi |
| type | Tipe data bidang yang digunakan untuk menyimpan angka floating-point. Atur parameter ini ke dense_vector. |
| dims | Jumlah dimensi untuk setiap vektor. Jika Anda menyetel parameter indeks ke true, nilai parameter dims tidak boleh melebihi 1024. Jika Anda menyetel parameter indeks ke false, nilai parameter dims tidak boleh melebihi 2048. |
| indeks | Menentukan apakah akan menghasilkan indeks baru untuk pencarian kNN perkiraan. Untuk melakukan pencarian kNN perkiraan, atur parameter indeks ke true. Nilai default: false. |
| kemiripan | Algoritma yang digunakan untuk menghitung kemiripan antara vektor kueri dan vektor dokumen. Jika Anda menyetel parameter indeks ke true, Anda harus mengonfigurasi parameter ini. Nilai valid:
|
Tulis data
POST image-index/_bulk?refresh=true
{ "index": { "_id": "1" } }
{ "image-vector": [1, 5, -20], "title": "keluarga moose", "file-type": "jpg" }
{ "index": { "_id": "2" } }
{ "image-vector": [42, 8, -15], "title": "danau alpen", "file-type": "png" }
{ "index": { "_id": "3" } }
{ "image-vector": [15, 11, 23], "title": "bulan purnama", "file-type": "jpg" }Lakukan pencarian kNN perkiraan
Untuk melakukan pencarian kNN perkiraan, Anda harus gunakan API pencarian untuk mengonfigurasi parameter kNN.
null API pencarian kNN sudah tidak digunakan lagi di Elasticsearch versi lebih baru dari V8.4. Anda dapat mengonfigurasi parameter kNN di API pencarian untuk melakukan pencarian kNN perkiraan.
POST image-index/_search
{
"knn": {
"field": "image-vector",
"query_vector": [-5, 9, -12],
"k": 10,
"num_candidates": 100
},
"fields": [ "title", "file-type" ]
}Tabel berikut menjelaskan parameter kNN. Untuk informasi lebih lanjut, lihat API Pencarian.| Parameter | Diperlukan | Deskripsi |
| field | Ya | Nama bidang vektor yang ingin Anda cari. |
| query_vector | Ya | Vektor kueri. Vektor kueri harus memiliki jumlah dimensi yang sama dengan bidang vektor yang ditentukan oleh parameter field. |
| k | Ya | Jumlah tetangga terdekat yang akan dikembalikan. Nilai parameter k harus kurang dari nilai parameter num_candidates. |
| num_candidates | Ya | Jumlah kandidat tetangga terdekat yang perlu dicari per shard. Nilai tidak boleh melebihi 10000. null Semakin besar nilai parameter num_candidates, semakin tinggi akurasi nilai parameter k. Namun, kecepatan pencarian melambat. |
| filter | Tidak | Pernyataan Domain Specific Language (DSL) yang digunakan untuk menyaring dokumen. Pencarian kNN perkiraan mengembalikan k dokumen teratas yang sesuai dengan kondisi filter. Jika Anda tidak mengonfigurasi parameter ini, semua dokumen cocok. |
Pencarian kNN tepat
Buat indeks
PUT zl-index
{
"mappings": {
"properties": {
"product-vector": {
"type": "dense_vector",
"dims": 5,
"index": false
},
"price": {
"type": "long"
}
}
}
}Tabel berikut menjelaskan beberapa parameter yang digunakan untuk mendefinisikan pengaturan terkait bidang tipe dense_vector. Untuk informasi lebih lanjut, lihat dense-vector.
| Parameter | Deskripsi |
| type | Tipe data bidang yang digunakan untuk menyimpan angka floating-point. Atur parameter ini ke dense_vector. |
| dim | Jumlah dimensi untuk setiap vektor. |
| indeks | Menentukan apakah akan menghasilkan indeks baru untuk pencarian kNN tepat. Nilai default: false. Untuk pencarian kNN tepat, parameter indeks bersifat opsional. Anda dapat membiarkan parameter ini kosong atau menyetel parameter ini ke false untuk meningkatkan efisiensi pencarian kNN tepat. |
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 }Lakukan pencarian kNN tepat
Kode berikut menunjukkan cara menentukan fungsi vektor cosineSimilarity dalam query script_score dan mengonfigurasi kondisi filter dalam parameter script_score.query untuk membatasi jumlah dokumen yang dilewatkan ke fungsi vektor.
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]
}
}
}
}
}Tabel berikut menjelaskan fungsi vektor yang didukung oleh query script_score. Untuk informasi lebih lanjut, lihat Fungsi untuk Bidang Vektor di dokumentasi Elasticsearch open source.
| Fungsi | Deskripsi |
| cosineSimilarity | Menghitung kemiripan kosinus antara vektor kueri dan vektor dokumen. |
| dotProduct | Menghitung produk titik dari vektor kueri dan vektor dokumen. |
| l1norm | Menghitung jarak L1 (jarak Manhattan) antara vektor kueri dan vektor dokumen. |
| l2norm | Menghitung jarak L2 (jarak Euclidean) antara vektor kueri dan vektor dokumen. |