summaryrefslogtreecommitdiffstats
path: root/src/server.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/server.rs')
-rw-r--r--src/server.rs39
1 files changed, 38 insertions, 1 deletions
diff --git a/src/server.rs b/src/server.rs
index 61251b6..f969e00 100644
--- a/src/server.rs
+++ b/src/server.rs
@@ -39,6 +39,18 @@ pub struct Server {
field_ft: tantivy::schema::Field,
#[getset(get_copy = "pub")]
+ field_size: tantivy::schema::Field,
+
+ #[getset(get_copy = "pub")]
+ field_created: tantivy::schema::Field,
+
+ #[getset(get_copy = "pub")]
+ field_modified: tantivy::schema::Field,
+
+ #[getset(get_copy = "pub")]
+ field_indexed: tantivy::schema::Field,
+
+ #[getset(get_copy = "pub")]
field_body: tantivy::schema::Field,
}
@@ -53,6 +65,15 @@ impl Server {
let mut doc = tantivy::Document::default();
doc.add_text(self.field_path(), filepath.display().to_string());
doc.add_text(self.field_ft(), &ext);
+ {
+ use std::os::linux::fs::MetadataExt;
+ let meta = filepath.metadata()?;
+ doc.add_i64(self.field_created(), meta.st_atime());
+ doc.add_i64(self.field_modified(), meta.st_mtime());
+ if let Ok(now) = std::time::SystemTime::now().duration_since(std::time::SystemTime::UNIX_EPOCH).map(|d| d.as_secs()) {
+ doc.add_u64(self.field_indexed(), now)
+ }
+ }
let doc = self.parse_for_file(doc, filepath, &ext)?;
let mut index_writer = self.index.writer(50_000_000)?;
@@ -79,7 +100,15 @@ impl Server {
.try_into()?;
let searcher = reader.searcher();
- let query_parser = tantivy::query::QueryParser::for_index(&self.index, vec![self.field_path, self.field_ft, self.field_body]);
+ let query_parser = tantivy::query::QueryParser::for_index(&self.index, vec![
+ self.field_path,
+ self.field_ft,
+ self.field_size,
+ self.field_created,
+ self.field_modified,
+ self.field_indexed,
+ self.field_body,
+ ]);
let query = query_parser.parse_query(query_str)?;
let top_docs = searcher.search(&query, &tantivy::collector::TopDocs::with_limit(10))?;
@@ -175,6 +204,10 @@ async fn main() -> Result<()> {
let index = tantivy::Index::open_or_create(index_path, schema.clone())?;
let field_path = schema.get_field("path").ok_or_else(|| anyhow!("BUG"))?;
let field_ft = schema.get_field("ft").ok_or_else(|| anyhow!("BUG"))?;
+ let field_size = schema.get_field("size").ok_or_else(|| anyhow!("BUG"))?;
+ let field_created = schema.get_field("created").ok_or_else(|| anyhow!("BUG"))?;
+ let field_modified = schema.get_field("modified").ok_or_else(|| anyhow!("BUG"))?;
+ let field_indexed = schema.get_field("indexed").ok_or_else(|| anyhow!("BUG"))?;
let field_body = schema.get_field("body").ok_or_else(|| anyhow!("BUG"))?;
Server {
@@ -182,6 +215,10 @@ async fn main() -> Result<()> {
field_path,
field_ft,
+ field_size,
+ field_created,
+ field_modified,
+ field_indexed,
field_body,
}
};