All Products
Search
Document Center

Elasticsearch:Gunakan fitur pencarian kNN Elasticsearch

Last Updated:Mar 26, 2026

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 pencarianAntarmuka kueriPenyimpanan dalam memoriPersyaratan pemetaan
Pencarian kNN aproksimasiSearch API dengan parameter knnYaTetapkan index: true pada bidang dense_vector
Pencarian kNN eksakscript_score dengan fungsi vektorYaTetapkan 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_vector tidak mendukung agregasi atau pengurutan.

  • Bidang tipe nested tidak mendukung pencarian kNN aproksimasi.

  • Dalam skenario pencarian lintas klaster, parameter ccs_minimize_roundtrips tidak didukung dalam pencarian kNN.

  • Pencarian kNN menggunakan tipe pencarian dfs_query_then_fetch secara default. Parameter search_type tidak 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.

ParameterDeskripsi
typeAtur ke dense_vector.
dimsJumlah dimensi per vektor. Maksimum 1024 jika index: true, dan 2048 jika index: false.
indexAtur ke true untuk membangun indeks HNSW guna pencarian kNN aproksimasi. Default: false.
similarityAlgoritma kemiripan yang digunakan untuk memberi skor kecocokan. Wajib ditentukan jika index: true. Lihat tabel di bawah.

Algoritma kemiripan yang didukung

NilaiAlgoritmaRumus skor
l2_normJarak Euclidean1 / (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 sama0.5 + (dot_product(query, vector) / (32768 × dims))
cosineKemiripan kosinus(1 + cosine(query, vector)) / 2
Penting

Algoritma cosine tidak mendukung vektor dengan nilai 0.

Catatan

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.

ParameterWajibDeskripsi
fieldYaNama bidang dense_vector yang akan dicari.
query_vectorYaVektor kueri. Harus memiliki jumlah dimensi yang sama dengan bidang target.
kYaJumlah tetangga terdekat yang dikembalikan. Harus kurang dari num_candidates.
num_candidatesYaJumlah kandidat tetangga terdekat yang dievaluasi per shard. Maksimum: 10.000. Nilai yang lebih besar meningkatkan akurasi tetapi menambah latensi.
filterTidakFilter 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"
      }
    }
  }
}
ParameterDeskripsi
typeAtur ke dense_vector.
dimsJumlah dimensi per vektor.
indexDefault: 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.

FungsiDeskripsi
cosineSimilarityKemiripan kosinus antara vektor kueri dan vektor dokumen
dotProductDot product dari vektor kueri dan vektor dokumen
l1normJarak L1 (jarak Manhattan) antara vektor kueri dan vektor dokumen
l2normJarak L2 (Jarak Euclidean) antara vektor kueri dan vektor dokumen

Langkah selanjutnya