คะแนน
คะแนนเป็นศูนย์กลางที่ถูกปรับเปลี่ยนแก้ไขโดย Qdrant คะแนนคือบันทึกที่ประกอบด้วยเวกเตอร์และข้อมูล Payload ที่ไม่บังคับ
คุณสามารถค้นหาคะแนนที่จัดกลุ่มในคอลเลกชันตามความคล้ายคลึงของเวกเตอร์ สามารถดูชี้เพิ่มเติมเกี่ยวกับกระบวนการนี้ในส่วนการค้นหาและกรอง
ส่วนนี้โชว์วิธีการสร้างและจัดการเวกเตอร์
การดำเนินการแก้ไขที่ถูกทำบนคะแนนเป็นขั้นตอนที่ไม่โต้ตอบและถูกแบ่งออกเป็นสองขั้นตอน ขั้นแรก การดำเนินการจะถูกเขียนลงในบันทึกการเขียนไว้ล่วงหน้า
ในขณะนี้ แม้เครื่องจะสูญเสียพลังงาน บริการก็จะไม่สูญเสียข้อมูล
เคล็ดลับ: คะแนนเป็นแนวคิดนามธรรมใน Qdrant คุณสามารถคิดเรื่องมันเป็นแถวข้อมูลในตาราง MySQL
การรอผลลัพธ์
หากเรียกใช้ API ด้วยพารามิเตอร์ &wait=false
หรือไม่ได้ระบุโดยชัดเจน ลูกค้าจะได้รับข้อความยืนยันสำหรับการรับข้อมูลดังนี้:
{
"result": {
"operation_id": 123,
"status": "acknowledged"
},
"status": "ok",
"time": 0.000206061
}
การตอบกลับนี้ไม่รับรองการเรียกขอข้อมูลทันที มันใช้อย่างสิ้นเชิงของการสอดคล้อง อาจใช้เวลานานขณะกระบวนการจริงในการอัพเดตคอลเลกชัน ในความเป็นจริง คำขอนี้อาจล้มเหลวได้ หากจำเป็นต้องใช้ความสามารถในการค้นหาทันทีหลังจากการตอบกลับของ API ให้ใช้ธง ?wait=true
ในกรณีนี้ API จะส่งผลลัพธ์กลับเมื่อการดำเนินการเสร็จสมบูรณ์:
{
"result": {
"operation_id": 0,
"status": "completed"
},
"status": "ok",
"time": 0.000206061
}
ไอดีของคะแนน
Qdrant สนับสนุนการใช้ จำนวนเต็ม 64 บิตที่ไม่ลบ
และ UUIDs
เป็นตัวบ่งชี้สำหรับคะแนน
ตัวอย่างของสตริงที่แทน UUID มีดังนี้:
- การแทนตัวอย่างที่ง่าย:
936DA01F9ABD4d9d80C702AF85C822A8
- การแทนที่มีขีด:
550e8400-e29b-41d4-a716-446655440000
- URN:
urn:uuid:F9168C5E-CEB2-4faa-B6BF-329BF39FA1E4
นี้หมายความว่าในแต่ละคำขอ สตริง UUID สามารถใช้แทนที่ของ ID ที่เป็นตัวเลขได้ เช่น:
PUT /collections/{collection_name}/points
{
"points": [
{
"id": "5c56c793-69f3-4fbf-87e6-c4bf54c28c26",
"payload": {"color": "red"},
"vector": [0.9, 0.1, 0.1]
}
]
}
และ
PUT /collections/{collection_name}/points
{
"points": [
{
"id": 1,
"payload": {"color": "red"},
"vector": [0.9, 0.1, 0.1]
}
]
}
ถือเป็นคำถูกต้องทั้งสองการแทนที่
การอัปโหลดจุดข้อมูล
เพื่อเพิ่มประสิทธิภาพ Qdrant รองรับการอัปโหลดจุดข้อมูลเป็นกลุ่ม ซึ่งหมายความว่าคุณสามารถอัปโหลดจุดข้อมูลหลายจุดเข้าสู่บริการในการเรียก API เดียว การอัปโหลดแบทช์สามารถลดการบิดเบียนในการเชื่อมต่อเครือข่ายอย่างมีนัยสำคัญ
Qdrant API รองรับวิธีการสร้างแบทช์อย่างหนึ่งโดยใช้วิธีการเชิงบรรทัดและเชิงคอลัมน์ ภายในเหล่าตัวเลือกเหล่านี้ไม่แตกต่างกันและเป็นเพียงสำหรับความสะดวกในการปฏิสัมพันธ์
การสร้างจุดข้อมูลโดยใช้ REST API:
PUT /collections/{collection_name}/points
{
"batch": {
"ids": [1, 2, 3],
"payloads": [
{"color": "red"},
{"color": "green"},
{"color": "blue"}
],
"vectors": [
[0.9, 0.1, 0.1],
[0.1, 0.9, 0.1],
[0.1, 0.1, 0.9]
]
}
}
หรือใช้วิธีที่เทียบเท่ากันโดยใช้วิธีการเชิงบรรทัด:
PUT /collections/{collection_name}/points
{
"points": [
{
"id": 1,
"payload": {"color": "red"},
"vector": [0.9, 0.1, 0.1]
},
{
"id": 2,
"payload": {"color": "green"},
"vector": [0.1, 0.9, 0.1]
},
{
"id": 3,
"payload": {"color": "blue"},
"vector": [0.1, 0.1, 0.9]
}
]
}
ทุก API ใน Qdrant รวมถึงการอัปโหลดจุดข้อมูล เป็นแบบ idempotent นั้นหมายความว่าการดำเนินการด้วยวิธีเดียวกันซ้อนกันหลายครั้งเท่ากับการดำเนินการเดียวเดียว
ในกรณีนี้ หมายความว่าเมื่ออัปโหลดจุดข้อมูลซึ่งมี id เดิม จุดข้อมูลที่มีอยู่ก่อนหน้านี้จะถูกเขียนทับ
คุณสมบัติ idempotent นี้มีประโยชน์สำหรับการใช้คิวข้อความที่ไม่มีการให้การรับรองที่แม่นยำ แม้กระนั้นในกรณีนี้ Qdrant ยังมั่นใจถึงความสอดคล้องข้อมูล
สามารถใช้ได้ตั้งแต่ v0.10.0
หากคอลเลคชันที่กำลังสร้างมีเวกเตอร์มากกว่าหนึ่ง เราสามารถให้ข้อมูลสำหรับแต่ละเวกเตอร์โดยระบุชื่อเวกเตอร์:
PUT /collections/{collection_name}/points
{
"points": [
{
"id": 1,
"vector": {
"image": [0.9, 0.1, 0.1, 0.2],
"text": [0.4, 0.7, 0.1, 0.8, 0.1, 0.1, 0.9, 0.2]
}
},
{
"id": 2,
"vector": {
"image": [0.2, 0.1, 0.3, 0.9],
"text": [0.5, 0.2, 0.7, 0.4, 0.7, 0.2, 0.3, 0.9]
}
}
]
}
สามารถใช้ได้ตั้งแต่ v1.2.0
การระบุชื่อเวกเตอร์เป็นได้และหากอัปโหลดจุดข้อมูล บางเวกเตอร์อาจถูกละเว้นได้ ยกตัวอย่างเช่น คุณสามารถอัปโหลดจุดข้อมูลที่มีเพียงเพียงเวกเตอร์ image
และอีกส่วนที่มีเพียงเพียงเวกเตอร์ text
เมื่อการปรับเปลี่ยนจุดข้อมูลด้วย ID ที่มีอยู่ จุดข้อมูลที่มีอยู่จะถูกลบก่อนและจึงนำมาแทนที่ด้วยเวกเตอร์ที่ระบุ กล่าวอีกนัยหนึ่งคือจุดข้อมูลทั้งหมดจะถูกแทนที่และเวกเตอร์ที่ไม่ได้ระบุจะถูกตั้งเป็นค่า null หากต้องการเก็บเวกเตอร์ที่มีอยู่ไม่เปลี่ยนแปลงและเพียงแค่อัปเดตเฉพาะเวกเตอร์ที่ระบุ โปรดอ้างถึงการอัปเดตเวกเตอร์
อัพเดทเวกเตอร์
มีจำหน่ายตั้งแต่เวอร์ชัน v1.2.0
เมธอดนี้อัพเดทเวกเตอร์ที่ระบุที่จุดที่กำหนด โดยที่เวกเตอร์ที่ไม่ได้ระบุจะไม่เปลี่ยนแปลง จุดที่กำหนดทั้งหมดต้องมีอยู่
REST API (Schema):
PUT /collections/{collection_name}/points/vectors
{
"points": [
{
"id": 1,
"vector": {
"image": [0.1, 0.2, 0.3, 0.4]
}
},
{
"id": 2,
"vector": {
"text": [0.9, 0.8, 0.7, 0.6, 0.5, 0.4, 0.3, 0.2]
}
}
]
}
หากต้องการอัพเดทจุดและเปลี่ยนเวกเตอร์ทั้งหมด โปรดอ้างถึงการดำเนินการอัพโหลดจุด
ลบเวกเตอร์
มีจำหน่ายตั้งแต่เวอร์ชัน v1.2.0
เมธอดนี้จะลบเฉพาะเวกเตอร์ที่ระบุจากจุดที่กำหนด เวกเตอร์อื่น ๆ จะไม่เปลี่ยนแปลง จุดจะไม่ถูกลบ
REST API (Schema):
POST /collections/{collection_name}/points/vectors/delete
{
"points": [0, 3, 100],
"vectors": ["text", "image"]
}
ตั้งค่ามูลค่า
ตั้งค่าค่าที่กำหนดลงบนจุด
REST API (Schema):
POST /collections/{collection_name}/points/payload
{
"payload": {
"property1": "string",
"property2": "string"
},
"points": [
0, 3, 100
]
}
คุณไม่จำเป็นต้องทราบ id ของจุดที่จะปรับเปลี่ยน วิธีอื่นคือใช้ตัวกรอง
POST /collections/{collection_name}/points/payload
{
"payload": {
"property1": "string",
"property2": "string"
},
"filter": {
"must": [
{
"key": "color",
"match": {
"value": "red"
}
}
]
}
}
ซ้ำเขียน มูลค่า
ซ้ำเขียน มูลค่าที่มีอยู่ด้วย มูลค่าที่กำหนด
REST API (Schema):
PUT /collections/{collection_name}/points/payload
{
"payload": {
"property1": "string",
"property2": "string"
},
"points": [
0, 3, 100
]
}
คล้ายกับ ตั้งค่ามูลค่า, คุณไม่จำเป็นต้องทราบ id ของจุดที่จะปรับเปลี่ยน วิธีอื่น ๆ คือใช้ตัวกรอง
ลบคีย์ข้อมูลค่า
REST API (Schema):
POST /collections/{collection_name}/points/payload/delete
{
"keys": ["color", "price"],
"points": [0, 3, 100]
}
แทนที่คุณสามารถใช้ตัวกรองเพื่อลบคีย์ข้อมูลค่าจากจุด
POST /collections/{collection_name}/points/payload/delete
{
"keys": ["color", "price"],
"filter": {
"must": [
{
"key": "color",
"match": {
"value": "red"
}
}
]
}
}
เคลียร์ค่า
เมธอดนี้ลบคีย์ข้อมูลค่าทั้งหมดจากจุดที่ระบุ
REST API (Schema):
POST /collections/{collection_name}/points/payload/clear
{
"points": [0, 3, 100]
}
ลบจุด
REST API (Schema):
POST /collections/{collection_name}/points/delete
{
"points": [0, 3, 100]
}
วิธีอื่น ๆ ในการระบุจุดที่จะลบคือ โดยใช้ตัวกรอง:
POST /collections/{collection_name}/points/delete
{
"filter": {
"must": [
{
"key": "color",
"match": {
"value": "red"
}
}
]
}
}
ตัวอย่างนี้ลบทุกจุดที่มี { "color": "red" }
จากคอลเล็กชัน.
ดึงข้อมูลจุด
วิธีการดึงข้อมูลจุดตาม ID:
REST API (Schema):
POST /collections/{collection_name}/points
{
"ids": [0, 3, 100]
}
วิธีนี้มีพารามิเตอร์เสริม with_vectors
และ with_payload
โดยใช้พารามิเตอร์เหล่านี้ คุณสามารถเลือกส่วนที่ต้องการจากผลลัพธ์ของจุดได้ เช่น การไม่รวมช่วยให้ประหยัดการโอนข้อมูลที่เป็นประโยชน์
ยังสามารถดึงข้อมูลจุดเดี่ยวผ่าน API ได้:
REST API (Schema):
GET /collections/{collection_name}/points/{point_id}
สครอล
บางครั้งจำเป็นต้องดึงข้อมูลจุดทั้งหมดที่เก็บไว้โดยไม่รู้เลขลำดับของพวกมัน หรือจำเป็นต้องทำการหมุนเวียนผ่านจุดที่ตรงตามเงื่อนไขการกรอง
REST API (Schema):
POST /collections/{collection_name}/points/scroll
{
"filter": {
"must": [
{
"key": "color",
"match": {
"value": "red"
}
}
]
},
"limit": 1,
"with_payload": true,
"with_vector": false
}
คืนค่าทุกจุดที่ตรงกับ color
=red
:
{
"result": {
"next_page_offset": 1,
"points": [
{
"id": 0,
"payload": {
"color": "red"
}
}
]
},
"status": "ok",
"time": 0.0001
}
API สครอลจะคืนค่าทุกจุดที่ตรงกับตัวกรองในรูปแบบหน้าหนัง
ข้อมูลจุดที่ได้รับทั้งหมดจะถูกเรียงตาม ID เพื่อค้นหาหน้าต่อไป คุณต้องระบุ ID สูงสุดที่ค้นพบไว้ในฟิลด์ offset
เพื่อความสะดวก ID นี้ยังคืนค่าในฟิลด์ next_page_offset
หากค่าของฟิลด์ next_page_offset
เป็น null
แปลว่าเราดึงหน้าสุดท้ายแล้ว
นับจุด
มีจากเวอร์ชัน v0.8.4
บางครั้ง จำเป็นต้องรู้จำนวนของจุดที่ตรงตามเงื่อนไขการกรองโดยไม่ต้องทำการค้นหาเสมจริง
ตัวอย่างเช่น นี่สามารถมีประโยชน์ในสถานการณ์ต่อไปนี้:
- ประมาณขนาดผลลัพธ์สำหรับค้นหาแบบเฟซิต
- กำหนดจำนวนหน้าสำหรับการแบ่งหน้า
- ดีบักการซ้ำเร็วของการประมวลผลคำค้นหา
REST API (Schema):
POST /collections/{collection_name}/points/count
{
"filter": {
"must": [
{
"key": "color",
"match": {
"value": "red"
}
}
]
},
"exact": true
}
คืนค่าจำนวนของจุดที่ตรงตามเงื่อนไขการกรองที่กำหนด:
{
"count": 3811
}
การอัปเดตเป็นชุด
ว่างว่ายตั้งแต่ v1.5.0
คุณสามารถดำเนินการเป็นชุดบนหลายจุดได้ ซึ่งรวมถึงการแทรก อัปเดต และลบจุด เวกเตอร์ และข้อมูลเพย์โหลด
คำขออัปเดตเป็นชุดประกอบด้วยการดำเนินการต่าง ๆ ที่ดำเนินการตามลำดับ การดำเนินการที่สามารถทำเป็นชุดได้ ได้แก่:
- แทรกหรืออัปเดตจุด:
upsert
หรือUpsertOperation
- ลบจุด:
delete_points
หรือDeleteOperation
- อัปเดตเวกเตอร์:
update_vectors
หรือUpdateVectorsOperation
- ลบเวกเตอร์:
delete_vectors
หรือDeleteVectorsOperation
- ตั้งเพย์โหลด:
set_payload
หรือSetPayloadOperation
- เขียนทับเพย์โหลด:
overwrite_payload
หรือOverwritePayload
- ลบเพย์โหลด:
delete_payload
หรือDeletePayloadOperation
- ล้างเพย์โหลด:
clear_payload
หรือClearPayloadOperation
ตัวอย่างโค้ดต่อไปนี้ใช้การดำเนินการทุกประการ
REST API (Schema):
POST /collections/{collection_name}/points/batch
{
"operations": [
{
"upsert": {
"points": [
{
"id": 1,
"vector": [1.0, 2.0, 3.0, 4.0],
"payload": {}
}
]
}
},
{
"update_vectors": {
"points": [
{
"id": 1,
"vector": [1.0, 2.0, 3.0, 4.0]
}
]
}
},
{
"delete_vectors": {
"points": [1],
"vector": [""]
}
},
{
"overwrite_payload": {
"payload": {
"test_payload": "1"
},
"points": [1]
}
},
{
"set_payload": {
"payload": {
"test_payload_2": "2",
"test_payload_3": "3"
},
"points": [1]
}
},
{
"delete_payload": {
"keys": ["test_payload_2"],
"points": [1]
}
},
{
"clear_payload": {
"points": [1]
}
},
{"delete": {"points": [1]}}
]
}
เพื่อใช้การดำเนินการจุดเป็นชุดด้วยประการเดียว ให้ใช้คุณสมบัติของชุดโดยตรงภายในประการดังกล่าว