ดัชนี
หนึ่งในคุณลักษณะสำคัญของ 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 ในการค้นหาเวกเตอร์ที่อยู่ใกล้เคียงและใช้ตัวกรองในขณะค้นหาในกราฟ
วิธีการนี้ลดการมีภาระของการตรวจสอบเงื่อนไข เนื่องจากคุณต้องคำนวณเงื่อนไขสำหรับจุดบางส่วนที่มีส่วนร่วมในการค้นหา