Kueri Elasticsearch ke Milvus

Elasticsearch, yang dibangun di atas Apache Lucene, adalah mesin pencari sumber terbuka terkemuka. Namun, mesin ini menghadapi tantangan dalam aplikasi AI modern, termasuk biaya pembaruan yang tinggi, performa real-time yang buruk, manajemen pecahan yang tidak efisien, desain yang bukan cloud-native, dan permintaan sumber daya yang berlebihan. Sebagai basis data vektor cloud-native, Milvus mengatasi masalah ini dengan penyimpanan dan komputasi yang terpisah, pengindeksan yang efisien untuk data berdimensi tinggi, dan integrasi tanpa batas dengan infrastruktur modern. Milvus menawarkan kinerja dan skalabilitas yang unggul untuk beban kerja AI.

Artikel ini bertujuan untuk memfasilitasi migrasi basis kode Anda dari Elasticsearch ke Milvus, dengan memberikan berbagai contoh konversi kueri di antaranya.

Gambaran Umum

Di Elasticsearch, operasi dalam konteks kueri menghasilkan nilai relevansi, sedangkan operasi dalam konteks filter tidak. Demikian pula, pencarian Milvus menghasilkan nilai kemiripan, sedangkan kueri yang mirip filter tidak. Ketika memigrasikan basis kode Anda dari Elasticsearch ke Milvus, prinsip kuncinya adalah mengubah bidang yang digunakan dalam konteks kueri Elasticsearch menjadi bidang vektor untuk memungkinkan pembuatan skor kemiripan.

Tabel di bawah ini menguraikan beberapa pola kueri Elasticsearch dan padanannya di Milvus.

Kueri Elasticsearch

Padanan Milvus

Keterangan

Kueri teks lengkap

Kueri pencocokan

Pencarian teks lengkap

Keduanya menyediakan serangkaian kemampuan yang serupa.

Kueri tingkat istilah

ID

in operator

Keduanya menyediakan serangkaian kemampuan yang sama atau serupa ketika kueri Elasticsearch ini digunakan dalam konteks filter.

Kueri awalan

like operator

Kueri rentang

Operator perbandingan seperti >, <, >=, dan <=

Kueri istilah

Operator perbandingan seperti ==

Kueri istilah

in operator

Kueri karakter pengganti

like operator

Kueri boolean

Operator logika seperti AND

Keduanya menyediakan serangkaian kemampuan yang serupa ketika digunakan dalam konteks filter.

Kueri vektor

kueri kNN

Pencarian

Milvus menyediakan kemampuan pencarian vektor yang lebih canggih.

Penggabungan peringkat timbal balik

Pencarian Hibrida

Milvus mendukung beberapa strategi pemeringkatan.

Kueri teks lengkap

Di Elasticsearch, kueri teks lengkap memungkinkan Anda untuk mencari bidang teks yang dianalisis seperti isi email. String kueri diproses menggunakan penganalisis yang sama dengan yang diterapkan pada bidang selama pengindeksan.

Kueri kecocokan

Di Elasticsearch, kueri pencocokan mengembalikan dokumen yang cocok dengan teks, angka, tanggal, atau nilai boolean yang disediakan. Teks yang disediakan dianalisis sebelum dicocokkan.

Berikut ini adalah contoh permintaan pencarian Elasticsearch dengan kueri kecocokan.

resp = client.search(
    query={
        "match": {
            "message": {
                "query": "this is a test"
            }
        }
    },
)

Milvus menyediakan kemampuan yang sama melalui fitur pencarian teks lengkap. Anda dapat mengubah kueri Elasticsearch di atas menjadi Milvus sebagai berikut:

res = client.search(
    collection_name="my_collection",
    data=['How is the weather in Jamaica?'],
    anns_field="message_sparse",
    output_fields=["id", "message"]
)

Pada contoh di atas, message_sparse adalah bidang vektor jarang yang berasal dari bidang VarChar bernama message. Milvus menggunakan model penyematan BM25 untuk mengubah nilai di bidang message menjadi penyematan vektor jarang dan menyimpannya di bidang message_sparse. Setelah menerima permintaan pencarian, Milvus menyematkan muatan kueri teks biasa menggunakan model BM25 yang sama dan melakukan pencarian vektor jarang dan mengembalikan bidang id dan message yang ditentukan dalam parameter output_fields bersama dengan nilai kemiripan yang sesuai.

Untuk menggunakan fungsi ini, Anda harus mengaktifkan penganalisis pada bidang message dan mendefinisikan fungsi untuk mendapatkan bidang message_sparse darinya. Untuk petunjuk terperinci tentang cara mengaktifkan penganalisis dan membuat fungsi turunan di Milvus, lihat Pencarian Teks Lengkap.

Kueri tingkat istilah

Di Elasticsearch, kueri tingkat istilah digunakan untuk menemukan dokumen berdasarkan nilai yang tepat dalam data terstruktur, seperti rentang tanggal, alamat IP, harga, atau ID produk. Bagian ini menguraikan kemungkinan padanan dari beberapa kueri tingkat istilah Elasticsearch di Milvus. Semua contoh di bagian ini diadaptasi untuk beroperasi dalam konteks penyaringan agar sesuai dengan kemampuan Milvus.

ID

Di Elasticsearch, Anda dapat menemukan dokumen berdasarkan ID mereka dalam konteks filter sebagai berikut:

resp = client.search(
    query={
        "bool": {
            "filter": {
                "ids": {
                    "values": [
                        "1",
                        "4",
                        "100"
                    ]
                }            
            }
        }
    },
)

Di Milvus, Anda juga dapat menemukan entitas berdasarkan ID mereka sebagai berikut:

# Use the filter parameter
res = client.query(
    collection_name="my_collection",
    filter="id in [1, 4, 100]",
    output_fields=["id", "title"]
)

# Use the ids parameter
res = client.query(
    collection_name="my_collection",
    ids=[1, 4, 100],
    output_fields=["id", "title"]
)

Anda dapat menemukan contoh Elasticsearch di halaman ini. Untuk detail tentang permintaan kueri dan permintaan get serta ekspresi penyaringan di Milvus, lihat Kueri dan Penyaringan.

Kueri awalan

Di Elasticsearch, Anda dapat menemukan dokumen yang mengandung awalan tertentu di bidang yang disediakan dalam konteks filter sebagai berikut:

resp = client.search(
    query={
        "bool": {
            "filter": {
                 "prefix": {
                    "user": {
                        "value": "ki"
                    }
                }           
            }
        }
    },
)

Di Milvus, Anda dapat menemukan entitas yang nilainya dimulai dengan awalan tertentu sebagai berikut:

res = client.query(
    collection_name="my_collection",
    filter='user like "ki%"',
    output_fields=["id", "user"]
)

Anda dapat menemukan contoh Elasticsearch di halaman ini. Untuk detail tentang operator like di Milvus, lihat Menggunakan LIKE untuk Pencocokan Pola.

Kueri rentang

Di Elasticsearch, Anda dapat menemukan dokumen yang mengandung istilah dalam rentang yang disediakan sebagai berikut:

resp = client.search(
    query={
        "bool": {
            "filter": {
                "range": {
                    "age": {
                        "gte": 10,
                        "lte": 20
                    }
                }           
            }
        }
    },
)

Di Milvus, Anda dapat menemukan entitas yang nilainya dalam bidang tertentu berada dalam rentang yang disediakan sebagai berikut:

res = client.query(
    collection_name="my_collection",
    filter='10 <= age <= 20',
    output_fields=["id", "user", "age"]
)

Anda dapat melihat contoh Elasticsearch di halaman ini. Untuk rincian tentang operator perbandingan di Milvus, lihat Operator perbandingan.

Kueri istilah

Di Elasticsearch, Anda dapat menemukan dokumen yang mengandung istilah yang tepat di bidang yang disediakan sebagai berikut:

resp = client.search(
    query={
        "bool": {
            "filter": {
                "term": {
                    "status": {
                        "value": "retired"
                    }
                }            
            }
        }
    },
)

Di Milvus, Anda dapat menemukan entitas yang nilainya di bidang yang ditentukan sama persis dengan istilah yang ditentukan sebagai berikut:

# use ==
res = client.query(
    collection_name="my_collection",
    filter='status=="retired"',
    output_fields=["id", "user", "status"]
)

# use TEXT_MATCH
res = client.query(
    collection_name="my_collection",
    filter='TEXT_MATCH(status, "retired")',
    output_fields=["id", "user", "status"]
)

Anda dapat menemukan contoh Elasticsearch di halaman ini. Untuk detail tentang operator perbandingan di Milvus, lihat Operator perbandingan.

Kueri istilah

Di Elasticsearch, Anda dapat menemukan dokumen yang mengandung satu atau lebih istilah yang tepat di bidang yang disediakan sebagai berikut:

resp = client.search(
    query={
        "bool": {
            "filter": {
                "terms": {
                    "degree": [
                        "graduate",
                        "post-graduate"
                    ]
                }        
            }
        }
    }
)

Milvus tidak memiliki padanan yang lengkap untuk istilah ini. Namun, Anda dapat menemukan entitas yang nilainya di bidang yang ditentukan adalah salah satu istilah yang ditentukan sebagai berikut:

# use in
res = client.query(
    collection_name="my_collection",
    filter='degree in ["graduate", "post-graduate"]',
    output_fields=["id", "user", "degree"]
)

# use TEXT_MATCH
res = client.query(
    collection_name="my_collection",
    filter='TEXT_MATCH(degree, "graduate post-graduate")',
    output_fields=["id", "user", "degree"]
)

Anda dapat menemukan contoh Elasticsearch di halaman ini. Untuk detail tentang operator rentang di Milvus, lihat Operator rentang.

Kueri wildcard

Di Elasticsearch, Anda dapat menemukan dokumen yang berisi istilah yang cocok dengan pola wildcard sebagai berikut:

resp = client.search(
    query={
        "bool": {
            "filter": {
                "wildcard": {
                    "user": {
                        "value": "ki*y"
                    }
                }          
            }
        }
    },
)

Milvus tidak mendukung wildcard dalam kondisi penyaringannya. Namun, Anda dapat menggunakan operator like untuk mendapatkan efek yang sama seperti berikut ini:

res = client.query(
    collection_name="my_collection",
    filter='user like "ki%" AND user like "%y"',
    output_fields=["id", "user"]
)

Anda dapat menemukan contoh Elasticsearch di halaman ini. Untuk rincian tentang operator rentang di Milvus, lihat Operator rentang.

Kueri boolean

Di Elasticsearch, kueri boolean adalah kueri yang mencocokkan dokumen yang cocok dengan kombinasi boolean dari kueri lain.

Contoh berikut ini diadaptasi dari contoh dalam dokumentasi Elasticsearch di halaman ini. Kueri ini akan mengembalikan pengguna dengan kimchy dalam nama mereka dengan tag production.

resp = client.search(
    query={
        "bool": {
            "filter": {
                "term": {
                    "user": "kimchy"
                }
            },
            "filter": {
                "term": {
                    "tags": "production"
                }
            }
        }
    },
)

Di Milvus, Anda dapat melakukan hal yang sama seperti berikut:

filter = 

res = client.query(
    collection_name="my_collection",
    filter='user like "%kimchy%" AND ARRAY_CONTAINS(tags, "production")',
    output_fields=["id", "user", "age", "tags"]
)

Contoh di atas mengasumsikan bahwa Anda memiliki bidang user dengan tipe VarChar dan bidang tags dengan tipe Array, di dalam koleksi target. Kueri akan mengembalikan pengguna dengan kimchy dalam nama mereka dengan tag production.

Kueri vektor

Di Elasticsearch, kueri vektor adalah kueri khusus yang bekerja pada bidang vektor untuk melakukan pencarian semantik secara efisien.

Kueri Knn

Elasticsearch mendukung kueri kNN perkiraan dan kueri kNN brute-force yang tepat. Anda dapat menemukan k vektor terdekat ke vektor kueri dengan salah satu dari kedua cara tersebut, yang diukur dengan metrik kemiripan, sebagai berikut:

resp = client.search(
    index="my-image-index",
    size=3,
    query={
        "knn": {
            "field": "image-vector",
            "query_vector": [
                -5,
                9,
                -12
            ],
            "k": 10
        }
    },
)

Milvus, sebagai basis data vektor khusus, menggunakan tipe indeks untuk mengoptimalkan pencarian vektor. Biasanya, Milvus memprioritaskan pencarian dengan metode nearest neighbor (ANN) untuk data vektor berdimensi tinggi. Meskipun pencarian brute-force kNN dengan tipe indeks FLAT memberikan hasil yang tepat, namun proses ini memakan waktu dan sumber daya yang intensif. Sebaliknya, pencarian ANN menggunakan AUTOINDEX atau jenis indeks lainnya menyeimbangkan kecepatan dan akurasi, menawarkan kinerja yang jauh lebih cepat dan lebih hemat sumber daya daripada kNN.

Kesetaraan yang serupa dengan kueri vektor di atas di Mlivus adalah sebagai berikut:

res = client.search(
    collection_name="my_collection",
    anns_field="image-vector"
    data=[[-5, 9, -12]],
    limit=10
)

Anda dapat menemukan contoh Elasticsearch di halaman ini. Untuk detail tentang pencarian ANN di Milvus, baca Pencarian ANN Dasar.

Penggabungan Peringkat Timbal Balik

Elasticsearch menyediakan Reciprocal Rank Fusion (RRF) untuk menggabungkan beberapa set hasil dengan indikator relevansi yang berbeda ke dalam satu set hasil berperingkat.

Contoh berikut ini menunjukkan penggabungan pencarian berbasis istilah tradisional dengan pencarian vektor k-nearest neighbors (kNN) untuk meningkatkan relevansi pencarian:

client.search(
    index="my_index",
    size=10,
    query={
        "retriever": {
            "rrf": {
                "retrievers": [
                    {
                        "standard": {
                            "query": {
                                "term": {
                                    "text": "shoes"
                                }
                            }
                        }
                    },
                    {
                        "knn": {
                            "field": "vector",
                            "query_vector": [1.25, 2, 3.5],  # Example vector; replace with your actual query vector
                            "k": 50,
                            "num_candidates": 100
                        }
                    }
                ],
                "rank_window_size": 50,
                "rank_constant": 20
            }
        }
    }
)

Dalam contoh ini, RRF menggabungkan hasil dari dua temu kembali:

  • Pencarian berbasis istilah standar untuk dokumen yang mengandung istilah "shoes" di bidang text.

  • Pencarian kNN pada bidang vector menggunakan vektor kueri yang disediakan.

Setiap retriever menyumbangkan hingga 50 kecocokan teratas, yang diperingkat ulang oleh RRF, dan 10 hasil teratas akhir dikembalikan.

Di Milvus, Anda dapat mencapai pencarian hibrida yang serupa dengan menggabungkan pencarian di beberapa bidang vektor, menerapkan strategi pemeringkatan ulang, dan mengambil hasil K teratas dari daftar gabungan. Milvus mendukung strategi RRF dan strategi perangkingan ulang berbobot. Untuk lebih jelasnya, lihat Perangkingan Ulang.

Berikut ini adalah ekuivalensi tidak ketat dari contoh Elasticsearch di atas di Milvus.

search_params_dense = {
    "data": [[1.25, 2, 3.5]],
    "anns_field": "vector",
    "param": {
        "metric_type": "IP",
        "params": {"nprobe": 10},
    },
    "limit": 100
}

req_dense = ANNSearchRequest(**search_params_dense)

search_params_sparse = {
    "data": ["shoes"],
    "anns_field": "text_sparse",
    "param": {
        "metric_type": "BM25",
    }
}

req_sparse = ANNSearchRequest(**search_params_sparse)

res = client.hybrid_search(
    collection_name="my_collection",
    reqs=[req_dense, req_sparse],
    reranker=RRFRanker(),
    limit=10
)

Contoh ini mendemonstrasikan pencarian hibrida di Milvus yang menggabungkan:

  1. Pencarian vektor padat: Menggunakan metrik inner product (IP) dengan nprobe yang disetel ke 10 untuk pencarian perkiraan tetangga terdekat (ANN) pada bidang vector.

  2. Pencarian vektor jarang: Menggunakan metrik kemiripan BM25 pada bidang text_sparse.

Hasil dari pencarian ini dieksekusi secara terpisah, digabungkan, dan diperingkat ulang menggunakan pemeringkat Reciprocal Rank Fusion (RRF). Pencarian gabungan mengembalikan 10 entitas teratas dari daftar peringkat ulang.

Tidak seperti peringkat RRF Elasticsearch, yang menggabungkan hasil dari kueri berbasis teks standar dan pencarian kNN, Milvus menggabungkan hasil dari pencarian vektor yang jarang dan padat, memberikan kemampuan pencarian hibrida unik yang dioptimalkan untuk data multimodal.

Rangkuman

Dalam artikel ini, kami membahas konversi kueri Elasticsearch yang umum ke kueri Milvus, termasuk kueri tingkat istilah, kueri boolean, kueri teks lengkap, dan kueri vektor. Jika Anda memiliki pertanyaan lebih lanjut tentang mengonversi kueri Elasticsearch lainnya, jangan ragu untuk menghubungi kami.