全部产品
Search
文档中心

Elasticsearch:Gunakan plug-in aliyun-knn

更新时间:Jun 24, 2025

Plug-in aliyun-knn adalah mesin pencarian vektor yang dikembangkan oleh tim Elasticsearch Alibaba Cloud. Plug-in ini menggunakan pustaka vektor Proxima, sebuah mesin pencarian vektor yang dirancang oleh Akademi DAMO Alibaba. Plug-in ini mendukung berbagai skenario seperti pencarian gambar, sidik jari video, pengenalan wajah dan suara, serta rekomendasi produk. Topik ini menjelaskan cara menggunakan plug-in aliyun-knn.

null
  • Topik ini hanya untuk referensi. Plug-in aliyun-knn digunakan oleh kluster Elasticsearch versi sebelumnya yang sudah ada.

  • Disarankan untuk membeli kluster Elasticsearch versi V8.15 atau lebih baru agar dapat langsung menggunakan kemampuan pencarian vektor asli yang disediakan oleh kernel mesin untuk mengimplementasikan bisnis pencarian vektor baru.

Informasi latar belakang

  • Skema Penggunaan

    Mesin pencarian vektor Alibaba Cloud Elasticsearch digunakan dalam banyak skenario produksi di dalam Grup Alibaba, seperti Pailitao, Image Search, sidik jari video Youku, sidik jari video Qutoutiao, rekomendasi produk Taobao, pencarian kustom, dan pencarian Crossmedia.

  • Prinsip

    Fitur pencarian vektor Alibaba Cloud Elasticsearch diimplementasikan berdasarkan plug-in aliyun-knn. Plug-in ini kompatibel dengan semua versi open source Elasticsearch, sehingga Anda dapat menggunakannya tanpa biaya pembelajaran tambahan. Selain sinkronisasi penambahan real-time dan pencarian near-real-time (NRT), indeks vektor mendukung fitur lain dari open source Elasticsearch dalam pencarian terdistribusi, seperti beberapa shard replika dan pemulihan.

    null

    Plug-in aliyun-knn tidak mendukung migrasi data yang dilakukan menggunakan snapshot di Object Storage Service (OSS) atau menggunakan DataWorks. Jika Anda ingin memigrasi data, disarankan menggunakan Logstash.

  • Algoritma

    Plug-in aliyun-knn mendukung algoritma Hierarchical Navigable Small World (HNSW) dan Linear Search. Algoritma-algoritma ini cocok untuk memproses sejumlah kecil data dari penyimpanan in-memory. Deskripsi berikut memberikan perbandingan antara kinerja algoritma-algoritma tersebut.

    Tabel 1. Perbandingan antara kinerja HNSW dan Linear Search

    Tabel berikut mencantumkan metrik kinerja kedua algoritma pada kluster Alibaba Cloud Elasticsearch V6.7.0. Konfigurasi lingkungan pengujian:

    • Konfigurasi kluster: dua node data, masing-masing menawarkan 16 vCPU, 64 GiB memori, dan satu SSD standar 100-GiB.

    • Dataset: vektor float 128 dimensi SIFT.

    • Total catatan data: 20 juta.

    • Pengaturan indeks: pengaturan default.

    Metrik Kinerja

    HNSW

    Linear Search

    Rasio recall Top-10

    98,6%

    100%

    Rasio recall Top-50

    97,9%

    100%

    Rasio recall Top-100

    97,4%

    100%

    Latensi (p99)

    0,093 detik

    0,934 detik

    Latensi (p90)

    0,018 detik

    0,305 detik

    null

    p adalah singkatan dari persentase. Misalnya, latensi (p99) menunjukkan jumlah detik yang diperlukan untuk merespons 99% permintaan.

Prasyarat

  • Plug-in aliyun-knn telah diinstal. Apakah plug-in ini diinstal secara default ditentukan oleh versi kluster Elasticsearch Anda dan versi kernel kluster Elasticsearch Anda.

    Versi Kluster

    Versi Kernel

    Deskripsi

    V6.7.0

    Lebih awal dari V1.2.0

    • Anda harus menginstal plug-in aliyun-knn secara manual di halaman Plug-in konsol Elasticsearch berdasarkan instruksi yang diberikan di Instal dan hapus plug-in bawaan.

    • Anda tidak dapat menggunakan fitur query script dan pemanasan indeks dari plug-in aliyun-knn. Jika Anda ingin menggunakan fitur-fitur ini, kami merekomendasikan Anda menggunakan kluster Elasticsearch dengan kernel AliES. Untuk informasi lebih lanjut, lihat Catatan rilis AliES.

    • Saat membuat indeks vektor, Anda hanya dapat mengatur parameter distance_method ke nilai defaultnya SquaredEuclidean.

    V6.8

    Tidak ada

    V7.4

    Tidak ada

    V7.7

    Tidak ada

    V6.7.0

    V1.2.0 atau lebih baru

    • Plug-in aliyun-knn terintegrasi ke dalam plug-in apack, yang diinstal secara default. Jika Anda ingin menghapus atau menginstal ulang plug-in aliyun-knn, Anda harus melakukan operasi pada plug-in apack. Untuk informasi lebih lanjut, lihat Gunakan fitur replikasi fisik dari plug-in apack.

    • Anda dapat menggunakan fitur query script dan pemanasan indeks serta fungsi ekstensi dari plug-in aliyun-knn. Sebelum menggunakan fitur dan fungsi tersebut, pastikan bahwa versi kernel kluster Anda adalah V1.3.0 atau lebih baru. Untuk informasi lebih lanjut, lihat Tingkatkan versi kluster.

    • Jika kesalahan parsing mapping dilaporkan saat Anda membuat indeks vektor, tingkatkan versi kernel kluster Anda ke V1.3.0 atau lebih baru dan coba lagi.

    V7.10.0

    V1.4.0 atau lebih baru

    • Plug-in aliyun-knn terintegrasi ke dalam plug-in apack, yang diinstal secara default. Jika Anda ingin menghapus atau menginstal ulang plug-in aliyun-knn, Anda harus melakukan operasi pada plug-in apack. Untuk informasi lebih lanjut, lihat Gunakan fitur replikasi fisik dari plug-in apack.

    • Jika versi kernel kluster Anda adalah V1.4.0 atau lebih baru, versi plug-in apack adalah yang terbaru. Anda dapat menjalankan perintah GET _cat/plugins?v untuk mendapatkan versi plug-in apack.

    Versi lainnya

    Tidak ada

    Fitur pencarian vektor tidak didukung.

    null

    Versi kernel berbeda dari versi plug-in apack. Anda dapat menjalankan perintah GET _cat/plugins?v untuk mendapatkan versi plug-in apack.

  • Indeks direncanakan untuk kluster Anda.

    Algoritma

    Skema Penggunaan

    Penyimpanan In-Memory

    Catatan

    HNSW

    • Setiap node hanya menyimpan volume data kecil.

    • Latensi respons rendah diperlukan.

    • Rasio recall tinggi diperlukan.

    Ya

    • HNSW didasarkan pada algoritma pencarian serakah dan mematuhi ketidaksamaan segitiga. Ketidaksamaan segitiga menyatakan bahwa total biaya dari A ke B dan biaya dari B ke C harus lebih besar daripada biaya dari A ke C. Ruang produk dalam tidak mematuhi ketidaksamaan segitiga. Dalam kasus ini, Anda harus mengubahnya menjadi ruang Euklides atau ruang bola sebelum menggunakan algoritma HNSW.

    • Setelah Anda menulis data ke kluster Elasticsearch Alibaba Cloud Anda, kami merekomendasikan Anda memanggil API force merge secara berkala selama jam-jam sepi untuk menggabungkan segmen dalam shard. Ini mengurangi latensi respons.

    Linear Search

    • Pencarian brute-force perlu dilakukan.

    • Rasio recall 100% diperlukan.

    • Latensi meningkat dengan volume data yang perlu diproses.

    • Perbandingan efek diperlukan.

    Ya

    Tidak ada.

  • Kluster Anda telah direncanakan.

    Item

    Deskripsi

    Spesifikasi node data (diperlukan)

    Spesifikasi node data harus 16 vCPU dan 64 GiB memori atau lebih tinggi.

    null

    Saat Anda menggunakan plug-in aliyun-knn untuk membuat indeks, sumber daya komputasi yang banyak diperlukan. Jika spesifikasi node data kluster Anda kecil, bottleneck mungkin mudah terjadi. Dalam kasus parah, stabilitas kluster mungkin terpengaruh. Oleh karena itu, kami merekomendasikan Anda menggunakan kluster yang spesifikasi node datanya 16 vCPU dan 64 GiB memori atau lebih tinggi.

    Jenis node

    Kluster Anda harus berisi node master khusus independen.

    Ukuran memori off-heap

    Ukuran memori off-heap kluster Anda harus lebih besar dari dua kali total ukuran data vektor di kluster Anda.

    Sebagai contoh, indeks hanya berisi satu bidang bertipe float 960-dimensi. Indeks berisi 400 dokumen, dan data bertipe float menempati 4 byte memori. Dalam kasus ini, data vektor dalam indeks menempati 1,5 MB memori, yang dihitung menggunakan rumus berikut: 960 × 400 × 4. Oleh karena itu, Anda harus memastikan bahwa ukuran memori off-heap kluster lebih besar dari 3 MB, yang dihitung menggunakan rumus berikut: 1,5 × 2.

    null
    • Selama forced merging, baik data lama maupun data baru menempati memori. Jika Anda perlu melakukan forced merging, Anda harus memastikan bahwa ukuran memori off-heap kluster lebih besar dari empat kali total ukuran data vektor dalam kluster.

    • Untuk kluster yang spesifikasi memorinya 64 GiB atau lebih, ukuran memori off-heap kluster kira-kira sama dengan nilai rumus berikut: Total ukuran memori - 32 (GiB).

    Pembatasan penulisan

    Pembuatan indeks vektor adalah pekerjaan intensif CPU. Kami merekomendasikan Anda untuk tidak mempertahankan throughput penulisan tinggi. Throughput penulisan puncak kurang dari 5.000 transaksi per detik (TPS) direkomendasikan untuk node data dengan 16 vCPU dan 64 GiB memori.

    Saat sistem memproses kueri pada indeks vektor, ia memuat semua indeks ke memori node. Jika node kehabisan memori, sistem akan mengalokasikan ulang shard. Oleh karena itu, kami merekomendasikan Anda untuk tidak menulis sejumlah besar data ke kluster Anda saat sistem sedang memproses kueri.

    null

    Tabel di atas hanya mencantumkan item estimasi. Anda perlu merencanakan kluster Anda berdasarkan kebutuhan bisnis Anda. Disarankan merencanakan memori yang cukup untuk kluster Anda dan melakukan uji stres sebelum menggunakan kluster Anda.

Batasan

  • Sebelum menginstal plug-in aliyun-knn, pastikan bahwa spesifikasi node data dalam kluster Anda adalah 16 vCPU dan 64 GiB memori atau lebih tinggi. Jika spesifikasi node data dalam kluster Anda tidak memenuhi persyaratan, tingkatkan node data. Untuk informasi lebih lanjut, lihat Tingkatkan konfigurasi kluster.

  • Saat menggunakan plug-in aliyun-knn, beberapa fitur lanjutan yang disediakan oleh kernel AliES tidak dapat digunakan. Misalnya, jika Anda mengaktifkan fitur replikasi fisik, Anda harus menonaktifkan fitur ini sebelum menggunakan plug-in aliyun-knn. Untuk informasi lebih lanjut, lihat Gunakan fitur replikasi fisik dari plug-in apack.

  • Plug-in aliyun-knn tidak mendukung migrasi data yang dilakukan menggunakan snapshot di OSS atau menggunakan DataWorks. Jika Anda ingin memigrasi data, disarankan menggunakan Logstash.

Buat indeks vektor

  1. Masuk ke konsol Kibana kluster Elasticsearch Anda dan buka halaman utama konsol Kibana sesuai petunjuk.

    Untuk informasi lebih lanjut tentang cara masuk ke konsol Kibana, lihat Masuk ke konsol Kibana.

    null

    Dalam contoh ini, kluster Elasticsearch V6.7.0 digunakan. Operasi pada kluster versi lain mungkin berbeda. Operasi aktual di konsol yang berlaku.

  2. Di bilah navigasi kiri halaman yang muncul, klik Dev Tools.

  3. Di tab Console halaman yang muncul, jalankan perintah berikut untuk membuat indeks vektor:

    PUT test
    {
      "settings": {
        "index.codec": "proxima",
        "index.vector.algorithm": "hnsw"
      },
      "mappings": {
        "_doc": {
          "properties": {
            "feature": {
              "type": "proxima_vector", 
              "dim": 2, 
              "vector_type": "float", 
              "distance_method": "SquaredEuclidean" 
            }
          }
        }
      }
    }
    null
    • Anda dapat menambahkan jenis bidang lain yang didukung oleh Elasticsearch ke indeks vektor.

    • Jika kesalahan parsing mapping berikut dilaporkan saat Anda membuat indeks vektor, tingkatkan versi kernel kluster Anda dan coba lagi: "type": "mapper_parsing_exception", "reason": "Mapping definition for [feature] has unsupported parameters: [distance_method : SquaredEuclidean].

    Bagian

    Parameter

    Nilai Default

    Deskripsi

    settings

    index.codec

    proxima

    Menentukan apakah akan membuat indeks vektor proxima. Nilai valid:

    • proxima: Sistem membuat indeks vektor proxima. Indeks ini mendukung pencarian vektor. Kami merekomendasikan Anda mengatur parameter ini ke proxima.

    • null: Sistem tidak membuat indeks vektor proxima tetapi hanya membuat indeks maju. Dalam hal ini, bidang bertipe proxima_vector tidak mendukung kueri berbasis HNSW atau Linear Search. Bidang-bidang ini hanya mendukung kueri skrip.

    null

    Jika kluster Anda menyimpan volume data yang besar dan Anda tidak memiliki persyaratan tinggi pada latensi kueri, Anda dapat menghapus parameter ini atau mengatur parameter ini ke null. Dalam hal ini, Anda dapat menggunakan fitur kueri skrip untuk mencari k tetangga terdekat (k-NN) dari vektor. Fitur ini hanya tersedia untuk kluster V6.7.0 yang plug-in apack-nya adalah V1.2.1 atau lebih baru dan kluster V7.10.0 yang plug-in apack-nya adalah V1.4.0 atau lebih baru.

    index.vector.algorithm

    hnsw

    Algoritma yang digunakan untuk mencari vektor. Nilai valid:

    • hnsw: HNSW

    • linear: Linear Search

    index.vector.general.builder.offline_mode

    false

    Menentukan apakah menggunakan mode optimasi offline untuk membuat indeks vektor. Nilai valid:

    • false: Mode optimasi offline tidak digunakan.

    • true: Mode optimasi offline digunakan. Dalam hal ini, jumlah segmen yang ditulis ke indeks vektor berkurang secara signifikan. Ini meningkatkan throughput penulisan.

    null
    • Mode optimasi offline hanya tersedia untuk kluster V6.7.0 yang plug-in apack-nya adalah V1.2.1 atau lebih baru dan kluster V7.10.0 yang plug-in apack-nya adalah V1.4.0 atau lebih baru. Anda tidak diizinkan melakukan kueri skrip pada indeks yang menggunakan mode optimasi offline.

    • Jika Anda ingin menulis semua data Anda ke kluster Anda sekaligus, kami merekomendasikan Anda menggunakan mode optimasi offline.

    mappings

    type

    proxima_vector

    Tipe bidang. Sebagai contoh, jika Anda mengatur parameter type ke proxima_vector untuk bidang feature, maka bidang feature adalah bidang bertipe vektor.

    dim

    2

    Jumlah dimensi vektor. Parameter ini diperlukan. Nilai valid: 1 hingga 2048.

    vector_type

    float

    Tipe data vektor. Nilai valid:

    • float

    • short

    • binary

    Jika Anda mengatur parameter ini ke binary, data vektor yang ingin Anda tulis ke indeks vektor harus bertipe data uint32. Ini menunjukkan bahwa data vektor harus direpresentasikan oleh array desimal 32-bit tanpa tanda. Selain itu, nilai parameter dim harus merupakan kelipatan dari 32.

    Sebagai contoh, jika Anda ingin menulis data biner bisnis 64-bit 1000100100100101111000001001111101000011010010011010011010000100 ke indeks vektor Anda, tulis vektor [-1994006369, 1128900228] ke indeks.

    null

    Hanya kluster V6.7.0 yang plug-in apack-nya adalah V1.2.1 atau lebih baru dan kluster V7.10.0 yang plug-in apack-nya adalah V1.4.0 atau lebih baru yang mendukung ketiga tipe data di atas. Kluster lainnya hanya mendukung tipe data float.

    distance_method

    SquaredEuclidean

    Fungsi yang digunakan untuk menghitung jarak antar vektor. Nilai valid:

    • SquaredEuclidean: Menghitung jarak Euklides tanpa ekstraksi akar kuadrat.

    • InnerProduct: Menghitung produk dalam.

    • Cosine: Menghitung kemiripan kosinus.

    • Hamming: Menghitung jarak Hamming. Fungsi ini hanya tersedia saat Anda mengatur parameter vector_type ke binary.

    null
    • Hanya kluster V6.7.0 yang plug-in apack-nya adalah V1.2.1 atau lebih baru dan kluster V7.10.0 yang plug-in apack-nya adalah V1.4.0 atau lebih baru yang mendukung keempat fungsi di atas. Untuk kluster V6.8, V7.4, dan V7.7, Anda hanya dapat mengatur parameter ini ke nilai defaultnya SquaredEuclidean.

    • Untuk informasi lebih lanjut tentang fungsi-fungsi di atas, lihat Fungsi pengukuran jarak.

    • Implementasi fungsi Hamming bersifat khusus. Jika algoritma HNSW atau Linear Search digunakan, indeks tidak mendukung pencarian k-NN standar. Hanya kueri skrip yang didukung, dan perintah untuk kueri skrip kompatibel dengan parameter script_score. Jika Anda ingin menggunakan parameter ini dalam perintah kueri skrip, Anda harus menguji ketersediaan perintah terlebih dahulu berdasarkan bisnis Anda.

    null
    • Anda dapat menjalankan perintah GET /_cat/plugins?v untuk mendapatkan versi plug-in apack. Jika versi plug-in apack tidak memenuhi persyaratan, Anda dapat submit a ticket untuk meminta insinyur Alibaba Cloud memperbarui plug-in apack Anda.

    • Plug-in aliyun-knn juga mendukung beberapa parameter pencarian lanjutan. Untuk informasi lebih lanjut, lihat Parameter Lanjutan.

  4. Jalankan perintah berikut untuk menambahkan dokumen:

    POST test/_doc
    {
      "feature": [1.0, 2.0]
    }
    null

    Jika Anda mengatur parameter vector_type ke binary saat Anda membuat indeks vektor, data vektor yang ingin Anda tulis ke indeks vektor harus bertipe data uint32. Ini menunjukkan bahwa Anda harus mengonversi data Anda ke array desimal 32-bit tanpa tanda sebelum menambahkan dokumen. Selain itu, nilai parameter dim harus merupakan kelipatan dari 32. Jika Anda mengatur parameter vector_type ke nilai selain binary, panjang data vektor Anda harus sama dengan nilai yang ditentukan untuk parameter dim.

Cari vektor

  • Pencarian Standar

    Jalankan perintah berikut untuk melakukan pencarian standar untuk vektor:

    GET test/_search
    {
      "query": {
        "hnsw": {  
          "feature": {
            "vector": [1.5, 2.5], 
            "size": 10 
          }
        }
      }
    }

    Tabel berikut menjelaskan parameter dalam perintah di atas.

    Parameter

    Deskripsi

    hnsw

    Algoritma yang digunakan untuk mencari vektor. Nilainya harus sama dengan parameter algorithm yang ditentukan saat Anda membuat indeks.

    vector

    Vektor yang ingin Anda cari. Panjang array untuk vektor tersebut harus sama dengan nilai parameter dim yang ditentukan di bagian mappings.

    size

    Jumlah dokumen yang dipanggil kembali.

    null
    • Parameter size dalam perintah pencarian vektor berbeda dari parameter size yang disediakan oleh Elasticsearch. Yang pertama mengontrol jumlah dokumen yang dipanggil kembali oleh plug-in aliyun-knn, sedangkan yang terakhir mengontrol jumlah dokumen yang dipanggil kembali untuk pencarian. Saat Anda melakukan pencarian vektor, sistem memanggil kembali N dokumen teratas berdasarkan nilai parameter size dalam perintah pencarian vektor terkait dan memanggil kembali semua dokumen yang cocok berdasarkan nilai parameter size yang disediakan oleh Elasticsearch. Kemudian, sistem mengembalikan hasil berdasarkan N dokumen teratas dan semua dokumen yang cocok.

    • Kami merekomendasikan Anda mengatur kedua parameter size ke nilai yang sama. Nilai default parameter size yang disediakan oleh Elasticsearch adalah 10.

    null

    Plug-in aliyun-knn juga mendukung beberapa parameter pencarian lanjutan. Untuk informasi lebih lanjut, lihat Parameter Lanjutan.

  • Kueri Skrip

    Anda hanya dapat melakukan kueri skrip menggunakan parameter script_score. Sebagai contoh, Anda dapat menggunakan parameter script_score untuk memberi skor setiap dokumen dalam respons kueri. Skor dihitung menggunakan rumus berikut: 1/(1+l2Squared(params.queryVector, doc['feature'])). Kode berikut memberikan contoh permintaan kueri skrip:

    GET test/_search
    {
      "query": {
        "match_all": {}
      },
      "rescore": {
        "query": {
          "rescore_query": {
            "function_score": {
              "functions": [{
                "script_score": {
                  "script": {
                      "source": "1/(1+l2Squared(params.queryVector, doc['feature'])) ", 
                      "params": {
                        "queryVector": [2.0, 2.0]
                      }
                  }
                }
              }]
            }
          }
        }
      }
    }

    Kueri skrip di Alibaba Cloud Elasticsearch tidak mendukung fungsi yang disediakan oleh X-Pack. Hanya fungsi yang dijelaskan dalam tabel berikut yang didukung.

    Fungsi

    Deskripsi

    l2Squared(float[] queryVector, DocValues docValues)

    Fungsi yang digunakan untuk mencari vektor berdasarkan jarak Euklides.

    hamming(float[] queryVector, DocValues docValues)

    Fungsi yang digunakan untuk mencari vektor berdasarkan jarak Hamming.

    • cosineSimilarity(float[] queryVector, DocValues docValues)

    • cosine(float[] queryVector, DocValues docValues)

    Fungsi yang digunakan untuk mencari vektor berdasarkan kemiripan kosinus.

    null

    Kami merekomendasikan Anda menggunakan fungsi cosineSimilarity(float[] queryVector, DocValues docValues) untuk kluster V6.7 dan menggunakan fungsi cosine(float[] queryVector, DocValues docValues) untuk kluster V7.10.

    null
    • Anda hanya dapat melakukan kueri skrip di kluster V6.7.0 yang plug-in apack-nya adalah V1.2.1 atau lebih baru dan kluster V7.10.0 yang plug-in apack-nya adalah V1.4.0 atau lebih baru. Anda dapat menjalankan perintah GET /_cat/plugins?v untuk mendapatkan versi plug-in apack. Jika versi plug-in apack tidak memenuhi persyaratan, Anda dapat submit a ticket untuk meminta insinyur Alibaba Cloud memperbarui plug-in apack Anda.

    • Parameter dalam fungsi di atas:

      • float[] queryVector: vektor kueri. Anda dapat mengatur parameter ini ke parameter formal atau aktual.

      • DocValues docValues: vektor dokumen.

    • Anda tidak dapat melakukan kueri skrip pada indeks yang dibuat menggunakan mode optimasi offline.

  • Pemanasan Indeks

    Pencarian dilakukan pada indeks vektor dalam penyimpanan in-memory. Setelah Anda menulis data ke indeks vektor, latensi pencarian pertama tinggi karena indeks masih dimuat ke memori. Untuk mengatasi masalah ini, plug-in aliyun-knn menyediakan fitur pemanasan indeks. Fitur ini memungkinkan Anda untuk memanaskan indeks vektor Anda dan memuatnya ke memori mesin lokal Anda sebelum plug-in aliyun-knn menyediakan layanan pencarian vektor. Ini secara signifikan mengurangi latensi pencarian vektor.

    • Jalankan perintah berikut untuk memanaskan semua indeks vektor:

      POST _vector/warmup
    • Jalankan perintah berikut untuk memanaskan indeks vektor tertentu:

      POST _vector/{indexName}/warmup
    null
    • Fitur pemanasan indeks hanya tersedia untuk kluster V6.7.0 yang plug-in apack-nya adalah V1.2.1 atau lebih baru dan kluster V7.10.0 yang plug-in apack-nya adalah V1.4.0 atau lebih baru. Anda dapat menjalankan perintah GET _cat/plugins?v untuk mendapatkan versi plug-in apack. Jika versi plug-in apack tidak memenuhi persyaratan, Anda dapat submit a ticket untuk meminta insinyur Alibaba Cloud memperbarui plug-in apack Anda.

    • Jika kluster Anda menyimpan sejumlah besar indeks vektor, indeks menyimpan volume data yang besar, dan pencarian vektor hanya diperlukan untuk indeks vektor tertentu, disarankan untuk hanya memanaskan indeks vektor tertentu untuk meningkatkan kinerja pencarian.

Penilaian vektor

Rumus penilaian terpadu disediakan untuk pencarian vektor. Rumus tersebut bergantung pada fungsi pengukuran jarak. Fungsi pengukuran jarak memengaruhi pengurutan hasil pencarian.

Rumus penilaian:

Skor = 1/(Jarak vektor + 1)

null
  • Secara default, mekanisme penilaian menggunakan jarak Euklides tanpa ekstraksi akar kuadrat untuk menghitung skor.

  • Dalam praktiknya, Anda dapat menghitung jarak berdasarkan skor. Kemudian, optimalkan vektor berdasarkan jarak untuk meningkatkan skor.

Fungsi pengukuran jarak

Mekanisme penilaian bervariasi berdasarkan fungsi pengukuran jarak. Tabel berikut menjelaskan fungsi pengukuran jarak yang didukung oleh plug-in aliyun-knn.

Fungsi Pengukuran Jarak

Deskripsi

Rumus Penilaian

Skema Penggunaan

Contoh

SquaredEuclidean

Fungsi ini digunakan untuk menghitung jarak Euklides antara vektor. Jarak Euklides, juga disebut metrik Euklides, merujuk pada jarak aktual antara titik-titik atau panjang alami vektor dalam ruang m-dimensi. Jarak Euklides banyak digunakan. Jarak Euklides dalam ruang dua atau tiga dimensi adalah jarak aktual antara titik-titik.

Sebagai contoh, dua vektor n-dimensi [A1, A2, ..., An] dan [B1, B2, ..., Bn] ada.

  • Jarak Euklides tanpa ekstraksi akar kuadrat antara dua vektor = (A1 - B1)² + (A2 - B2)² + ... + (An - Bn)²

  • Skor = 1/(Jarak Euklides + 1)

null

Secara default, mekanisme penilaian menggunakan jarak Euklides tanpa ekstraksi akar kuadrat untuk menghitung skor.

Jarak Euklides dapat mencerminkan perbedaan absolut antara karakteristik angka individu. Oleh karena itu, jarak Euklides banyak digunakan untuk menganalisis perbedaan antara angka dari berbagai dimensi. Sebagai contoh, Anda dapat menggunakan metrik perilaku pengguna untuk menganalisis perbedaan atau kesamaan antara nilai pengguna.

Jarak Euklides tanpa ekstraksi akar kuadrat antara vektor dua dimensi [0, 0] dan [1, 2] adalah 5, yang dihitung menggunakan rumus berikut: (1 - 0)² + (2 - 0)².

Cosine

Fungsi ini digunakan untuk menghitung kemiripan kosinus antara vektor. Fungsi ini menghitung kosinus dari sudut antara vektor untuk mendapatkan kemiripan kosinus di antara mereka.

Sebagai contoh, dua vektor n-dimensi [A1, A2, ..., An] dan [B1, B2, ..., Bn] ada.

  • Rumus: Cosine余弦距离

  • Skor = 1/(Kemiripan kosinus + 1)

Kemiripan kosinus mencerminkan perbedaan antara vektor dari orientasi. Kemiripan kosinus digunakan untuk memberi skor konten guna mendapatkan kesamaan atau perbedaan antara minat pengguna. Selain itu, kemiripan kosinus dipengaruhi oleh orientasi vektor daripada angka di dalamnya. Oleh karena itu, kemiripan kosinus dapat menangani masalah bahwa pengguna mungkin menggunakan standar pengukuran yang berbeda.

Kemiripan kosinus antara vektor dua dimensi [1, 1] dan [1, 0] adalah 0,707.

InnerProduct

Fungsi ini digunakan untuk menghitung hasil kali dalam antara vektor. Hasil kali dalam juga disebut dot product. Dot product adalah operasi diadik yang mengambil dua vektor dari bilangan real R dan mengembalikan skalar untuk bilangan real.

Sebagai contoh, dua vektor n-dimensi [A1, A2, ..., An] dan [B1, B2, ..., Bn] ada.

  • Produk dalam antara dua vektor = A1B1 + A2B2 + ... + AnBn

  • Skor = 1/(Produk dalam + 1)

Produk dalam mempertimbangkan baik sudut maupun panjang absolut antara vektor. Setelah vektor dinormalisasi, rumus untuk produk dalam setara dengan rumus untuk kemiripan kosinus.

Produk dalam antara vektor dua dimensi [1, 1] dan [1, 5] adalah 6.

Hamming (hanya tersedia untuk vektor bertipe BINARY)

Dalam teori informasi, jarak Hamming antara string dengan panjang yang sama sama dengan jumlah posisi di mana simbol berbeda. d(x, y) digunakan untuk merepresentasikan jarak Hamming antara string x dan y. Dengan kata lain, jarak Hamming mengukur jumlah substitusi minimum yang diperlukan untuk mengubah string x menjadi string y.

Sebagai contoh, dua string biner n-bit x dan y ada.

  • d(x, y) = ∑x[i]⊕y[i] (Dalam rumus ini, i adalah 0,1,..n-1, dan ⊕ menunjukkan XOR. XOR adalah singkatan dari exclusive or.)

  • Skor = 1/(Jarak Hamming + 1)

Jarak Hamming digunakan untuk mendeteksi atau memperbaiki kesalahan yang terjadi saat data ditransmisikan melalui jaringan komputer. Jarak Hamming juga dapat digunakan sebagai metode estimasi kesalahan untuk menentukan jumlah karakter berbeda antara string biner.

Jarak Hamming antara 1011101 dan 1001001 adalah 2.

null

Saat menggunakan plug-in aliyun-knn, data vektor yang ingin Anda tulis ke indeks vektor Anda harus bertipe data uint32. Ini menunjukkan bahwa data vektor harus direpresentasikan oleh array desimal 32-bit tanpa tanda. Selain itu, nilai parameter dim harus merupakan kelipatan dari 32.

null
  • Hanya kluster V6.7.0 yang plug-in apack-nya adalah V1.2.1 atau lebih baru dan kluster V7.10.0 yang plug-in apack-nya adalah V1.4.0 atau lebih baru yang mendukung keempat fungsi di atas. Anda dapat menjalankan perintah GET _cat/plugins?v untuk mendapatkan versi plug-in apack untuk kluster Anda. Jika versi plug-in apack tidak memenuhi persyaratan, kluster Anda hanya mendukung fungsi SquaredEuclidean. Jika Anda ingin menggunakan fungsi lain, Anda dapat submit a ticket untuk meminta insinyur Alibaba Cloud memperbarui plug-in apack Anda.

  • Anda dapat mengonfigurasi parameter distance_method di bagian mappings untuk menentukan fungsi pengukuran jarak yang digunakan untuk indeks vektor Anda.

Parameter pemutus sirkuit

Parameter

Deskripsi

Nilai Default

indices.breaker.vector.native.indexing.limit

Jika penggunaan memori off-heap melebihi nilai yang ditentukan oleh parameter ini, operasi penulisan akan ditangguhkan. Setelah sistem membuat indeks dan melepaskan memori, sistem akan melanjutkan operasi penulisan. Jika pemutus sirkuit dipicu, konsumsi memori sistem tinggi. Dalam hal ini, kami merekomendasikan Anda untuk membatasi throughput penulisan.

70%

indices.breaker.vector.native.total.limit

Proporsi maksimum memori off-heap yang digunakan untuk membuat indeks vektor. Jika penggunaan memori off-heap aktual melebihi nilai yang ditentukan oleh parameter ini, sistem mungkin mengalokasikan ulang shard.

80%

null

Parameter pemutus sirkuit di atas adalah parameter tingkat kluster. Anda dapat menjalankan perintah GET _cluster/settings untuk melihat nilai-nilai parameter tersebut. Disarankan untuk mempertahankan nilai default untuk parameter tersebut.

Parameter lanjutan

Tabel 2. Parameter Pembuatan Indeks untuk HNSW

Parameter

Deskripsi

Nilai Default

index.vector.hnsw.builder.max_scan_num

Jumlah maksimum tetangga terdekat yang dapat dipindai saat graf dibuat dalam kasus terburuk.

100000

index.vector.hnsw.builder.neighbor_cnt

Jumlah maksimum tetangga terdekat yang dapat dimiliki setiap node pada lapisan 0. Kami merekomendasikan Anda mengatur parameter ini ke 100. Kualitas graf meningkat dengan nilai parameter ini. Namun, indeks nonaktif mengonsumsi lebih banyak sumber daya penyimpanan.

100

index.vector.hnsw.builder.upper_neighbor_cnt

Jumlah maksimum tetangga terdekat yang dapat dimiliki setiap node pada lapisan selain lapisan 0. Kami merekomendasikan Anda mengatur parameter ini ke 50% dari nilai yang ditentukan untuk parameter neighbor_cnt. Nilai maksimum: 255.

50

index.vector.hnsw.builder.efconstruction

Jumlah tetangga terdekat yang dapat dipindai saat graf dibuat. Kualitas graf meningkat dengan nilai parameter ini. Namun, waktu yang lebih lama diperlukan untuk membuat indeks. Kami merekomendasikan Anda mengatur parameter ini ke 400.

400

index.vector.hnsw.builder.max_level

Jumlah total lapisan, termasuk lapisan 0. Sebagai contoh, jika Anda memiliki 10 juta dokumen dan parameter scaling_factor diatur ke 30, gunakan 30 sebagai angka dasar dan bulatkan logaritma dari 10.000.000 ke bilangan bulat terdekat. Hasilnya adalah 5.

Parameter ini tidak memiliki dampak signifikan pada pencarian vektor. Kami merekomendasikan Anda mengatur parameter ini ke 6.

6

index.vector.hnsw.builder.scaling_factor

Faktor penskalaan. Volume data pada suatu lapisan sama dengan volume data pada lapisan atasnya dikalikan dengan faktor penskalaan. Nilai valid: 10 hingga 100. Jumlah lapisan berkurang dengan nilai scaling_factor. Kami merekomendasikan Anda mengatur parameter ini ke 50.

50

null

Anda dapat mengatur parameter di atas di bagian settings hanya setelah Anda mengatur parameter index.vector.algorithm ke hnsw.

Tabel 3. Parameter Pencarian untuk HNSW

Parameter

Deskripsi

Nilai Default

ef

Jumlah tetangga terdekat yang dipindai selama pencarian online. Nilai besar meningkatkan rasio recall tetapi memperlambat pencarian. Nilai valid: 100 hingga 1000.

100

Kode berikut memberikan contoh permintaan pencarian:

GET test/_search
{
  "query": {
    "hnsw": {
      "feature": {
        "vector": [1.5, 2.5],
        "size": 10,
        "ef": 100       
      }
    }
  }
}

Pertanyaan Umum

  • T: Bagaimana cara mengevaluasi rasio recall dokumen?

    A: Anda dapat membuat dua indeks. Satu menggunakan algoritma HNSW dan yang lainnya menggunakan algoritma Linear Search. Pertahankan pengaturan indeks lainnya konsisten untuk kedua indeks. Gunakan klien untuk menambahkan data vektor yang sama ke indeks, dan segarkan indeks. Kemudian, gunakan vektor kueri yang sama untuk melakukan kueri pada indeks, bandingkan ID dokumen yang dikembalikan oleh indeks, dan temukan ID dokumen yang dikembalikan oleh kedua indeks.

    null

    Bagilah jumlah ID dokumen yang dikembalikan oleh kedua indeks dengan jumlah total ID dokumen yang dikembalikan untuk menghitung rasio recall dokumen.

  • T: Saat saya menulis data ke kluster saya, sistem mengembalikan kesalahan circuitBreakingException. Apa yang harus saya lakukan?

    A: Kesalahan ini menunjukkan bahwa penggunaan memori off-heap melebihi proporsi yang ditentukan oleh parameter indices.breaker.vector.native.indexing.limit dan bahwa operasi penulisan ditangguhkan. Proporsi default adalah 70%. Dalam sebagian besar kasus, operasi penulisan dilanjutkan secara otomatis setelah sistem membuat indeks dan melepaskan memori. Disarankan menambahkan mekanisme percobaan ulang ke skrip penulisan data di klien Anda.

  • T: Mengapa CPU masih bekerja setelah operasi penulisan ditangguhkan?

    A: Sistem membuat indeks vektor selama proses refresh dan flush. Tugas pembuatan indeks mungkin masih berjalan meskipun operasi penulisan ditangguhkan. Sumber daya komputasi dilepaskan setelah refresh akhir selesai.

  • T: Saat saya menggunakan plug-in aliyun-knn, kesalahan berikut dilaporkan: class_cast_exception: class org.apache.lucene.index.SoftDeletesDirectoryReaderWrapper$SoftDeletesFilterCodecReader cannot be cast to class org.apache.lucene.index.SegmentReader (org.apache.lucene.index.SoftDeletesDirectoryReaderWrapper$SoftDeletesFilterCodecReader and org.apache.lucene.index.SegmentReader are in unnamed module of loader 'app'). Apa yang harus saya lakukan?

    A: Nonaktifkan fitur replikasi fisik untuk indeks. Untuk informasi lebih lanjut, lihat Gunakan fitur replikasi fisik dari plug-in apack.

  • T: Saat saya menggunakan plug-in aliyun-knn untuk melakukan pencarian vektor, pencarian lambat, atau pencarian ditangguhkan karena penggunaan memori tinggi. Apa yang harus saya lakukan?

    A: Saat plug-in aliyun-knn digunakan untuk pencarian vektor, vektor in-memory digunakan. Ini mengonsumsi sejumlah besar sumber daya memori. Selama pencarian vektor, sistem memuat data indeks ke memori node data. Jika node data menyimpan volume data indeks yang besar, pencarian mungkin lambat atau ditangguhkan. Untuk menghindari masalah ini, Anda harus memastikan bahwa volume data yang disimpan di setiap node data tidak lebih dari setengah dari total ukuran memori node data. Jika ukuran memori node data dalam kluster Anda terlalu kecil, disarankan meningkatkan node data. Untuk informasi lebih lanjut, lihat Tingkatkan konfigurasi kluster.

  • T: Apakah praktik terbaik untuk plug-in aliyun-knn disediakan?

    A: Komunitas pengembang Alibaba Cloud menyediakan skenario bisnis dan praktik terbaik dari plug-in aliyun-knn.

  • T: Saya tidak dapat menggunakan must_not exists untuk menyaring dokumen di mana nilai bidang feature kosong. Apa yang harus saya lakukan?

    A: Data vektor disimpan dengan cara khusus dan mungkin tidak kompatibel dengan kueri DSL. Anda dapat menggunakan skrip berikut untuk menyaring dokumen:

    GET jx-similar-product-v1/_search
    {
       "query": {
         "bool": {
           "must": {
             "script": {
               "script": {
                 "source": "doc['feature'].empty",
                 "lang": "painless"
                 }
             }
           }
         }
       }
    }