1 poin oleh GN⁺ 2024-05-28 | 1 komentar | Bagikan ke WhatsApp
  • Tantivy adalah pustaka mesin pencari full-text cepat yang ditulis dalam Rust, dan lebih dekat ke sebuah crate untuk membangun mesin pencari daripada server pencarian siap pakai
  • Desainnya sangat terinspirasi oleh Apache Lucene, dan bila Anda mencari server alternatif untuk Elasticsearch atau Apache Solr, disarankan untuk melihat mesin pencari terdistribusi Quickwit yang dibangun di atas Tantivy
  • Fitur-fiturnya mencakup pencarian full-text, penilaian BM25, kueri natural, pencarian frasa, pengindeksan inkremental, pengindeksan multithread, direktori mmap, kompresi integer SIMD, pencarian facet, field JSON, dan Aggregation Collector
  • Berjalan di stable Rust serta mendukung Linux, macOS, dan Windows, dengan waktu startup kurang dari 10ms sehingga cocok untuk alat baris perintah
  • Pencarian terdistribusi berada di luar cakupan Tantivy; untuk memodifikasi dokumen, dokumen lama harus dihapus lalu diindeks ulang, dan dokumen baru dapat dicari setelah commit, reload IndexReader, serta memperoleh Searcher baru

Posisi dan desain Tantivy

  • Tantivy adalah pustaka mesin pencari full-text cepat yang ditulis dalam Rust
  • Bukan server mesin pencari yang bisa langsung dijalankan seperti Elasticsearch atau Apache Solr, melainkan sebuah crate yang dapat digunakan untuk membangun mesin pencari semacam itu
  • Dari sisi desain, ia lebih dekat ke Apache Lucene dan sangat terinspirasi oleh desain Lucene
  • Jika Anda mencari alternatif untuk Elasticsearch atau Apache Solr, disarankan untuk melihat mesin pencari terdistribusi Quickwit yang dibangun di atas Tantivy

Performa dan benchmark

  • Tantivy menyediakan benchmark yang membagi performa menurut jenis kueri dan koleksi
  • Hasil benchmark dapat berbeda tergantung karakteristik kueri dan beban kerja
  • Detail benchmark dapat dilihat di repositori search-benchmark-game
  • Menurut FAQ, pada benchmark latensi pencarian, Tantivy rata-rata sekitar 2x lebih cepat daripada Lucene

Fitur pencarian dan pengindeksan

  • Fitur pencarian

    • Pencarian full-text
    • Penilaian BM25 seperti Lucene
    • Dukungan kueri natural: (michael AND jackson) OR "king of pop"
    • Dukungan pencarian frasa: "michael jackson"
    • Kueri rentang
    • Pencarian facet
    • JSON Field
    • Aggregation Collector: histogram, range buckets, average, stats metrics
  • Fitur pengindeksan

    • Mendukung pengindeksan inkremental
    • Mendukung pengindeksan multithread
    • Pengindeksan Wikipedia bahasa Inggris disebut dapat selesai dalam kurang dari 3 menit di desktop
    • Konfigurasi pengindeksan dimungkinkan melalui term frequency opsional dan position indexing
    • Mendukung LogMergePolicy with deletes
    • Menyediakan Searcher Warmer API
  • Penyimpanan dan field

    • Mendukung mmap directory
    • Mendukung fast fields single-valued dan multivalued untuk u64, i64, f64
    • Mendukung fast fields &[u8]
    • Mendukung field text, i64, u64, f64, dates, ip, bool, hierarchical facet
    • Kompresi penyimpanan dokumen mendukung LZ4, Zstd, dan None

Tokenizer dan dukungan bahasa

Lingkungan eksekusi dan cara memulai

git clone https://github.com/quickwit-oss/tantivy.git
cd tantivy
cargo test

Fitur di luar cakupan dan model perubahan data

  • Pencarian terdistribusi berada di luar cakupan Tantivy
  • Jika membutuhkan pencarian terdistribusi, disarankan untuk melihat Quickwit
  • Data di Tantivy bersifat immutable
  • Untuk memodifikasi dokumen, dokumen lama harus dihapus lalu diindeks ulang
  • Dokumen yang sedang diindeks dapat dicari setelah commit dipanggil di IndexWriter
  • IndexReader yang sudah ada harus di-reload untuk mencerminkan perubahan
  • Perubahan hanya terlihat pada Searcher yang baru diperoleh

Binding dan contoh penggunaan

  • Binding yang dapat digunakan dari bahasa lain
    • Python: tantivy-py
    • Ruby: tantiny
    • Binding lain juga dapat ditemukan di GitHub, tetapi mungkin kurang terawat
  • Contoh penggunaan Tantivy
    • seshat: basis data/pengindeks pesan Matrix
    • tantiny: pencarian full-text kecil untuk Ruby
    • lnx: mesin pencari toleran typo adaptif dengan REST API
    • Bichon: pengarsip email Rust ringan berperforma tinggi dengan WebUI
  • Perusahaan yang ditampilkan sebagai pengguna Tantivy meliputi Etsy, ParadeDB, Nuclia, Humanfirst.ai, dan Element.io

1 komentar

 
GN⁺ 2024-05-28
Komentar Hacker News
  • Orang-orang yang membuat pustaka ini benar-benar hebat. Tahun lalu saat mengganti codebase Python2 AppEngine lama yang sudah lama terbengkalai, saya membangun ulang https://progscrape.com [1] di atas ini, dan ini pustaka yang luar biasa serta sangat cepat
    Di Raspberry Pi, ia bahkan bisa mengindeks seluruh 1 juta story hanya dalam beberapa detik
    Saya menjalankan layanan pencarian full-text di Pi rumah saya, dan walau beban puncaknya tidak besar, hanya beberapa rps, CPU juga hampir tidak pernah melonjak lebih dari beberapa persen. Saya pernah menguji beban pencarian hingga sekitar 100rps di Pi dan tetap bertahan. Ini pustaka yang sangat berguna dan hampir bisa langsung dipasang, timnya juga sangat cepat menanggapi laporan bug, dan bug-nya pun sangat sedikit
    Kalau ingin melihat seperti apa responsivitas pencarian di perangkat sekecil ini, cukup klik label pada tiap story. Query dijalankan nyaris seketika, sambil menghantam hingga maksimum 10 tahun * 12 bulan search shard: https://progscrape.com/?search=javascript
    Untuk proyek modern, saya akan menyarankan melihat ini dibanding Lucene. Kalau di ARM64 kecil saja bisa skala sebaik ini, kemungkinan besar pengalamannya akan jauh lebih baik di server yang lebih besar
    [1] https://github.com/progscrape/progscrape

    • Benar-benar pustaka yang bagus. Saya memakainya untuk alat CLI backup email inkremental yang masih aktif dikerjakan, ditujukan untuk penyedia email yang memakai JMAP
      Saya ingin pengguna bisa mencari di backup mereka, dan karena saya memakai Rust, Tantivy terasa sangat pas. Kecepatan mengindeks satu email begitu tinggi sampai tidak perlu dipindahkan ke thread terpisah, dan pencarian pada ribuan email juga tampaknya tidak bermasalah
      Jika aplikasi Rust Anda butuh pencarian, Tantivy layak dilihat
    • Laporan bug kecil: di https://progscrape.com/?search=grep muncul Error: PersistError(UnexpectedError("Storage fetch panicked"))
    • Beberapa hari lalu saya memakai meilisearch untuk proof of concept cepat, dan repositori ini membuat saya ingin mengecek lagi Tantivy
      Pada dasarnya yang saya butuhkan hanyalah pencarian full-text
  • Saya baru-baru ini menemukan Tantivy di dalam ParadeDB. ParadeDB adalah ekstensi Postgres yang ingin menggantikan Elastic
    https://github.com/paradedb/paradedb/blob/dev/pg_search/Carg...
    Saya mengetahuinya setelah mendengar “Extending Postgres for High Performance Analytics (with Philippe Noël)”
    https://www.youtube.com/watch?v=NbOAEJrsbaM
    Dan ini juga dipakai di proyek andalannya, Quickwit. Proyek ini menangani log, trace, dan sebentar lagi juga metrik
    https://github.com/quickwit-oss/quickwit
    Saya pernah memakai Quickwit bersama ClickHouse untuk proyek pribadi pencarian multibahasa, dan hasilnya sangat bagus. Akhirnya ada kombinasi yang layak dipakai untuk bahasa Tionghoa, Jepang, dan Korea
    https://quickwit.io/docs/guides/add-full-text-search-to-your...
    to_tsvector milik PostgreSQL tidak pernah benar-benar cocok untuk use case saya
    SELECT * FROM dump WHERE to_tsvector('english'::regconfig, hh_fullname) @@ to_tsquery('english'::regconfig, 'query');
    Semoga berhasil. Saya rasanya bakal otomatis upvote setiap tulisan yang menyebut Tantivy sebagai kata kunci

    • Kombinasi yang menangani seluruh pengindeksan dan query pencarian berbasis URL/REST langsung di dalam SQL adalah pola desain yang keren. Hal yang sama juga bisa dilakukan dengan Postgres FDW
  • Kami baru-baru ini menerapkan Quickwit ke produksi, yang berbasis Tantivy dan dibuat oleh tim yang sama, untuk mengindeks puluhan miliar objek dan kami sangat puas. Kecepatan pengindeksannya luar biasa dan latensi query-nya juga kompetitif
    Yang paling penting, pemisahan komputasi dan penyimpanan memberi nilai yang sangat besar. Kami bisa meluncurkan layanan pencarian baru di atas puluhan miliar objek di object storage, bahkan melakukan agregasi yang kompleks, tanpa harus membayar server berperforma tinggi yang menyala terus-menerus, sehingga use case baru yang tadinya akan cukup mahal jadi memungkinkan
    Saat use case-nya sudah cukup besar untuk membenarkan server berperforma tinggi, Quickwit juga menyediakan opsi untuk menyimpan cache data di tiap server agar performanya meningkat
    Bonus besarnya, timnya sangat cepat dan ramah membantu di Discord

  • Referensi lain adalah indeks pencarian trigram berbasis Go yang dipakai di etsy/hound[0]. Ini didasarkan pada tulisan dan kode Russ Cox, “Regular Expression Matching with a Trigram Index”[1]
    [0] https://github.com/hound-search/hound
    [1] http://swtch.com/~rsc/regexp/regexp4.html
    Tergantung kebutuhan, alternatif Lucene juga berbeda-beda menurut use case

  • Yang perlu diperhatikan adalah sampai sekarang penambahan/penghapusan field masih belum didukung: https://github.com/quickwit-oss/tantivy/issues/470
    Satu-satunya cara untuk menambahkan field adalah mengindeks ulang semua data ke indeks pencarian lain

  • Saya menemukan Tantivy saat mencari alternatif untuk Meilisearch yang mengirim data telemetri secara default. Ini lebih mirip pembangun mesin pencari daripada mesin pencari itu sendiri, tetapi konfigurasinya tampak cukup sederhana [0]
    [0]: https://github.com/quickwit-oss/tantivy-cli

    • QuickWit juga mengirim telemetri secara default: https://quickwit.io/docs/telemetry
    • Saya tertarik, tetapi jika memakainya sebagai library Rust, saya ingin berurusan hanya dengan tipe Rust alih-alih konfigurasi JSON
      Java SDK Meilisearch juga bagus. Tidak perlu CLI dan konfigurasi manual, dan cukup menunjuk ke entitas database untuk bisa mengindeks seluruh tabel
      Akan bagus jika Tantivy juga punya pendekatan seperti itu
    • Menonaktifkannya bisa dilakukan dengan mudah hanya dengan menambahkan satu argumen baris perintah, jadi menolaknya karena alasan itu padahal pencariannya cukup interaktif terasa seperti keberatan kecil
  • Tantivy juga dipakai untuk menyediakan fitur pencarian teks penuh di produk database vektor menarik bernama LanceDb: https://lancedb.github.io/lancedb/fts/
    Terakhir kali saya lihat, ini hanya bisa dilakukan lewat binding Python, tetapi setahu saya mereka sedang berupaya mengimplementasikan binding Rust secara native untuk mendukung platform lain

  • Beberapa tahun lalu saya memulai proyek pribadi karena Elasticsearch terlalu rakus sumber daya dan sangat membuat frustrasi. Bahkan komputer pribadi saya pun punya sumber daya lebih banyak daripada yang dialokasikan beberapa startup mapan untuk produk mereka
    Saya memilih Tantivy karena dua alasan. Pertama, saya ingin membuat semuanya dengan Rust, dan kedua adalah Tantivy itu sendiri. Performanya 10/10, dokumentasinya kelas atas, dan pengalaman memakai library-nya juga sangat baik
    Sayangnya, cakupan proyeknya terlalu besar untuk saya tangani sendirian di waktu luang, jadi akhirnya saya menyerah, tetapi Tantivy tetap benar-benar luar biasa

  • Saya sudah mengamati Tantivy selama beberapa waktu. Ketekunan para pendirinya dan performa yang belakangan ini dicapai Tantivy sangat mengesankan
    Tepuk tangan besar untuk seluruh tim. Saya sangat yakin mereka akan mencapai tujuannya

  • Sebagai orang yang banyak memakai Lucene dan Solr, hal yang paling saya harapkan adalah dukungan upgrade. Biasanya indeks Lucene, Solr, dan ES tidak bisa di-upgrade ke versi baru. Dalam beberapa kasus memang bisa, tetapi saya kesampingkan itu demi kemudahan
    Di proyek besar, pengindeksan ulang sangat mahal dan kadang hampir mustahil dilakukan
    Bahkan ada kemungkinan besar benar-benar tidak mungkin. Misalnya, ketika algoritme pengindeksan untuk tipe data berubah pada field indeks yang lossy. Namun, dalam banyak kasus semua informasinya masih ada, jadi akan sangat bagus jika indeks seperti itu bisa diidentifikasi dan di-upgrade