1 điểm bởi GN⁺ 2024-05-28 | 1 bình luận | Chia sẻ qua WhatsApp
  • Tantivy là một thư viện công cụ tìm kiếm toàn văn nhanh được viết bằng Rust, gần với một crate dùng để xây dựng công cụ tìm kiếm hơn là một máy chủ tìm kiếm hoàn chỉnh
  • Thiết kế của nó được truyền cảm hứng mạnh mẽ từ Apache Lucene; nếu bạn đang tìm một máy chủ thay thế cho Elasticsearch hoặc Apache Solr, tài liệu hướng dẫn nên xem công cụ tìm kiếm phân tán Quickwit được xây dựng trên Tantivy
  • Các tính năng gồm tìm kiếm toàn văn, chấm điểm BM25, truy vấn ngôn ngữ tự nhiên, tìm kiếm cụm từ, lập chỉ mục tăng dần, lập chỉ mục đa luồng, thư mục mmap, nén số nguyên SIMD, tìm kiếm facet, trường JSON, Collector tổng hợp, v.v.
  • Dự án chạy trên Rust ổn định, hỗ trợ Linux, macOS, Windows, và cho biết thời gian khởi động dưới 10ms nên phù hợp với công cụ dòng lệnh
  • Tìm kiếm phân tán nằm ngoài phạm vi của Tantivy; để sửa tài liệu cần xóa tài liệu cũ rồi lập chỉ mục lại, và tài liệu mới chỉ có thể được tìm thấy sau commit, tải lại IndexReader và lấy Searcher mới

Vị trí và thiết kế của Tantivy

  • Tantivy là một thư viện công cụ tìm kiếm toàn văn nhanh được viết bằng Rust
  • Nó không phải là máy chủ công cụ tìm kiếm chạy trực tiếp như Elasticsearch hay Apache Solr, mà là một crate có thể dùng để xây dựng những công cụ tìm kiếm như vậy
  • Về thiết kế, nó gần với Apache Lucene hơn và được truyền cảm hứng mạnh mẽ từ thiết kế của Lucene
  • Nếu đang tìm một giải pháp thay thế cho Elasticsearch hoặc Apache Solr, tài liệu hướng dẫn nên xem công cụ tìm kiếm phân tán Quickwit được xây dựng trên Tantivy

Hiệu năng và benchmark

  • Tantivy cung cấp benchmark được chia theo từng loại truy vấn và loại tập dữ liệu
  • Kết quả benchmark có thể thay đổi tùy theo đặc tính truy vấn và tải
  • Có thể xem chi tiết benchmark trong kho search-benchmark-game
  • Theo FAQ, trong benchmark độ trễ tìm kiếm, Tantivy trung bình nhanh gấp khoảng 2 lần so với Lucene

Tính năng tìm kiếm và lập chỉ mục

  • Tính năng tìm kiếm

    • Tìm kiếm toàn văn
    • Chấm điểm BM25 như Lucene
    • Hỗ trợ truy vấn ngôn ngữ tự nhiên: (michael AND jackson) OR "king of pop"
    • Hỗ trợ tìm kiếm cụm từ: "michael jackson"
    • Truy vấn phạm vi
    • Tìm kiếm facet
    • JSON Field
    • Aggregation Collector: histogram, range buckets, average, stats metrics
  • Tính năng lập chỉ mục

    • Hỗ trợ lập chỉ mục tăng dần
    • Hỗ trợ lập chỉ mục đa luồng
    • Cho biết việc lập chỉ mục Wikipedia tiếng Anh mất chưa tới 3 phút trên máy tính để bàn
    • Có thể cấu hình lập chỉ mục thông qua term frequency tùy chọn và position indexing
    • Hỗ trợ LogMergePolicy with deletes
    • Cung cấp Searcher Warmer API
  • Lưu trữ và trường dữ liệu

    • Hỗ trợ mmap directory
    • Hỗ trợ fast fields single-valued và multivalued cho u64, i64, f64
    • Hỗ trợ fast fields &[u8]
    • Hỗ trợ các trường text, i64, u64, f64, dates, ip, bool, hierarchical facet
    • Nén kho tài liệu hỗ trợ LZ4, Zstd, None

Tokenizer và hỗ trợ ngôn ngữ

Môi trường chạy và cách bắt đầu

  • Tantivy chạy trên stable Rust
  • Các hệ điều hành được hỗ trợ là Linux, macOS, Windows
  • Thời gian khởi động dưới 10ms nên phù hợp với công cụ dòng lệnh
  • Tài liệu bắt đầu
  • Có thể build và test cục bộ bằng các lệnh sau
git clone https://github.com/quickwit-oss/tantivy.git
cd tantivy
cargo test

Các tính năng ngoài phạm vi và mô hình thay đổi dữ liệu

  • Tìm kiếm phân tán nằm ngoài phạm vi của Tantivy
  • Nếu cần tìm kiếm phân tán, tài liệu hướng dẫn nên xem Quickwit
  • Dữ liệu của Tantivy là immutable
  • Để sửa tài liệu, cần xóa tài liệu cũ rồi lập chỉ mục lại
  • Tài liệu đang được lập chỉ mục chỉ có thể tìm kiếm được sau khi IndexWriter gọi commit
  • IndexReader hiện có phải được tải lại để phản ánh các thay đổi
  • Các thay đổi chỉ xuất hiện trong Searcher mới được lấy lại

Binding và trường hợp sử dụng

  • Binding có thể dùng từ các ngôn ngữ khác
    • Python: tantivy-py
    • Ruby: tantiny
    • Có thể tìm thấy các binding khác trên GitHub, nhưng có thể được bảo trì ít hơn
  • Ví dụ sử dụng Tantivy
    • seshat: cơ sở dữ liệu/trình lập chỉ mục tin nhắn Matrix
    • tantiny: tìm kiếm toàn văn nhỏ gọn cho Ruby
    • lnx: công cụ tìm kiếm thích ứng có khả năng chịu lỗi gõ với REST API
    • Bichon: trình lưu trữ email Rust nhẹ, hiệu năng cao, có WebUI
  • Các công ty được liệt kê là đang sử dụng Tantivy gồm Etsy, ParadeDB, Nuclia, Humanfirst.ai, Element.io

1 bình luận

 
GN⁺ 2024-05-28
Ý kiến trên Hacker News
  • Những người tạo ra thư viện này thật sự rất giỏi. Năm ngoái, khi thay thế một codebase Python2 AppEngine cũ kỹ bị bỏ bê lâu ngày, tôi đã dựng lại https://progscrape.com [1] trên nền thư viện này; đây là một thư viện tuyệt vời và cực kỳ nhanh
    Trên Raspberry Pi, nó có thể lập chỉ mục toàn bộ 1 triệu story chỉ trong vài giây
    Tôi đang chạy một dịch vụ tìm kiếm toàn văn trên chiếc Pi ở nhà; tải cao điểm chỉ vài rps nên không lớn, nhưng CPU cũng hầu như không vọt quá vài phần trăm. Tôi đã thử tải tìm kiếm trên Pi lên khoảng 100 rps và nó vẫn chịu được. Đây là một thư viện rất hữu ích, gần như có thể cắm vào dùng ngay; nhóm cũng phản hồi rất nhanh với các báo cáo lỗi, và lỗi cũng rất ít
    Nếu muốn xem độ phản hồi tìm kiếm trên một thiết bị nhỏ như vậy, hãy bấm vào nhãn của từng story. Truy vấn gần như tức thì, và thực tế đang đánh vào shard tìm kiếm tối đa 10 năm * 12 tháng: https://progscrape.com/?search=javascript
    Với các dự án hiện đại, tôi khuyên nên xem xét nó thay vì Lucene. Vì nó mở rộng tốt như vậy ngay cả trên ARM64 nhỏ, khả năng cao là trên máy chủ lớn hơn trải nghiệm sẽ còn tốt hơn nhiều
    [1] https://github.com/progscrape/progscrape

    • Đây là một thư viện thật sự tốt. Tôi đang dùng nó trong một công cụ CLI sao lưu email gia tăng vẫn còn đang được phát triển mạnh, nhắm đến các nhà cung cấp email dùng JMAP
      Tôi muốn cho người dùng tìm kiếm các bản sao lưu, và vì đang dùng Rust nên Tantivy có vẻ rất phù hợp. Tốc độ lập chỉ mục một email nhanh đến mức tôi thậm chí không cần chuyển nó sang luồng riêng, và việc tìm kiếm qua hàng nghìn email cũng có vẻ không thành vấn đề
      Nếu ứng dụng Rust của bạn cần tìm kiếm, bạn nên xem qua Tantivy
    • Báo cáo lỗi nhỏ: tại https://progscrape.com/?search=grep hiển thị Error: PersistError(UnexpectedError("Storage fetch panicked"))
    • Vài ngày trước tôi đã dùng meilisearch cho một proof of concept nhanh; qua repo này, có lẽ tôi nên xem lại Tantivy
      Về cơ bản thứ tôi cần chỉ là tìm kiếm toàn văn
  • Gần đây tôi phát hiện Tantivy bên trong ParadeDB. ParadeDB là một extension Postgres nhằm thay thế Elastic
    https://github.com/paradedb/paradedb/blob/dev/pg_search/Carg...
    Tôi biết đến nó sau khi nghe “Extending Postgres for High Performance Analytics (with Philippe Noël)”
    https://www.youtube.com/watch?v=NbOAEJrsbaM
    Và nó cũng nằm trong dự án cốt lõi Quickwit. Đây là dự án xử lý log, trace, và sắp tới là cả metric
    https://github.com/quickwit-oss/quickwit
    Tôi đã dùng Quickwit cùng ClickHouse trong một dự án cá nhân về tìm kiếm đa ngôn ngữ, và kết quả tốt đến đáng ngạc nhiên. Cuối cùng cũng có một tổ hợp dùng được cho tiếng Trung, tiếng Nhật và tiếng Hàn
    https://quickwit.io/docs/guides/add-full-text-search-to-your...
    to_tsvector của PostgreSQL chưa bao giờ thật sự phù hợp với trường hợp sử dụng của tôi
    SELECT * FROM dump WHERE to_tsvector('english'::regconfig, hh_fullname) @@ to_tsquery('english'::regconfig, 'query');
    Hy vọng mọi chuyện suôn sẻ. Có lẽ tôi sẽ tự động upvote các bài viết có Tantivy làm từ khóa

    • Tổ hợp xử lý chỉ mục và truy vấn tìm kiếm dựa trên URL/REST hoàn toàn bên trong SQL là một mẫu thiết kế rất hay. Cũng có thể làm cùng kiểu này bằng Postgres FDW
  • Gần đây tôi đã triển khai Quickwit, dựa trên Tantivy và do cùng nhóm tạo ra, vào production để lập chỉ mục hàng chục tỷ object, và rất hài lòng. Tốc độ lập chỉ mục rất tuyệt, độ trễ truy vấn cũng cạnh tranh
    Điều quan trọng nhất là tách compute và storage mang lại giá trị rất lớn. Không cần trả tiền cho các máy chủ hiệu năng cao chạy lâu dài, chúng tôi vẫn có thể dựng một dịch vụ tìm kiếm mới trên hàng chục tỷ object trong object storage, đồng thời thực hiện cả các phép tổng hợp phức tạp; nhờ đó mở ra những use case mới mà bình thường sẽ khá đắt đỏ
    Khi use case đủ lớn để biện minh cho máy chủ hiệu năng cao, Quickwit cũng cung cấp tùy chọn cache dữ liệu trên từng máy chủ để tăng hiệu năng
    Một điểm cộng lớn nữa là đội ngũ trên Discord hỗ trợ rất nhanh và thân thiện

  • Một tài liệu khác là chỉ mục tìm kiếm trigram viết bằng Go dùng trong etsy/hound[0]. Nó dựa trên bài viết và mã của 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
    Tùy nhu cầu, các lựa chọn thay thế Lucene cũng khác nhau theo từng trường hợp sử dụng

  • Điểm cần lưu ý là hiện vẫn không thể thêm/xóa field: https://github.com/quickwit-oss/tantivy/issues/470
    Cách duy nhất để thêm field là lập chỉ mục lại toàn bộ dữ liệu sang một chỉ mục tìm kiếm khác

  • Trong lúc tìm một lựa chọn thay thế cho Meilisearch, vốn gửi dữ liệu telemetry theo mặc định, tôi đã phát hiện Tantivy. Nó giống một bộ dựng công cụ tìm kiếm hơn là bản thân một công cụ tìm kiếm, nhưng cấu hình trông khá đơn giản [0]
    [0]: https://github.com/quickwit-oss/tantivy-cli

    • QuickWit cũng gửi telemetry theo mặc định: https://quickwit.io/docs/telemetry
    • Tôi có quan tâm, nhưng muốn dùng nó như một thư viện Rust và chỉ xử lý kiểu Rust thay vì cấu hình JSON
      Java SDK của Meilisearch cũng rất tốt. Không cần CLI hay cấu hình thủ công; chỉ cần trỏ tới entity trong cơ sở dữ liệu là có thể lập chỉ mục toàn bộ bảng
      Giá mà Tantivy cũng có cách làm như vậy
    • Chỉ cần thêm một đối số dòng lệnh là có thể tắt dễ dàng, nên việc từ chối một tính năng tìm kiếm tương tác dùng được chỉ vì lý do đó có vẻ là một phản đối khá nhỏ
  • Tantivy cũng được dùng để cung cấp tính năng tìm kiếm toàn văn trong LanceDb, một sản phẩm cơ sở dữ liệu vector thú vị: https://lancedb.github.io/lancedb/fts/
    Lần cuối tôi xem thì chỉ dùng được thông qua Python binding, nhưng tôi hiểu là họ đang định triển khai binding Rust native để hỗ trợ các nền tảng khác

  • Vài năm trước, tôi đã bắt đầu một dự án cá nhân vì quá bực bội với Elasticsearch, một con quái vật ngốn tài nguyên. Ngay cả máy tính cá nhân của tôi cũng có nhiều tài nguyên hơn mức nhiều startup khá dư dả phân bổ cho sản phẩm của họ, vậy mà vẫn thế
    Tôi chọn Tantivy vì hai lý do. Một là tôi muốn làm mọi thứ bằng Rust, hai là chính Tantivy. Hiệu năng 10/10, tài liệu ở mức xuất sắc, và trải nghiệm dùng thư viện cũng rất tốt
    Đáng tiếc là phạm vi dự án quá lớn để một mình tôi xử lý trong thời gian rảnh nên đã bỏ cuộc, nhưng Tantivy vẫn thật sự tuyệt vời

  • Tôi đã theo dõi Tantivy một thời gian. Sự bền bỉ của các nhà sáng lập và hiệu năng mà Tantivy đạt được gần đây rất ấn tượng
    Xin dành một tràng pháo tay lớn cho toàn bộ đội ngũ. Tôi tin chắc họ sẽ đạt được mục tiêu của mình

  • Với tư cách là người đã dùng Lucene và Solr rất nhiều, điều tôi mong muốn nhất là hỗ trợ nâng cấp. Thông thường, chỉ mục Lucene, Solr, ES không thể nâng cấp lên phiên bản mới. Trong một số trường hợp thì có thể, nhưng để tiện nói ở đây tôi sẽ bỏ qua
    Trong các dự án lớn, việc lập chỉ mục lại rất tốn kém, và đôi khi gần như bất khả thi
    Cũng có những trường hợp rất có khả năng là hoàn toàn bất khả thi. Ví dụ như khi thuật toán lập chỉ mục của kiểu dữ liệu thay đổi trên một field chỉ mục có mất mát thông tin. Nhưng trong nhiều trường hợp, toàn bộ thông tin vẫn còn, nên nếu có thể nhận diện và nâng cấp những chỉ mục như vậy thì sẽ thật tuyệt