แทรก Entities

หัวข้อนี้อธิบายวิธีการแทรกข้อมูลเข้าสู่ Milvus จากด้านลูกค้า

คุณยังสามารถใช้ MilvusDM เพื่อโยกระเบียนข้อมูลเข้าสู่ Milvus โดย MilvusDM เป็นเครื่องมือโอเพนซอร์สที่ออกแบบมาเพื่อนำเข้าและส่งออกข้อมูลกับ Milvus

Milvus 2.1 รองรับชนิดข้อมูล VARCHAR สำหรับฟิลด์สกาลาร์ ในขณะสร้างดัชนีสำหรับฟิลด์สกาลาร์ของชนิด VARCHAR ชนิดดัชนีเริ่มต้นคือตัวจัดเรียง

ตัวอย่างต่อไปนี้แทรก 2,000 แถวของข้อมูลที่สุ่มมาเป็นข้อมูลตัวอย่าง (ตัวอย่างการใช้ Milvus CLI ใช้ไฟล์ CSV ระยะไกลที่สร้างมาล่วงหน้าเก็บข้อมูลที่คล้ายกัน) ในแอปพลิเคชันจริงอาจใช้เวกเตอร์มิติสูงกว่าตัวอย่าง คุณสามารถเตรียมข้อมูลของคุณเองเพื่อแทนที่ตัวอย่าง

เตรียมข้อมูล

ก่อนอื่นเตรียมข้อมูลที่จะแทรก ชนิดข้อมูลที่จะแทรกต้องตรงกับแบบแผนของคอลเลกชัน มิลวัสรองรับค่าเริ่มต้นสำหรับฟิลด์แบบสกาลาร์ ยกเว้นฟิลด์คีย์หลัก ซึ่งหมายความว่าในระหว่างการแทรกข้อมูลหรือการอัปเดต สามารถปล่อยฟิลด์บางฟิลด์ว่างเปล่า สำหรับข้อมูลเพิ่มเติม ดูที่สร้างคอลเลกชัน

หลังจากเปิดใช้งานโครงสร้างแบบไดนามิก คุณสามารถเพิ่มฟิลด์ไดนามิกลงในข้อมูล สำหรับข้อมูลเพิ่มเติม ดูที่โครงสร้างไดนามิก

bookIDs := make([]int64, 0, 2000)
wordCounts := make([]int64, 0, 2000)
bookIntros := make([][]float32, 0, 2000)
for i := 0; i < 2000; i++ {
	bookIDs = append(bookIDs, int64(i))
	wordCounts = append(wordCounts, int64(i+10000))
	v := make([]float32, 0, 2)
	for j := 0; j < 2; j++ {
		v = append(v, rand.Float32())
	}
	bookIntros = append(bookIntros, v)
}
idColumn := entity.NewColumnInt64("book_id", bookIDs)
wordColumn := entity.NewColumnInt64("word_count", wordCounts)
introColumn := entity.NewColumnFloatVector("book_intro", 2, bookIntros)

แทรกข้อมูลเข้า Milvus

แทรกข้อมูลลงคอลเลกชัน

โดยระบุ partition_name, คุณสามารถเลือกพาร์ติชันที่แทรกข้อมูลลงไป

_, err = milvusClient.Insert(
	context.Background(), // ctx
	"book",               // CollectionName
	"",                   // partitionName
	idColumn,             // columnarData
	wordColumn,           // columnarData
	introColumn,          // columnarData
)
if err != nil {
	log.Fatal("failed to insert data:", err.Error())
}
พารามิเตอร์ คำอธิบาย
ctx ไคลเอนต์ที่ใช้ควบคุมกระบวนการเรียก API
CollectionName ชื่อของคอลเลกชันที่ต้องการแทรกข้อมูลเข้า
partitionName ชื่อของพาร์ติชันที่ต้องการแทรกข้อมูลเข้า หากปล่อยว่างเปล่า ข้อมูลจะถูกแทรกเข้าไปในพาร์ติชันเริ่มต้น
columnarData ข้อมูลที่ต้องการแทรกเข้าในแต่ละฟิลด์

เมื่อแทรก entities เข้าคอลเลกชันที่มีดัชนีไว้แล้ว คุณไม่จำเป็นต้องสร้างดัชนีใหม่เพราะ Milvus จะสร้างดัชนีอัตโนมัติสำหรับข้อมูลที่ถูกแทรกใหม่

รีเฟรชข้อมูลใน Milvus

เมื่อข้อมูลถูกแทรกเข้า Milvus ข้อมูลจะถูกแทรกเข้าเซกเม้นต์ เซกเม้นต์ต้องมีขนาดให้เพียงพอจึงจะถูกปิดกั้นและมีดัชนี หากยังไม่ได้ปิดกั้นข้อมูลจะถูกค้นหาผ่านการค้นหาแบบบรูทฟอส เพื่อหลีกเลี่ยงสถานการณ์นี้ ที่ดีที่สุดคือเรียกใช้ flush() วิธี flush() จะปิดกั้นเซกเม้นต์ที่เหลือและส่งมันไปยังดัชนี การเรียกใช้วิธีนี้เป็นสิ่งสำคัญมากที่ต้องทำเมื่อเซสชันการแทรกข้อมูลจบลง การเรียกใช้วิธีนี้บ่อยเกินไปอาจทำให้ข้อมูลแยกอยู่ ซึ่งจะต้องทำความสะอาดภายหลัง

ข้อจำกัด

คุณสมบัติ ขีดสุดสูงสุด
มิติเวกเตอร์ 32,768

อัปเดตข้อมูล

เตรียมข้อมูล

ก่อนอื่นเราต้องเตรียมข้อมูลที่จะถูกอัปเดต ประเภทของข้อมูลที่จะถูกอัปเดตต้องตรงกับ schema ของ collection มิลวุส มิลวุสจะโยนข้อยกเว้นถ้าชนิดข้อมูลไม่ตรงกับ schema ของ collection

มิลวุสรองรับค่าเริ่มต้นสำหรับฟิลด์สกาลาร์ ยกเว้นฟิลด์คีย์หลัก นั่นหมายความว่าระหว่างกระบวนการแทรกข้อมูลหรืออัปเดต ฟิลด์บางอย่างสามารถเหลือเปล่าได้ สำหรับข้อมูลเพิ่มเติมโปรดอ้างอิงไปที่การสร้างคอลเลกชัน

nEntities := 3000
dim := 8
idList := make([]int64, 0, nEntities)
randomList := make([]float64, 0, nEntities)
embeddingList := make([][]float32, 0, nEntities)

for i := 0; i < nEntities; i++ {
    idList = append(idList, int64(i))
}

for i := 0; i < nEntities; i++ {
    randomList = append(randomList, rand.Float64())
}

for i := 0; i < nEntities; i++ {
    vec := make([]float32, 0, dim)
    for j := 0; j < dim; j++ {
        vec = append(vec, rand.Float32())
    }
    embeddingList = append(embeddingList, vec)
}
idColData := entity.NewColumnInt64("ID", idList)
randomColData := entity.NewColumnDouble("random", randomList)
embeddingColData := entity.NewColumnFloatVector("embeddings", dim, embeddingList)

อัปเดตข้อมูล

อัปเดตข้อมูลลงในคอลเลกชัน

if _, err := c.Upsert(ctx, collectionName, "", idColData, embeddingColData);
err != nil {
    log.Fatalf("ล้มเหลวในการ upsert ข้อมูล, ข้อผิดพลาด: %v", err)
}