1 puan yazan GN⁺ 2024-05-28 | 1 yorum | WhatsApp'ta paylaş
  • Tantivy, Rust ile yazılmış hızlı bir tam metin arama motoru kütüphanesidir; hazır bir arama sunucusundan çok, arama motoru oluştururken kullanılan bir crate’e daha yakındır
  • Tasarımı Apache Lucene’den güçlü biçimde esinlenmiştir; Elasticsearch veya Apache Solr’a alternatif bir sunucu arıyorsanız, Tantivy üzerine inşa edilen dağıtık arama motoru Quickwit’e bakmanız önerilir
  • Özellikleri arasında tam metin arama, BM25 skorlama, doğal sorgu dili, ifade arama, artımlı indeksleme, çok iş parçacıklı indeksleme, mmap dizini, SIMD tamsayı sıkıştırma, facet arama, JSON alanları ve aggregation Collector yer alır
  • Stable Rust üzerinde çalışır; Linux, macOS ve Windows’u destekler. Başlangıç süresinin 10 ms’den az olduğu ve bu nedenle komut satırı araçları için uygun olduğu belirtilir
  • Dağıtık arama Tantivy’nin kapsamı dışındadır; belge değişiklikleri için mevcut belgenin silinip yeniden indekslenmesi gerekir ve yeni belgeler commit sonrası IndexReader yeniden yüklendikten ve yeni bir Searcher alındıktan sonra aranabilir hale gelir

Tantivy’nin konumu ve tasarımı

  • Tantivy, Rust ile yazılmış hızlı bir tam metin arama motoru kütüphanesidir
  • Elasticsearch veya Apache Solr gibi doğrudan çalıştırılan bir arama motoru sunucusu değil, bu tür arama motorları oluştururken kullanılabilecek bir crate’tir
  • Tasarım açısından Apache Lucene’e daha yakındır ve Lucene’in tasarımından güçlü biçimde esinlenmiştir
  • Elasticsearch veya Apache Solr’a alternatif arıyorsanız, Tantivy üzerine inşa edilen dağıtık arama motoru Quickwit’e bakmanız önerilir

Performans ve benchmark’lar

  • Tantivy, sorgu ve koleksiyon türüne göre ayrılmış performans sonuçlarını içeren bir benchmark sunar
  • Benchmark sonuçları sorgunun niteliğine ve yüke göre değişebilir
  • Benchmark ayrıntıları search-benchmark-game deposunda görülebilir
  • FAQ’ya göre, arama gecikmesi benchmark’larında Tantivy ortalama olarak Lucene’den yaklaşık 2 kat daha hızlıdır

Arama ve indeksleme özellikleri

  • Arama özellikleri

    • Tam metin arama
    • Lucene’deki gibi BM25 skorlama
    • Doğal sorgu dili desteği: (michael AND jackson) OR "king of pop"
    • İfade arama desteği: "michael jackson"
    • Aralık sorguları
    • Facet arama
    • JSON Field
    • Aggregation Collector: histogram, range buckets, average, stats metrics
  • İndeksleme özellikleri

    • Artımlı indeksleme desteği
    • Çok iş parçacıklı indeksleme desteği
    • İngilizce Wikipedia indekslemesinin masaüstünde 3 dakikadan kısa sürdüğü belirtilir
    • İsteğe bağlı term frequency ve position indexing ile indeksleme yapılandırması yapılabilir
    • Silmeleri destekleyen LogMergePolicy desteği
    • Searcher Warmer API sunar
  • Depolama ve alanlar

    • mmap directory desteği
    • u64, i64, f64 için single-valued ve multivalued fast fields desteği
    • &[u8] fast fields desteği
    • text, i64, u64, f64, dates, ip, bool, hierarchical facet fields desteği
    • Belge deposu sıkıştırması LZ4, Zstd ve None seçeneklerini destekler

Tokenizer’lar ve dil desteği

Çalışma ortamı ve başlangıç

  • Tantivy stable Rust üzerinde çalışır
  • Desteklenen işletim sistemleri Linux, macOS ve Windows’tur
  • Başlangıç süresi 10 ms’den az olduğu için komut satırı araçlarına uygundur
  • Başlangıç kaynakları
  • Yerel derleme ve testler aşağıdaki komutlarla yapılır
git clone https://github.com/quickwit-oss/tantivy.git
cd tantivy
cargo test

Kapsam dışı özellikler ve veri değişiklik modeli

  • Dağıtık arama Tantivy’nin kapsamı dışındadır
  • Dağıtık aramaya ihtiyacınız varsa Quickwit’e bakmanız önerilir
  • Tantivy’nin verileri immutable’dır
  • Bir belgeyi değiştirmek için mevcut belgeyi silip yeniden indekslemek gerekir
  • İndekslenmekte olan belgeler, IndexWriter üzerinde commit çağrıldıktan sonra aranabilir hale gelir
  • Mevcut IndexReader değişiklikleri yansıtmak için yeniden yüklenmelidir
  • Değişiklikler yalnızca yeni alınan Searcher üzerinde görünür

Binding’ler ve kullanım örnekleri

  • Diğer dillerden kullanılabilen binding’ler
    • Python: tantivy-py
    • Ruby: tantiny
    • GitHub’da başka binding’ler de bulunabilir, ancak bunların bakımı daha sınırlı olabilir
  • Tantivy kullanım örnekleri
    • seshat: Matrix mesaj veritabanı/indeksleyicisi
    • tantiny: Ruby için küçük bir tam metin arama
    • lnx: REST API’ye sahip uyarlanabilir, yazım hatasına toleranslı arama motoru
    • Bichon: WebUI’ye sahip hafif ve yüksek performanslı Rust e-posta arşivleyicisi
  • Tantivy kullanan şirketler arasında Etsy, ParadeDB, Nuclia, Humanfirst.ai ve Element.io gösterilir

1 yorum

 
GN⁺ 2024-05-28
Hacker News yorumları
  • Bu kütüphaneyi yapanlar gerçekten harika. Geçen yıl uzun süredir ihmal edilmiş eski bir Python2 AppEngine kod tabanını değiştirirken https://progscrape.com [1]’i bunun üzerinde yeniden yaptım; harika bir kütüphane ve inanılmaz hızlı
    Raspberry Pi’de 1 milyon hikâyenin tamamını birkaç saniyede indeksleyebiliyor.
    Evdeki Pi üzerinde tam metin arama servisi çalıştırıyorum; tepe yük birkaç rps civarında, yani büyük değil, ama CPU da neredeyse hiç birkaç yüzde puanın üzerine fırlamıyor. Pi üzerinde aramayı yaklaşık 100 rps’ye kadar yük testine soktum ve dayandı. Neredeyse olduğu gibi takıp kullanabildiğim çok kullanışlı bir kütüphaneydi; ekip hata raporlarına da çok hızlı yanıt verdi ve hata sayısı da çok azdı.
    Bu kadar küçük bir cihazda aramanın ne kadar duyarlı olduğunu görmek için her hikâyenin etiketlerine tıklayabilirsiniz. Sorgular fiilen anında dönüyor ve en fazla 10 yıl * 12 aylık arama shard’ına vuruyor: https://progscrape.com/?search=javascript
    Modern bir proje için Lucene yerine buna bakmanızı öneririm. Küçük ARM64’te bile bu kadar iyi ölçekleniyorsa, daha büyük sunucularda çok daha iyi bir deneyim yaşama olasılığı yüksek.
    [1] https://github.com/progscrape/progscrape

    • Gerçekten çok iyi bir kütüphane. JMAP kullanan e-posta sağlayıcıları için, hâlâ yoğun şekilde üzerinde çalıştığım artımlı e-posta yedekleme CLI aracında kullanıyorum.
      Kullanıcıların yedeklerinde arama yapabilmesini istiyordum ve Rust kullandığım için Tantivy tam uygun göründü. Tek bir e-postayı indeksleme hızı o kadar yüksek ki ayrı bir thread’e taşımaya gerek bile kalmadı; binlerce e-postada arama yapmak da sorun olmayacak gibi görünüyor.
      Bir Rust uygulamasında aramaya ihtiyacınız varsa Tantivy’ye bakmanız iyi olur.
    • Küçük bir hata raporu: https://progscrape.com/?search=grep adresinde Error: PersistError(UnexpectedError("Storage fetch panicked")) gösteriliyor.
    • Birkaç gün önce hızlı bir kavram kanıtı için meilisearch kullandım; bu depo sayesinde Tantivy’ye yeniden bakmam gerekecek.
      Temelde ihtiyacım olan tek şey tam metin arama.
  • Yakın zamanda Tantivy’yi ParadeDB içinde keşfettim. ParadeDB, Elastic’in yerini almayı amaçlayan bir Postgres eklentisi.
    https://github.com/paradedb/paradedb/blob/dev/pg_search/Carg...
    “Extending Postgres for High Performance Analytics (with Philippe Noël)”i dinlerken öğrendim.
    https://www.youtube.com/watch?v=NbOAEJrsbaM
    Ayrıca çekirdek proje olan Quickwit’te de yer alıyor. Log’lar, trace’ler ve yakında metriklerle ilgilenen bir proje.
    https://github.com/quickwit-oss/quickwit
    Çok dilli arama için kişisel bir projede Quickwit ile ClickHouse’u birlikte denedim ve şaşırtıcı derecede iyiydi. Sonunda Çince, Japonca ve Korece için kullanılabilir bir kombinasyon ortaya çıktı.
    https://quickwit.io/docs/guides/add-full-text-search-to-your...
    PostgreSQL’in to_tsvector’ü benim kullanım senaryomda hiçbir zaman gerçekten tam oturmadı.
    SELECT * FROM dump WHERE to_tsvector('english'::regconfig, hh_fullname) @@ to_tsquery('english'::regconfig, 'query');
    Umarım iyi gider. Tantivy’nin anahtar kelime olarak geçtiği yazılara otomatik olarak oy verecek gibiyim.

    • URL/REST tabanlı indeksleme ve arama sorgularını tamamen SQL içinde işleyen kombinasyon, güzel bir tasarım deseni. Aynı yaklaşım Postgres FDW ile de yapılabilir.
  • Yakın zamanda Tantivy tabanlı ve aynı ekip tarafından yapılan Quickwit’i prodüksiyona alıp onlarca milyar nesneyi indeksledik; çok memnunuz. İndeksleme hızı harika, sorgu gecikmesi de rekabetçi.
    En önemlisi, compute ile storage’ın ayrılması muazzam değer sağladı. Uzun süre çalışan yüksek performanslı sunucuların maliyetini ödemeden, object storage’daki onlarca milyar nesnenin üzerinde yeni bir arama servisi ayağa kaldırıp karmaşık agregasyonlar bile yapabildik; normalde epey pahalı olacak yeni kullanım senaryolarını mümkün kıldı.
    Kullanım senaryosu yüksek performanslı sunucuları haklı çıkaracak noktaya gelirse, Quickwit performansı artırmak için verileri her sunucuda cache’leme seçeneği de sunuyor.
    Büyük bir bonus olarak, ekip Discord’da çok hızlı ve yardımsever şekilde destek oluyor.

  • Bir başka kaynak da etsy/hound[0]’da kullanılan Go tabanlı trigram arama indeksi. Russ Cox’un “Regular Expression Matching with a Trigram Index”[1] yazısı ve koduna dayanıyor.
    [0] https://github.com/hound-search/hound
    [1] http://swtch.com/~rsc/regexp/regexp4.html
    İhtiyaca bağlı olarak Lucene alternatiflerinin kullanım senaryoları da değişiyor.

  • Dikkat edilmesi gereken nokta, hâlâ alan ekleme/silme yapılamaması: https://github.com/quickwit-oss/tantivy/issues/470
    Alan eklemenin tek yolu, tüm verileri başka bir arama dizininde yeniden indekslemek.

  • Varsayılan olarak telemetri verisi gönderen Meilisearch’e alternatif ararken Tantivy’yi keşfettim. Arama motorunun kendisinden çok bir arama motoru oluşturucuya benziyor, ama yapılandırması oldukça basit görünüyor [0]
    [0]: https://github.com/quickwit-oss/tantivy-cli

    • QuickWit de varsayılan olarak telemetri gönderiyor: https://quickwit.io/docs/telemetry
    • İlgimi çekiyor ama bir Rust kütüphanesi olarak kullanırken JSON yapılandırması yerine yalnızca Rust tipleriyle uğraşmak istiyorum
      Meilisearch’in Java SDK’sı da iyiydi. CLI ve elle yapılandırma gerekmiyordu; yalnızca veritabanı entity’lerini işaret ederek tüm tabloyu indeksleyebiliyordunuz
      Tantivy’de de böyle bir yöntem olsa güzel olurdu
    • Tek bir komut satırı argümanı ekleyerek kolayca kapatılabiliyorken, kullanışlı bir etkileşimli aramayı bu yüzden reddetmek önemsiz bir itiraz gibi görünüyor
  • Tantivy, LanceDb adlı ilginç bir vektör veritabanı ürününde tam metin arama özelliği sağlamak için de kullanılıyor: https://lancedb.github.io/lancedb/fts/
    Son baktığımda yalnızca Python binding’leri üzerinden mümkündü, ancak başka platformları desteklemek için Rust binding’lerini native olarak uygulamaya çalıştıklarını biliyorum

  • Birkaç yıl önce Elasticsearch aşırı kaynak yiyen bir canavara dönüştüğü için delicesine bunalmış ve kişisel bir proje başlatmıştım. Kendi kişisel bilgisayarım bile, birkaç varlıklı startup’ın ürünlerine ayırdığından daha fazla kaynağa sahip olmasına rağmen durum böyleydi
    Tantivy’yi seçmemin iki nedeni vardı. Biri her şeyi Rust ile yapmak istememdi, diğeri de Tantivy’nin kendisiydi. Performansı 10/10, belgeleri birinci sınıf ve kütüphaneyi kullanma deneyimi de çok iyi
    Ne yazık ki proje kapsamı, tek başıma boş zamanımda altından kalkamayacağım kadar büyüktü, bu yüzden bıraktım; yine de Tantivy gerçekten harika

  • Tantivy’yi bir süredir takip ediyordum. Kurucuların azmi ve Tantivy’nin son dönemde ulaştığı performans etkileyici
    Tüm ekibi içtenlikle alkışlıyorum. Hedeflerine ulaşacaklarına güçlü biçimde inanıyorum

  • Lucene ve Solr’u çok kullanmış biri olarak en çok istediğim şey yükseltme desteği. Genellikle Lucene, Solr, ES dizinleri yeni sürüme yükseltilemiyor. Bazı durumlarda mümkün olsa da kolaylık açısından bunu dışarıda bırakıyorum
    Büyük projelerde yeniden indeksleme çok pahalı, hatta bazen neredeyse imkânsız bir iş
    Kesinlikle imkânsız olma ihtimalinin yüksek olduğu durumlar da var. Örneğin kayıplı indeks alanlarında, veri tipinin indeksleme algoritması değiştiğinde böyle olur. Ancak çoğu durumda tüm bilgi hâlâ mevcut olduğundan, bu tür dizinleri tespit edip yükseltebilmek gerçekten çok iyi olurdu