DEV Community

Cover image for Unveiling arroy: Meilisearch's Latest ANNs Innovation with Rust and LMDB – A Nod to Spotify's Anno
Bernard K
Bernard K

Posted on

Unveiling arroy: Meilisearch's Latest ANNs Innovation with Rust and LMDB – A Nod to Spotify's Anno

Exploring Arroy: A Rust-Based Approximate Nearest Neighbors Library


In the realm of search technology, the ability to quickly find items similar to a query is invaluable. Meilisearch has released Arroy, an Approximate Nearest Neighbors (ANN) library inspired by Spotify's Annoy and implemented in Rust, leveraging the LMDB for high performance. This guide will walk you through understanding and integrating Arroy into your projects, allowing you to harness the power of efficient similarity searches and enhance your applications' capabilities.

Understanding Arroy

Arroy is a library designed to find the "nearest neighbors" of a given point in high-dimensional space. This is crucial for recommendation systems, image recognition, and other machine learning applications where you need to find the closest matches quickly.

Key Features

  • Approximate Nearest Neighbors: Provides a balance between accuracy and speed for similarity searches.
  • Rust Implementation: Ensures memory safety and concurrency without sacrificing performance.
  • LMDB Backing: Takes advantage of the lightning-fast, memory-mapped database for storage and retrieval.


Before you begin, ensure you have Rust and Cargo installed on your system. If not, install them with the following command:

curl --proto '=https' --tlsv1.2 -sSf | sh
Enter fullscreen mode Exit fullscreen mode

To add Arroy to your project, include it in your Cargo.toml:

arroy = "0.1"
Enter fullscreen mode Exit fullscreen mode

Run the following command to download and compile Arroy:

cargo build
Enter fullscreen mode Exit fullscreen mode

Building an Index

To use Arroy, you first need to create an index. An index allows Arroy to organize data for efficient retrieval. Here's how to do it:

use arroy::{AnnoyIndex, Metric};

// Create a new index specifying the dimension and metric
let mut index = AnnoyIndex::new(40, Metric::Angular).unwrap();

// Add items to the index
for i in 0..1000 {
    let vector: Vec<f32> = vec![/* your 40-dimensional data here */];
    index.add_item(i, &vector).unwrap();

// Build the index; // The argument is the number of trees
Enter fullscreen mode Exit fullscreen mode

Querying the Index

Once your index is built, you can query it to find the nearest neighbors to a vector:

let result = index.get_nns_by_vector(&query_vector, 10, -1).unwrap();
println!("Nearest neighbors: {:?}", result);
Enter fullscreen mode Exit fullscreen mode

Replace query_vector with the vector you want to find neighbors for, and adjust the number of neighbors you wish to retrieve.

Storing and Loading Indexes

To avoid rebuilding the index every time, you can store it on disk and load it later:

// Save the index to disk"path_to_index_file.ann").unwrap();

// Load the index from disk
let loaded_index = AnnoyIndex::load("path_to_index_file.ann").unwrap();
Enter fullscreen mode Exit fullscreen mode

Real-World Applications

Arroy can be applied in various scenarios, such as:

  • Recommendation Systems: Suggest products or content similar to a user's interests.
  • Content Discovery: Help users discover similar articles, music, or videos.
  • Machine Learning: Find similar data points for clustering or classification.


You have now learned how to install, create, and query an ANN index using Arroy, inspired by Spotify's Annoy and built on Rust with LMDB. This powerful combination allows you to incorporate fast and efficient similarity searches into your applications.

For further exploration, consider diving deeper into the configurations and optimizations available in Arroy, such as tuning the number of trees for different datasets or experimenting with different metrics based on your specific use case. Happy coding!

For more information and advanced usage, refer to the official Arroy documentation.

Top comments (1)

hemantkgupta profile image

Not able to find AnnoyIndex, Metric in arroy = "0.1"

Image description