Kolom TeksCompatible with Milvus 3.0.x
Dalam aplikasi pencarian berbasis AI, pencarian vektor membantu Anda menemukan entitas yang serupa secara semantik, namun aplikasi tersebut sering kali juga memerlukan teks sumber asli di balik setiap hasil pencocokan. Sebuah LLM atau agen dapat menggunakan teks tersebut sebagai konteks untuk membaca, mengutip, merangkum, atau menyertakan hasilnya dalam sebuah prompt.
Milvus menyediakan tipe bidang skalar ` TEXT ` untuk menyimpan teks sumber yang panjang secara langsung bersama entitas. Nilai-nilai yang umum meliputi kutipan, dokumen panjang, isi artikel, tiket, dan log. Berbeda dengan ` VARCHAR`, yang memerlukan ` max_length` tetap, ` TEXT ` tidak mengharuskan Anda menetapkan panjang byte maksimum dalam skema koleksi.
Untuk mendefinisikan bidang " TEXT ", atur " datatype " menjadi " DataType.TEXT".
Fitur ini memerlukan Storage V3. Untuk petunjuk pengaktifan dan pertimbangan kompatibilitas, lihat Storage V3.
common.storage.useLoonFFI Secara default, nilainya adalah ` false`, yang berarti Storage V3 dinonaktifkan secara default. Sebelum membuat koleksi yang berisi bidang ` TEXT `, atur parameter ini menjadi ` true`; jika tidak, Milvus akan menolak skema koleksi tersebut.
schema.add_field(
field_name="content",
datatype=DataType.TEXT,
)
Setelah bidang tersebut didefinisikan, setiap entitas dapat menyertakan nilai string di bidang tersebut. Anda dapat memasukkan nilai TEXT seperti halnya bidang skalar lainnya dan mengembalikannya dari hasil kueri atau pencarian dengan mencantumkan bidang tersebut dalam output_fields.
TEXT bidang mendukung nilai null. Untuk mengaktifkan fitur ini, atur ` nullable ` menjadi ` True`. Untuk detailnya, lihat Bidang yang Dapat Bernilai Null.
Batasan
- Sebuah bidang `
TEXT` tidak dapat menjadi bidang utama, kunci partisi, atau kunci pengelompokan. TEXTtidak dapat digunakan sebagai tipe elemen dari bidang `ARRAY`, termasuk subbidang skalar dalam `StructArray`.- Di Milvus 3.0.0, bidang `
TEXT` tidak mendukung nilai default. - Di Milvus 3.0.0, bidang `
TEXT` tidak didukung dalam koleksi eksternal. - Pengguna tidak dapat membuat indeks skalar pada bidang
TEXT. Saatenable_match=True, Milvus membangun indeks teks yang dikelola sistem untuk pencocokan teks. Indeks internal ini bukanlah indeks skalar yang dibuat pengguna. - Operator filter skalar umum tidak dapat diterapkan secara langsung pada bidang `
TEXT`. Ini mencakup operator perbandingan seperti==dan!=, operator rentang seperti>,>=,<, dan<=, sertaIN,LIKE, operator regex (=~dan!~), danIS NULLatauIS NOT NULL. Untuk menyaring berdasarkan istilah yang dianalisis, tentukan bidang denganenable_analyzer=Truedanenable_match=True, lalu gunakanTEXT_MATCHatauTEXT_MATCH_FUZZY. Untuk pencarian teks lengkap yang diurutkan berdasarkan relevansi, gunakan BM25. - Di Milvus 3.0.0, Fungsi BM25 atau MinHash yang menggunakan bidang
TEXTsebagai masukan harus didefinisikan saat koleksi dibuat. Fungsi ini tidak dapat ditambahkan kemudian melaluiadd_function_fieldatauAlterCollectionSchema, bahkan jika koleksi yang ada kosong, karena Milvus tidak dapat mengisi kembali keluaran Fungsi dari nilai-nilaiTEXTyang tersimpan. Untuk menambahkan Fungsi tersebut ke koleksi yang sudah ada, gunakan bidang masukan `VARCHAR`, atau buat ulang koleksi tersebut dengan menyertakan Fungsi dalam skemanya. Untuk detail mengenai penambahan Fungsi dan bidang vektor yang dihasilkannya, lihat ` Alter Collection Schema`. - Fungsi Embedding Teks juga harus didefinisikan saat koleksi dibuat. Milvus 3.0.0 tidak mendukung penambahan fungsi tersebut saat runtime.
Pilih TEXT atau VARCHAR
TEXT dan " VARCHAR " sama-sama menyimpan nilai string, tetapi mendukung kebutuhan aplikasi yang berbeda. Gunakan " VARCHAR " untuk metadata pendek dan terbatas yang mengidentifikasi, mengkategorikan, atau menyaring entitas. Gunakan " TEXT " untuk konten sumber yang lebih panjang yang memberikan konteks yang cukup bagi LLM atau agen untuk membaca, mengutip, merangkum, atau membuat prompt.
| Aspek | VARCHAR | TEXT |
|---|---|---|
| Cocok untuk | Metadata singkat yang digunakan untuk mengidentifikasi, mengkategorikan, atau menyaring entitas, seperti title, tag, category, atau external_id. | Konten sumber yang lebih panjang yang digunakan oleh alur kerja LLM atau agen, seperti content, passage, article_body, atau log_message. |
| Pengaturan panjang | Memerlukan max_length, yang menentukan jumlah byte maksimum yang dapat disimpan oleh bidang tersebut. Nilai maksimumnya adalah 65,535 byte. Jika suatu nilai mungkin melebihi batas ini, gunakan TEXT. | Tidak memerlukan ` max_length`, sehingga skema tidak memerlukan batas byte tetap untuk nilai teks. |
| Perilaku penyimpanan | Menyimpan setiap nilai dalam batas penyimpanan yang dikonfigurasi ( max_length) pada bidang tersebut. | Menggunakan pemilihan penyimpanan otomatis untuk nilai teks yang lebih besar. Untuk detailnya, lihat Cara Milvus menyimpan nilai TEXT yang besar. |
| Dukungan bidang utama | Dapat digunakan sebagai bidang utama. | Tidak dapat digunakan sebagai bidang utama. |
| Penyaringan | Digunakan untuk metadata string pendek yang perlu muncul dalam ekspresi filter, seperti category == "news" atau tag in ["ai", "database"]. | Tidak mendukung operator filter skalar umum. Gunakan operator teks yang mendukung pencocokan untuk penyaringan istilah yang dianalisis, atau BM25 untuk pencarian teks lengkap yang diurutkan berdasarkan relevansi. |
Untuk detail mengenai bidang VARCHAR, lihat Bidang VarChar.
Cara Milvus menyimpan nilai TEXT yang besar
Saat Anda menyisipkan entitas, string yang Anda berikan untuk bidang TEXT adalah nilai TEXT. Milvus membandingkan ukuran nilai tersebut dengan dataNode.text.inlineThreshold, yang secara default berukur 65,536 -byte, lalu memilih salah satu dari dua jalur penyimpanan internal.
Penyimpanan teks besar
- Penyimpanan inline: Jika nilai `
TEXT` lebih kecil dari `dataNode.text.inlineThreshold`, Milvus menyimpan nilai teks asli secara langsung di data bidang `TEXT`. - Penyimpanan LOB: Jika nilai `
TEXT` lebih besar dari atau sama dengan `dataNode.text.inlineThreshold`, Milvus memperlakukan nilai tersebut sebagai objek besar (LOB) dan menyimpan teks aslinya secara terpisah di penyimpanan objek, seperti MinIO. Data bidang `TEXT` menyimpan referensi internal ke teks yang disimpan secara terpisah. Saat bidang `TEXT` diminta dalam hasil kueri atau pencarian, Milvus menggunakan referensi tersebut untuk mengambil dan mengembalikan teks aslinya.
Pemilihan penyimpanan ini bersifat internal. Anda dapat menyisipkan, melakukan kueri, dan mencari bidang ` TEXT ` dengan cara yang sama terlepas dari jalur penyimpanan mana yang digunakan Milvus. Untuk menyesuaikan ambang batas atau perilaku terkait penyimpanan, pemadatan, dan pengumpulan sampah, lihat Konfigurasi terkait dataNode dan Konfigurasi terkait dataCoord.
Jika deployment Anda menggunakan penyimpanan objek, nilai ` TEXT ` yang besar mungkin muncul sebagai objek yang dikelola Milvus di bawah jalur seperti lobs/.... Objek-objek ini merupakan detail implementasi dan tidak boleh dipindahkan, disalin, atau dihapus secara manual. Setelah Anda menghapus entitas, menghapus partisi, atau memadatkan data, penggunaan penyimpanan objek mungkin baru berkurang setelah pengumpulan sampah Milvus menghapus data objek besar yang tidak direferensikan setelah jendela keamanannya berakhir.
Penggunaan umum ` TEXT ` adalah Pencarian Teks Lengkap (Full Text Search) dengan BM25. Dalam pola ini, bidang ` TEXT ` menyimpan konten sumber asli, sedangkan BM25 menganalisis teks dan menghasilkan vektor langka (sparse vectors) untuk menentukan peringkat kecocokan berdasarkan kata kunci. Hasil pencarian kemudian dapat mengembalikan nilai ` TEXT ` yang cocok sebagai konteks untuk alur kerja LLM atau agen. Contoh berikut menunjukkan cara menggunakan bidang " TEXT " sebagai bidang masukan untuk BM25. Untuk mempelajari konsep Pencarian Teks Lengkap dan opsi kueri, lihat Pencarian Teks Lengkap.
Langkah 1: Buat koleksi dengan bidang TEXT
Contoh berikut membuat koleksi dengan bidang TEXT untuk konten sumber dan bidang vektor jarang untuk vektor jarang yang dihasilkan oleh BM25. Fungsi BM25 mengonversi teks yang telah ditokenisasi dari content menjadi vektor jarang yang disimpan di sparse.
Untuk pencarian teks lengkap BM25, bidang TEXT masukan harus diatur ke enable_analyzer=True.
from pymilvus import DataType, Function, FunctionType, MilvusClient
client = MilvusClient(uri="http://localhost:19530")
COLLECTION_NAME = "text_bm25_collection"
if client.has_collection(COLLECTION_NAME):
client.drop_collection(COLLECTION_NAME)
schema = client.create_schema(auto_id=False, enable_dynamic_field=False)
schema.add_field(field_name="id", datatype=DataType.INT64, is_primary=True)
schema.add_field(
field_name="content",
datatype=DataType.TEXT,
enable_analyzer=True,
)
schema.add_field(field_name="sparse", datatype=DataType.SPARSE_FLOAT_VECTOR)
bm25_function = Function(
name="content_bm25",
input_field_names=["content"],
output_field_names=["sparse"],
function_type=FunctionType.BM25,
)
schema.add_function(bm25_function)
Langkah 2: Buat indeks vektor spars
Buat indeks pada bidang vektor spars yang dihasilkan oleh fungsi BM25. Jenis metrik harus diatur ke BM25.
index_params = client.prepare_index_params()
index_params.add_index(
field_name="sparse",
index_type="SPARSE_INVERTED_INDEX",
metric_type="BM25",
params={
"inverted_index_algo": "DAAT_MAXSCORE",
"bm25_k1": 1.2,
"bm25_b": 0.75,
},
)
client.create_collection(
collection_name=COLLECTION_NAME,
schema=schema,
index_params=index_params,
)
Langkah 3: Masukkan data TEXT
Masukkan teks secara langsung ke dalam bidang ` TEXT `. Jangan berikan nilai untuk bidang ` sparse `. Milvus menghasilkan vektor spars secara internal dengan menerapkan fungsi BM25 ke ` content`.
data = [
{
"id": 1,
"content": "Milvus stores vector embeddings and scalar fields in collections. It supports vector search, full text search, and metadata filtering for retrieval applications.",
},
{
"id": 2,
"content": "Long documents are often split into passages before embedding. Store each passage in a TEXT field so search results can return the source text.",
},
{
"id": 3,
"content": "Operational logs and support tickets often contain long natural-language text. TEXT fields can store these values without a fixed max_length setting.",
},
]
client.insert(collection_name=COLLECTION_NAME, data=data)
client.load_collection(collection_name=COLLECTION_NAME)
Langkah 4: Lakukan pencarian teks lengkap BM25
Gunakan teks kueri mentah sebagai data pencarian dan lakukan pencarian terhadap bidang vektor spars. Milvus mengubah teks kueri menjadi vektor spars, menentukan peringkat kecocokan dengan BM25, dan mengembalikan bidang ` TEXT ` yang diminta dalam ` output_fields`.
results = client.search(
collection_name=COLLECTION_NAME,
data=["how does Milvus store source text for retrieval"],
anns_field="sparse",
limit=2,
output_fields=["content"],
)
Langkah 5: Baca nilai TEXT yang dikembalikan
Setiap hasil pencarian mencakup skor BM25 dan nilai TEXT asli.
for hit in results[0]:
print(f"id: {hit['id']}, score: {hit['distance']}")
print(hit["entity"]["content"])
Untuk informasi lebih lanjut mengenai fungsi BM25, indeks vektor jarang, dan sintaks kueri untuk pencarian teks lengkap, lihat Pencarian Teks Lengkap.