Ruby Binding Overview
The laurus gem provides Ruby bindings for the Laurus search engine. It is built as a native Rust extension using Magnus and rb_sys, giving Ruby programs direct access to Laurus’s lexical, vector, and hybrid search capabilities with near-native performance.
Features
- Lexical Search – Full-text search powered by an inverted index with BM25 scoring
- Vector Search – Approximate nearest neighbor (ANN) search using Flat, HNSW, or IVF indexes
- Hybrid Search – Combine lexical and vector results with fusion algorithms (RRF, WeightedSum)
- Rich Query DSL – Term, Phrase, Fuzzy, Wildcard, NumericRange, Geo, Boolean, Span queries
- Text Analysis – Tokenizers, filters, stemmers, and synonym expansion
- Flexible Storage – In-memory (ephemeral) or file-based (persistent) indexes
- Idiomatic Ruby API – Clean, intuitive Ruby classes under the
Laurus::namespace
Architecture
graph LR
subgraph "laurus-ruby (gem)"
RbIndex["Index\n(Ruby class)"]
RbQuery["Query classes"]
RbSearch["SearchRequest\n/ SearchResult"]
end
Ruby["Ruby application"] -->|"method calls"| RbIndex
Ruby -->|"query objects"| RbQuery
RbIndex -->|"Magnus FFI"| Engine["laurus::Engine\n(Rust)"]
RbQuery -->|"Magnus FFI"| Engine
Engine --> Storage["Storage\n(Memory / File)"]
The Ruby classes are thin wrappers around the Rust engine. Each call crosses the Magnus FFI boundary once; the Rust engine then executes the operation entirely in native code.
Although the Rust engine uses async I/O internally, all Ruby
methods are exposed as synchronous functions. Each method
calls tokio::Runtime::block_on() under the hood to bridge
async Rust to synchronous Ruby.
Quick Start
require "laurus"
# Create an in-memory index
index = Laurus::Index.new
# Index documents
index.put_document("doc1", { "title" => "Introduction to Rust", "body" => "Systems programming language." })
index.put_document("doc2", { "title" => "Ruby for Web Development", "body" => "Web applications with Ruby." })
index.commit
# Search
results = index.search("title:rust", limit: 5)
results.each do |r|
puts "[#{r.id}] score=#{format('%.4f', r.score)} #{r.document['title']}"
end
Sections
- Installation – How to install the gem
- Quick Start – Hands-on introduction with examples
- API Reference – Complete class and method reference
- Development – Building from source and running tests