แทรกรายการ

ในส่วนนี้จะอธิบายถึงวิธีการแทรกข้อมูลเข้าสู่ Milvus ผ่านทางฝั่งไคลเอ็นต์

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

Milvus 2.1 รองรับชนิดข้อมูล VARCHAR บนฟิลด์สเกาลาร์ (scalar fields) โดยเมื่อสร้างดัชนีสำหรับฟิลด์สเกาลาร์ชนิด VARCHAR ดัชนีปริยายที่ใช้คือ trie

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

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

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

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

import random
data = [
  [i for i in range(2000)],
  [str(i) for i in range(2000)],
  [i for i in range(10000, 12000)],
  [[random.random() for _ in range(2)] for _ in range(2000)],
  [],
  None,
]

data.append([str("dy"*i) for i in range(2000)])

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

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

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

from pymilvus import Collection
collection = Collection("book")      # ได้คอลเลกชันที่มีอยู่
mr = collection.insert(data)
พารามิเตอร์ คำอธิบาย
data ข้อมูลที่จะแทรกเข้า Milvus
partition_name (ไม่จำเป็น) ชื่อของพาร์ทิชันที่ข้อมูลจะถูกแทรกเข้าไป

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

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

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

ข้อ จำกัด

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

อัปเซิร์ต Entity

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

ตัวอย่างต่อไปนี้ทำการอัปเดต รายการข้อมูลที่สร้างอยู่แบบสุ่ม 3,000 แถว เมื่อดำเนินการอัปเดต จำเป็นต้องระวางว่าการดำเนินการนี้อาจมีผลต่อประสิทธิภาพเนื่องจากมีการลบข้อมูล

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

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

import random
nb = 3000
dim = 8
vectors = [[random.random() for _ in range(dim)] for _ in range(nb)]
data = [
    [i for i in range(nb)],
    [str(i) for i in range(nb)],
    [i for i in range(10000, 10000+nb)],
    vectors,
    [str("dy"*i) for i in range(nb)]
]

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

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

from pymilvus import Collection
collection = Collection("book")  # Get the existing collection.
mr = collection.upsert(data)

ลบ Entity

Milvus รองรับการลบเอนทิตีโดยใช้สูตรตรรกะผ่าน primary keys.

เตรียมสมการบูลีน

เตรียมสมการบูลีนเพื่อกรององค์ประกอบที่ต้องการลบ

Milvus รองรับการลบองค์ประกอบที่มี primary key ที่ระบุโดยชัดเจนเท่านั้น ซึ่งสามารถทำได้โดยใช้ตัวดำเนินการ "in" ตัวดำเนินการอื่น ๆ สามารถใช้ได้เฉพาะในการกรองแบบ scalar สำหรับการคิวรี่หรือค้นหาเวกเตอร์เท่านั้น

ตัวอย่างต่อไปนี้กรองข้อมูลโดยใช้ค่า primary key ของ 0 และ 1

expr = "book_id in [0,1]"

เหมือนกับคำสั่ง WHERE clause ใน SQL

ลบองค์ประกอบ

ใช้สมการบูลีนที่คุณสร้างเพื่อลบองค์ประกอบ Milvus จะส่งคืนรายการของ ID ขององค์ประกอบที่ถูกลบ

from pymilvus import Collection
collection = Collection("book")      # รับองค์ประกอบที่มีอยู่
collection.delete(expr)

บีบองค์ประกอบข้อมูล

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

หากการบีบองค์ประกอบอัตโนมัติถูกปิด คุณยังสามารถบีบอันดั้นข้อมูลด้วยตนเอง

บีบอัตโนมัติข้อมูลด้วยตนเอง

เนื่องจากการบีบองค์ประกอบมักใช้เวลานาน คำขอการบีบองค์ประกอบจะถูกประมวลผลโดยไม่ระบุ

from pymilvus import Collection
collection = Collection("book")      # รับองค์ประกอบที่มีอยู่
collection.compact()

ตรวจสอบสถานะการบีบองค์ประกอบ

คุณสามารถใช้ ID การบีบองค์ประกอบที่ส่งคืนเมื่อเริ่มการบีบองค์ประกอบเพื่อตรวจสอบสถานะการบีบองค์ประกอบ

collection.get_compaction_state()