TantinyRuby 全文搜索引擎庫
Tantiny是一個基于 Tantivy 的 Ruby 的最小化全文搜索庫。當你手頭的任務(wù)需要全文搜索,但配置一個完整的分布式搜索引擎會比任務(wù)本身花費更多的時間時,它是非常好的選擇。
即使你已經(jīng)在你的項目中使用了這樣的引擎(實際上這是很有可能的),使用 Tantiny 仍然可能更容易,因為與 Solr 和 Elasticsearch 不同,它不需要任何東西來工作(沒有單獨的服務(wù)器或進程或其他什么),它是純粹的可嵌入的。所以,當你發(fā)現(xiàn)自己在使用你所選擇的搜索引擎會很麻煩/不方便,或者需要額外的設(shè)置時,你總是可以回到一個快速和骯臟的解決方案,但還是很靈活和快速。
Tantiny 并不完全是對 Tantivy 的 Ruby 綁定,但它試圖接近。主要理念是提供對 Tantivy 倒排索引的低級訪問,但具有漂亮的 Ruby 風格的 API、合理的默認設(shè)置和附加功能。
示例:
index = Tantiny::Index.new("/path/to/index") { text :description } index << { id: 1, description: "Hello World!" } index << { id: 2, description: "What's up?" } index << { id: 3, description: "Goodbye World!" } index.reload index.search("world") # 1, 3
Tantiny是線程安全的,這意味著你可以在線程之間安全地共享索引的單一實例。你還可以生成可以寫入和讀取同一索引的單獨進程。然而,雖然從索引中讀取應(yīng)該是并行的,但向其寫入?yún)s不是。每當你調(diào)用事務(wù)或任何其他修改索引的操作(即<<和刪除),它將在操作期間鎖定索引或等待另一個進程或線程釋放鎖定。唯一的例外是當另一個進程的索引具有獨占編寫器在某處運行時,在這種情況下修改索引的方法將立即失敗。
因此,如果你想避免阻塞調(diào)用,最好是有一個寫入進程和多個讀取進程。正確的方法是在初始化索引時將 exclusive_writer 設(shè)置為 true。
index = Tantiny::Index.new("/path/to/index", exclusive_writer: true) {}
這樣 index writer 只會被獲取一次,這意味著它的內(nèi)存和索引線程也只會被分配一次。否則每次執(zhí)行寫入操作時都會獲取一個新的 index writer。
