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:"HelloWorld!"}index<<{id:2,description:"What'sup?"}index<<{id:3,description:"GoodbyeWorld!"}index.reloadindex.search("world")#1,3Tantiny是线程安全的,这意味着你可以在线程之间安全地共享索引的单一实例。你还可以生成可以写入和读取同一索引的单独进程。然而,虽然从索引中读取应该是并行的,但向其写入却不是。每当你调用事务或任何其他修改索引的操作(即<<和删除),它将在操作期间锁定索引或等待另一个进程或线程释放锁定。唯一的例外是当另一个进程的索引具有独占编写器在某处运行时,在这种情况下修改索引的方法将立即失败。
因此,如果你想避免阻塞调用,最好是有一个写入进程和多个读取进程。正确的方法是在初始化索引时将exclusive_writer设置为true。
index=Tantiny::Index.new("/path/to/index",exclusive_writer:true){}这样 indexwriter 只会被获取一次,这意味着它的内存和索引线程也只会被分配一次。否则每次执行写入操作时都会获取一个新的indexwriter。
评论