diff options
Diffstat (limited to 'server')
-rw-r--r-- | server/src/main.rs | 5 | ||||
-rw-r--r-- | server/src/routes/ui/search.rs | 83 |
2 files changed, 47 insertions, 41 deletions
diff --git a/server/src/main.rs b/server/src/main.rs index 919ba50..d834481 100644 --- a/server/src/main.rs +++ b/server/src/main.rs @@ -8,6 +8,7 @@ #![feature(let_chains)] use crate::routes::ui::{account::hash_password, admin::log::enable_logging}; +use anyhow::Context; use database::DataAcid; use jellybase::{ database::{ReadableTable, Ser, T_USER}, @@ -29,7 +30,9 @@ async fn main() { log::warn!("authentification bypass enabled"); create_dir_all(&CONF.cache_path).await.unwrap(); - let database = DataAcid::open(&CONF.database_path).unwrap(); + let database = DataAcid::open(&CONF.database_path) + .context("opening database") + .unwrap(); let federation = Federation::initialize(); if let Some(username) = &CONF.admin_username diff --git a/server/src/routes/ui/search.rs b/server/src/routes/ui/search.rs index eb222c9..cafa755 100644 --- a/server/src/routes/ui/search.rs +++ b/server/src/routes/ui/search.rs @@ -5,7 +5,9 @@ use super::{ node::NodeCard, }; use edit_distance::edit_distance; -use jellybase::database::{DataAcid, ReadableTable, T_NODE, T_USER_NODE}; +use jellybase::database::{ + tantivy::query::QueryParser, DataAcid, ReadableTable, T_NODE, T_USER_NODE, +}; use rocket::{get, State}; #[get("/search?<query>")] @@ -14,47 +16,48 @@ pub async fn r_search<'a>( db: &State<DataAcid>, query: Option<&str>, ) -> MyResult<DynLayoutPage<'a>> { - let results = if let Some(query) = query { - let mut items = { - let txn = db.begin_read()?; - let nodes = txn.open_table(T_NODE)?; - let node_users = txn.open_table(T_USER_NODE)?; - let i = nodes - .iter()? - .map(|a| { - let (x, y) = a.unwrap(); - let (x, y) = (x.value().to_owned(), y.value().0); - let z = node_users - .get(&(session.user.name.as_str(), x.as_str())) - .unwrap() - .map(|z| z.value().0) - .unwrap_or_default(); - let y = y.public; - (x, y, z) - }) - .collect::<Vec<_>>(); - drop(nodes); - i - }; - - let query = query.to_lowercase(); - items.sort_by_cached_key(|(_, n, _)| { - n.title - .as_ref() - .map(|x| x.to_lowercase()) - .unwrap_or_default() - .split(" ") - .map(|tok| edit_distance(query.as_str(), tok)) - .min() - .unwrap_or(usize::MAX) - }); + // let results = if let Some(query) = query { + // let mut items = { + // let txn = db.begin_read()?; + // let nodes = txn.open_table(T_NODE)?; + // let node_users = txn.open_table(T_USER_NODE)?; + // let i = nodes + // .iter()? + // .map(|a| { + // let (x, y) = a.unwrap(); + // let (x, y) = (x.value().to_owned(), y.value().0); + // let z = node_users + // .get(&(session.user.name.as_str(), x.as_str())) + // .unwrap() + // .map(|z| z.value().0) + // .unwrap_or_default(); + // let y = y.public; + // (x, y, z) + // }) + // .collect::<Vec<_>>(); + // drop(nodes); + // i + // }; + // let query = query.to_lowercase(); + // items.sort_by_cached_key(|(_, n, _)| { + // n.title + // .as_ref() + // .map(|x| x.to_lowercase()) + // .unwrap_or_default() + // .split(" ") + // .map(|tok| edit_distance(query.as_str(), tok)) + // .min() + // .unwrap_or(usize::MAX) + // }); + // Some(items.into_iter().take(64).collect::<Vec<_>>()) + // } else { + // None + // }; - Some(items.into_iter().take(64).collect::<Vec<_>>()) - } else { - None - }; + let query = QueryParser::for_index(index, vec![]); - Ok(LayoutPage { + let searcher = db.node_index.reader.searcher(); + searcher.Ok(LayoutPage { title: "Search".to_string(), class: Some("search"), content: markup::new! { |