ไลบรารีเอนจินค้นหาแบบฟูลเท็กซ์ความเร็วสูงที่เขียนด้วย Rust
แนะนำ
- Tantivy เป็นไลบรารีเอนจินค้นหาที่อ้างอิงการออกแบบจาก Apache Lucene อย่างมาก
- ยังมี Quickwit ซึ่งเป็นเอนจินค้นหาแบบกระจายศูนย์ที่สามารถใช้เป็นทางเลือกแทน Elasticsearch หรือ Apache Solr ได้
- Tantivy ไม่ใช่เซิร์ฟเวอร์เอนจินค้นหา แต่เป็น crate สำหรับสร้างเอนจินค้นหา
เบนช์มาร์ก
- มีการให้ผลการทดสอบประสิทธิภาพสำหรับคิวรีและประเภทคอลเลกชันที่หลากหลาย
- ประสิทธิภาพอาจแตกต่างกันไปตามลักษณะของคิวรีและภาระงาน
ฟีเจอร์หลัก
- การค้นหาแบบฟูลเท็กซ์: รองรับ tokenizer สำหรับหลายภาษา
- ประสิทธิภาพสูง: เริ่มทำงานได้รวดเร็วและรองรับการทำดัชนีแบบมัลติเธรด
- การให้คะแนน BM25: ใช้วิธีให้คะแนนแบบเดียวกับ Lucene
- คิวรีภาษาธรรมชาติ: รองรับการจัดการคิวรีที่ซับซ้อนได้อย่างเป็นธรรมชาติ
- คิวรีช่วงและฟิลด์แฟเซตแบบลำดับชั้น: รองรับชนิดข้อมูลที่หลากหลาย
- ที่เก็บเอกสารแบบบีบอัด: รองรับวิธีบีบอัดหลายแบบ เช่น LZ4, Zstd
- ฟิลด์ JSON และตัวรวบรวมการรวมข้อมูล: รองรับ histogram, range bucket, ค่าเฉลี่ย และเมตริกทางสถิติ
สิ่งที่ไม่รองรับ
- การค้นหาแบบกระจายศูนย์อยู่นอกขอบเขตของ Tantivy หากต้องการการค้นหาแบบกระจายศูนย์ให้ดู Quickwit
เริ่มต้นใช้งาน
- Tantivy ทำงานบน Rust รุ่นเสถียร และรองรับ Linux, macOS, Windows
- tantivy-cli: มีอินเทอร์เฟซบรรทัดคำสั่งสำหรับสร้างเอนจินค้นหา ทำดัชนี และค้นหาได้อย่างง่ายดาย
- เอกสารอ้างอิง: มีเอกสารอ้างอิงสำหรับเวอร์ชันรีลีสล่าสุด
วิธีสนับสนุนโปรเจ็กต์
- ใช้งาน Tantivy และแบ่งปันประสบการณ์
- ส่งรายงานบั๊ก
- เขียนบล็อกโพสต์
- ช่วยด้านเอกสาร
- ร่วมพัฒนาโค้ด
การร่วมพัฒนาโค้ด
- ใช้เวิร์กโฟลว์ GitHub Pull Request
- เมื่อมีส่วนร่วม ให้ อ้างอิง GitHub ticket และเขียนข้อความ commit ที่ครอบคลุม
FAQ
- รองรับภาษาอื่น: มี language binding สำหรับหลายภาษา เช่น Python, Ruby
- ตัวอย่างการใช้งาน: ถูกใช้ในหลายโปรเจ็กต์ เช่น seshat, tantiny, lnx
- การเปรียบเทียบความเร็ว: เร็วกว่า Lucene ประมาณ 2 เท่า
- รองรับ incremental indexing: ใช่
- การแก้ไขเอกสาร: เอกสารเป็นแบบ immutable ต้องลบแล้วทำดัชนีใหม่
- ค้นหาได้เมื่อใดระหว่างการทำดัชนี: ค้นหาได้หลังเรียก
commit
ความเห็นของ GN⁺
- ประสิทธิภาพสูงบนพื้นฐาน Rust: เป็นเอนจินค้นหาที่รวดเร็วโดยใช้ประโยชน์จากประสิทธิภาพและความปลอดภัยของ Rust จึงเหมาะกับโปรเจ็กต์ที่ให้ความสำคัญกับประสิทธิภาพ
- รองรับหลายภาษา: ใช้งานได้ในหลายสภาพแวดล้อมผ่าน language binding เช่น Python, Ruby
- incremental indexing: เป็นฟีเจอร์ที่มีประโยชน์เมื่อต้องจัดการข้อมูลขนาดใหญ่
- ความเป็น immutable ของเอกสาร: ช่วยรักษาความสอดคล้องของข้อมูล แต่หากแก้ไขเอกสารต้องทำดัชนีใหม่
- การทำงานร่วมกับ Quickwit: หากต้องการการค้นหาแบบกระจายศูนย์ การใช้ร่วมกับ Quickwit เป็นทางเลือกที่ดี
1 ความคิดเห็น
ความคิดเห็นจาก Hacker News
แชร์ประสบการณ์โปรเจกต์: เคยใช้ไลบรารีนี้สร้าง <a href="https://progscrape.com" rel="nofollow">progscrape.com</a> ขึ้นใหม่เพื่อแทนที่โค้ดเบส Python2 AppEngine รุ่นเก่า ไลบรารีนี้เร็วมาก และสามารถทำดัชนีเรื่องราว 1M รายการบน Raspberry Pi ได้ในเวลาไม่กี่วินาที การใช้ CPU ต่ำมาก และประสิทธิภาพการค้นหาก็ยอดเยี่ยม
ParadeDB และ Tantivy: เพิ่งได้รู้จัก Tantivy ผ่าน ParadeDB (ส่วนขยายของ Postgres) เมื่อไม่นานมานี้ โดยถูกใช้เพื่อขยาย Postgres สำหรับงานวิเคราะห์ประสิทธิภาพสูง
Quickwit และ Clickhouse: ในโปรเจกต์ค้นหาแบบหลายภาษา ประสิทธิภาพที่ได้จากการใช้ Quickwit ร่วมกับ Clickhouse นั้นดีมาก โดยเฉพาะมีประโยชน์กับการค้นหาภาษาจีน ญี่ปุ่น และเกาหลี
ข้อจำกัดของ
to_tsvector:to_tsvectorของ PostgreSQL ไม่ค่อยเหมาะกับบางกรณีการใช้งาน ขอให้ Tantivy ประสบความสำเร็จการดีพลอย Quickwit ใน production: เคยใช้ Quickwit ทำดัชนีวัตถุนับพันล้านรายการ ทั้งความเร็วในการทำดัชนีและ latency ของคิวรีอยู่ในระดับแข่งขันได้ การแยก compute ออกจาก storage มีประโยชน์มาก
ประสิทธิภาพของ Tantivy: ประทับใจกับประสิทธิภาพของ Tantivy และความทุ่มเทของผู้ก่อตั้ง มั่นใจว่าทีมจะประสบความสำเร็จ
การค้นหาแบบ trigram ของ Etsy/Hound: เคยมีประสบการณ์ใช้ดัชนีค้นหาแบบ trigram ในภาษา Go ที่อิงจากการจับคู่ regular expression ของ Russ Cox
เหตุผลที่เลือก Tantivy: เลือก Tantivy เพราะผิดหวังกับการใช้ทรัพยากรของ Elasticsearch อีกทั้งอยากทำโปรเจกต์ด้วย Rust และ Tantivy ก็มีทั้งประสิทธิภาพและเอกสารประกอบที่ดีมาก
ปัญหาการอัปเกรด Lucene และ Solr: Lucene และ Solr รองรับการอัปเกรดดัชนีได้ไม่ดีนัก สำหรับโปรเจกต์ขนาดใหญ่จำนวนมาก การทำดัชนีใหม่มีต้นทุนสูงมาก และบางครั้งก็เป็นไปไม่ได้
ข้อจำกัดในการเพิ่ม/ลบฟิลด์: ใน Tantivy ไม่สามารถเพิ่มหรือลบฟิลด์ได้ และต้องทำดัชนีข้อมูลทั้งหมดใหม่ลงในดัชนีค้นหาอีกชุดหนึ่ง
ทางเลือกแทน Meilisearch: มองหา Tantivy เป็นทางเลือกแทน Meilisearch เพราะปัญหาเรื่อง telemetry และดูเหมือนว่าการตั้งค่าจะง่าย
LanceDb และ Tantivy: ผลิตภัณฑ์ฐานข้อมูลเวกเตอร์ชื่อ LanceDb ใช้ Tantivy เพื่อให้ความสามารถด้านการค้นหาแบบ full-text ตอนนี้ทำได้ผ่าน Python binding เท่านั้น แต่มีแผนจะทำ Rust binding