Skip to content

Commit ad6c536

Browse files
committed
feat: basic engine
GH-18
1 parent 8e9ac4c commit ad6c536

File tree

1 file changed

+58
-14
lines changed

1 file changed

+58
-14
lines changed

src/engine.rs

+58-14
Original file line numberDiff line numberDiff line change
@@ -1,36 +1,80 @@
1+
use tantivy::collector::TopDocs;
2+
use tantivy::query::QueryParser;
13
use tantivy::schema::*;
4+
use tantivy::DocAddress;
5+
use tantivy::IndexReader;
26
use tantivy::IndexWriter;
37
use tantivy::ReloadPolicy;
4-
use tantivy::Searcher;
8+
use tantivy::Result;
59

6-
pub struct Registry {
10+
pub struct Index {
11+
index: tantivy::Index,
12+
schema: Schema,
13+
fields: Vec<Field>,
714
writer: IndexWriter,
8-
searcher: Searcher,
15+
reader: IndexReader,
916
}
1017

11-
pub fn create() -> tantivy::Result<Registry> {
18+
pub fn create() -> Result<Index> {
1219
let schema_builder = Schema::builder();
1320

14-
// TODO: add schema
21+
// @TODO: create schema
22+
// @TODO: create fields from schema input
1523

24+
let fields = vec![];
1625
let schema = schema_builder.build();
1726
let index = tantivy::Index::create_in_ram(schema.clone());
18-
19-
// index writer
2027
let writer = index.writer(50_000_000)?;
21-
22-
// index reader
2328
let reader = index
2429
.reader_builder()
2530
.reload_policy(ReloadPolicy::OnCommit)
2631
.try_into()?;
27-
let searcher = reader.searcher();
2832

29-
Ok(Registry { writer, searcher })
33+
Ok(Index {
34+
index,
35+
schema,
36+
fields,
37+
writer,
38+
reader,
39+
})
40+
}
41+
42+
pub fn add(index: Index, docs: Vec<Document>) -> Result<Index> {
43+
docs.iter()
44+
.map(|doc| {
45+
index.writer.add_document(doc.clone())?;
46+
Ok(())
47+
})
48+
.collect::<Result<()>>()?;
49+
50+
Ok(index)
51+
}
52+
53+
pub fn commit(mut index: Index) -> Result<Index> {
54+
index.writer.commit()?;
55+
index.reader.reload()?;
56+
57+
Ok(index)
3058
}
3159

32-
pub fn add() {}
60+
pub fn remove(mut index: Index, field: Field, text: &str) -> Result<Index> {
61+
let term = Term::from_field_text(field, text);
62+
63+
index.writer.delete_term(term);
3364

34-
pub fn remove() {}
65+
Ok(index)
66+
}
67+
68+
pub fn search(
69+
index: Index,
70+
query: &str,
71+
limit: Option<usize>,
72+
) -> tantivy::Result<Vec<(f32, DocAddress)>> {
73+
let limit = limit.unwrap_or(10);
74+
let parser = QueryParser::for_index(&index.index, index.fields);
75+
let query = parser.parse_query(query)?;
76+
let searcher = index.reader.searcher();
77+
let result = searcher.search(&query, &TopDocs::with_limit(limit))?;
3578

36-
pub fn search() {}
79+
Ok(result)
80+
}

0 commit comments

Comments
 (0)