TantinyRuby 全文搜索引擎库

联合创作 · 2023-09-29 03:12

Tantiny是一个基于 Tantivy 的 Ruby 的最小化全文搜索库。当你手头的任务需要全文搜索,但配置一个完整的分布式搜索引擎会比任务本身花费更多的时间时,它是非常好的选择。

即使你已经在你的项目中使用了这样的引擎(实际上这是很有可能的),使用 Tantiny 仍然可能更容易,因为与 Solr 和 Elasticsearch 不同,它不需要任何东西来工作(没有单独的服务器或进程或其他什么),它是纯粹的可嵌入的。所以,当你发现自己在使用你所选择的搜索引擎会很麻烦/不方便,或者需要额外的设置时,你总是可以回到一个快速和肮脏的解决方案,但还是很灵活和快速。

Tantiny 并不完全是对 Tantivy 的 Ruby 绑定,但它试图接近。主要理念是提供对 Tantivy 倒排索引的低级访问,但具有漂亮的 Ruby 风格的 API、合理的默认设置和附加功能。

示例:

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是线程安全的,这意味着你可以在线程之间安全地共享索引的单一实例。你还可以生成可以写入和读取同一索引的单独进程。然而,虽然从索引中读取应该是并行的,但向其写入却不是。每当你调用事务或任何其他修改索引的操作(即<<和删除),它将在操作期间锁定索引或等待另一个进程或线程释放锁定。唯一的例外是当另一个进程的索引具有独占编写器在某处运行时,在这种情况下修改索引的方法将立即失败。

因此,如果你想避免阻塞调用,最好是有一个写入进程和多个读取进程。正确的方法是在初始化索引时将 exclusive_writer 设置为 true。

index = Tantiny::Index.new("/path/to/index", exclusive_writer: true) {}

这样 index writer 只会被获取一次,这意味着它的内存和索引线程也只会被分配一次。否则每次执行写入操作时都会获取一个新的 index writer。

浏览 6
点赞
评论
收藏
分享

手机扫一扫分享

编辑 分享
举报
评论
图片
表情
推荐
点赞
评论
收藏
分享

手机扫一扫分享

编辑 分享
举报