คะแนน

คะแนนเป็นศูนย์กลางที่ถูกปรับเปลี่ยนแก้ไขโดย 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]}}
    ]
}

เพื่อใช้การดำเนินการจุดเป็นชุดด้วยประการเดียว ให้ใช้คุณสมบัติของชุดโดยตรงภายในประการดังกล่าว