ดัชนี

หนึ่งในคุณลักษณะสำคัญของ Qdrant คือการผสมผสานระหว่างดัชนีเวกเตอร์และดัชนีดัตาลหาก สิ่งนี้สำคัญเพราะมีเพียงการมีดัชนีเวกเตอร์อย่างเดียวไม่เพียงพอที่จะทำให้การค้นหาเวกเตอร์ที่มีประสิทธิภาพภายใต้เงื่อนไขการกรองเป็นไปอย่างมีประสิทธิภาพ โดยง่ายคือ ดัชนีเวกเตอร์ช่วยเร่งค้นหาเวกเตอร์ในขณะที่ดัชนีดัตาลช่วยเร่งการกรอง

ดัชนีภายในยังมีอิสระต่อตัวในย่อหนึ่ง แต่พารามิเตอร์ของดัชนีเองถูกกำหนดไว้สำหรับชุดทั้งหมด

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

ดัชนีเดิม (Payload Index)

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

มันยังใช้ในการประมาณค่าจำนวนของเงื่อนไขการกรองอย่างแม่นยำซึ่งช่วยให้ผู้วางแผนคิวรี่เลือกกลยวที่กรองได้

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

เพื่อทำเครื่องหมายฟิลด์เป็นที่สามารถทำดัชนีได้ สามารถใช้เมธอดต่อไปนี้:

PUT /collections/{collection_name}/index

{
    "field_name": "ชื่อของฟิลด์ที่จะทำดัชนี",
    "field_schema": "keyword"
}

ประเภทของฟิลด์ที่ปรากใช้ได้ ได้แก่:

  • keyword - สำหรับโหลดจดหมายสำหรับการกรองสอดคล้อง
  • integer - สำหรับโหลดจำนวนเต็ม สำหรับการกรองและเงื่อนไขช่วง
  • float - สำหรับโหลดจำนวนทศนิยม สำหรับเงื่อนไขช่วง
  • bool - สำหรับโหลดบูลีน สำหรับการกรองสอดคล้อง (ใช้ได้ตั้งแต่เวอร์ชั่น 1.4.0 เป็นต้นไป)
  • geo - สำหรับโหลดภูมิศาสตร์ สำหรับเงื่อนไขกรอบกล่องภูมิศาสตร์และรัศมีกล่องภูมิศาสตร์
  • text - ประเภทดัชนีพิเศษที่เหมาะสำหรับโหลดคำหรือสตริง เพื่อการกรองการค้นหาสตริงแบบเต็ม

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

ดัชนีเต็มเนื้อหา (Full-text Index)

ใช้ได้ตั้งแต่เวอร์ชั่น 0.10.0

Qdrant รองรับการค้นหาเต็มเนื้อหาสำหรับโหลดสตริง ดัชนีเต็มเนื้อหาอนุญาตให้คุณกรองจุดตามการมีคำหรือวลีในฟิลด์โหลด

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

เพื่อสร้างดัชนีเต็มเนื้อหา คุณสามารถใช้เมธอดต่อไปนี้:

PUT /collections/{collection_name}/index

{
    "field_name": "ชื่อฟิลด์ที่จะทำดัชนี",
    "field_schema": {
        "type": "text",
        "tokenizer": "word",
        "min_token_len": 2,
        "max_token_len": 20,
        "lowercase": true
    }
}

วิธีการตัดคำที่สามารถใช้ได้ ได้แก่:

  • word - แบ่งสตริงตามช่องว่าง, การันต์วรรค และอักขระพิเศษ
  • whitespace - แบ่งสตริงตามช่องว่าง
  • prefix - แบ่งสตริงตามช่องว่าง, การันต์วรรค และอักขระพิเศษ แล้วสร้างดัชนีคำขึ้นสำหรับแต่ละคำ ตัวอย่างเช่น hello จะถูกทำดัชนีเป็น h, he, hel, hell, hello
  • multilingual - ประเภทพิเศษของการตัดคำที่ขึ้นอยางรับรองโดย charabia package เขาให้การตัดคำที่ถูกต้อและเลมมาท์สำหรับภาษาหลายภาษา รวมถึงภาษาที่มีอักขระภาษาละตินและตัวคั่วแบ่นต่าง กรุณาอ้างอิงเอกสารของ charabia documentation เพื่อดูรายการสมบูรณ์ของภาษาที่สนับสนุนและตัวเลือกแบบปกตินอย่างสมบูรณ์ ในการสร้างกำหนดค่าเริ่มต้น qdrant ไม่รวมการสนับสนุนภาษาทุกภาษา เพราะจะทำให้ขนาดของไฟล์ไบนารีเพิ่มขึ้น ภาษาจีน, ภาษาญี่ปุ่น, และ ภาษารีเกเรนไม่ได้ถูกเปิดใช้โดยค่าเริ่มต้น แต่สามารถถูกเปิดใช้ตามการสร้าง qdrant ที่ใช้โค้ดบทบาทหลาย ๆ อย่างด้วยคนายผลิต ใช้ลักษณะ --features multiling-chinese, multiling-japanese, multiling-korean

กรุณาอ้างอิงตัวอย่างการสร้างดัชนียเต็มเนื้อหาสำหรับการคิวรี่ategorical example of using a full-text index for queries.

ดัชนีเวกเตอร์

ดัชนีเวกเตอร์เป็นโครงสร้างข้อมูลที่ตั้งอยู่บนเวกเตอร์ ซึ่งถูกสร้างขึ้นจากแบบจำลองทางคณิตศาสตร์เฉพาะเจาะจง ด้วยดัชนีเวกเตอร์ เราสามารถค้นหาเวกเตอร์หลายตัวที่คล้ายกับเวกเตอร์เป้าหมายอย่างมีประสิทธิภาพ

ในปัจจุบัน Qdrant ใช้ HNSW เพียงอย่างเดียวเป็นดัชนีเวกเตอร์

HNSW (Hierarchical Navigable Small World Graph) เป็นอัลกอริทึมดัชนีบนกราฟ ตามกฎเฉพาะบางประการ มันสร้างโครงสร้างการนำทางหลายชั้นสำหรับกราฟ ในโครงสร้างนี้ ชั้นบนมีความห่างกันของโหนดมากกว่า และชั้นล่างมีความห่างกันของโหนดน้อยลง การค้นหาเริ่มต้นจากชั้นบน ค้นหาโหนดที่ใกล้ที่สุดกับเป้าหมายในชั้นนั้น แล้วเข้าไปในชั้นถัดไปสำหรับการค้นหาต่อไป หลังจากหลายรอบ มันสามารถเข้าใกล้เป้าหมายอย่างรวดเร็ว

เพื่อประสิทธิภาพในการปรับปรุง HNSW จำกัดขีดสูงสุดของโหนดในแต่ละชั้นของกราฟเป็น m อีกทั้งคุณสามารถระบุช่วงการค้นหาโดยใช้ ef_construct (ระหว่างการสร้างดัชนี) หรือ ef (ขณะค้นหาเป้าหมาย)

พารามิเตอร์เหล่านี้สามารถกำหนดค่าในไฟล์กำหนดค่า:

storage:
  hnsw_index:
    m: 16
    ef_construct: 100
    full_scan_threshold: 10000

ระหว่างกระบวนการสร้างคอลเล็กชัน ef สามารถกำหนดค่าได้และมีค่าเท่ากับ ef_construct ตามค่าพื้นฐาน

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

มีใช้แล้วจาก v1.1.1 ขึ้นไป

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

ดัชนีที่สามารถใช้ตัวกรอง

ดัชนีเฉพาะข้อมูลและดัชนีเวกเตอร์คนละตัวไม่สามารถแก้ปัญหาการใช้ตัวกรองในการค้นหาได้อย่างสมบูรณ์

ในกรณีที่ตัวกรองไม่เข้มงวด สามารถใช้ดัชนี HNSW โดยตรง ในกรณีที่ตัวกรองเข้มงวด payload index สามารถใช้งานและทำการคำนวณใหม่ได้อย่างสมบูรณ์ อย่างไรก็ตามในกรณีที่อยู่ระหว่างนี้ วิธีการนี้จะไม่ได้ผล

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

ช่องว่างเพิ่มเติมช่วยให้คุณใช้ดัชนี HNSW ในการค้นหาเวกเตอร์ที่อยู่ใกล้เคียงและใช้ตัวกรองในขณะค้นหาในกราฟ

วิธีการนี้ลดการมีภาระของการตรวจสอบเงื่อนไข เนื่องจากคุณต้องคำนวณเงื่อนไขสำหรับจุดบางส่วนที่มีส่วนร่วมในการค้นหา