Skip to content

Commit d1f30a0

Browse files
authored
Add degraded search (#107)
* add search result enum, factorize level walking * feat(reader): add cancellation * add more tests and fix nns_by_item * add docs * feat!(reader): make search typed * bump tests * update readme * fix fmt and tests
1 parent 69e04a6 commit d1f30a0

File tree

6 files changed

+385
-145
lines changed

6 files changed

+385
-145
lines changed

README.md

Lines changed: 8 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -31,38 +31,32 @@ use heed::EnvOpenOptions;
3131
use rand::{rngs::StdRng, SeedableRng};
3232

3333
fn main() -> Result<()> {
34-
const DIM: usize = 3;
35-
let vecs: Vec<[f32; DIM]> = vec![[1.0, 0.0, 0.0], [0.0, 1.0, 0.0], [0.0, 0.0, 1.0]];
36-
3734
let env = unsafe {
3835
EnvOpenOptions::new()
39-
.map_size(1024 * 1024 * 1024 * 1) // 1GiB
36+
.map_size(1024 * 1024 * 1024) // 1GiB
4037
.open("./")
4138
}
4239
.unwrap();
4340

44-
let mut wtxn = env.write_txn().unwrap();
41+
let mut wtxn = env.write_txn()?;
4542
let db: Database<Cosine> = env.create_database(&mut wtxn, None)?;
46-
let writer: Writer<Cosine> = Writer::new(db, 0, DIM);
43+
let writer: Writer<Cosine> = Writer::new(db, 0, 3);
4744

48-
// insert into lmdb
49-
writer.add_item(&mut wtxn, 0, &vecs[0])?;
50-
writer.add_item(&mut wtxn, 1, &vecs[1])?;
51-
writer.add_item(&mut wtxn, 2, &vecs[2])?;
45+
// build
46+
writer.add_item(&mut wtxn, 0, &[1.0, 0.0, 0.0])?;
47+
writer.add_item(&mut wtxn, 0, &[0.0, 1.0, 0.0])?;
5248

53-
// ...and build hnsw
5449
let mut rng = StdRng::seed_from_u64(42);
55-
5650
let mut builder = writer.builder(&mut rng);
5751
builder.ef_construction(100).build::<16,32>(&mut wtxn)?;
5852
wtxn.commit()?;
5953

60-
// search hnsw using a new lmdb read transaction
54+
// search
6155
let rtxn = env.read_txn()?;
6256
let reader = Reader::<Cosine>::open(&rtxn, 0, db)?;
6357

6458
let query = vec![0.0, 1.0, 0.0];
65-
let nns = reader.nns(1).ef_search(10).by_vector(&rtxn, &query)?;
59+
let nns = reader.nns(1).ef_search(10).by_vector(&rtxn, &query)?.into_nns();
6660

6761
dbg!("{:?}", &nns);
6862
Ok(())
@@ -81,7 +75,6 @@ db = hannoy.Database(tmp_dir, Metric.COSINE)
8175
with db.writer(3, m=4, ef=10) as writer:
8276
writer.add_item(0, [1.0, 0.0, 0.0])
8377
writer.add_item(1, [0.0, 1.0, 0.0])
84-
writer.add_item(2, [0.0, 0.0, 1.0])
8578

8679
reader = db.reader()
8780
nns = reader.by_vec([0.0, 1.0, 0.0], n=2)

src/lib.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -101,7 +101,7 @@ use key::{Key, Prefix, PrefixCodec};
101101
use metadata::{Metadata, MetadataCodec};
102102
use node::{Node, NodeCodec};
103103
use node_id::{NodeId, NodeMode};
104-
pub use reader::{QueryBuilder, Reader};
104+
pub use reader::{QueryBuilder, Reader, Searched};
105105
pub use roaring::RoaringBitmapCodec;
106106
pub use writer::{HannoyBuilder, Writer};
107107

src/python.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -385,7 +385,7 @@ impl PyReader {
385385
};
386386
}
387387

388-
let neighbours = match &self.dyn_reader {
388+
let found = match &self.dyn_reader {
389389
DynReader::Cosine(reader) => hnsw_search!(reader, &query)?,
390390
DynReader::Euclidean(reader) => hnsw_search!(reader, &query)?,
391391
DynReader::Manhattan(reader) => hnsw_search!(reader, &query)?,
@@ -394,7 +394,7 @@ impl PyReader {
394394
DynReader::BqManhattan(reader) => hnsw_search!(reader, &query)?,
395395
DynReader::Hamming(reader) => hnsw_search!(reader, &query)?,
396396
};
397-
Ok(neighbours)
397+
Ok(found.into_nns())
398398
}
399399
}
400400

0 commit comments

Comments
 (0)