use std::sync::Arc;
use mf_search::{IndexService, SearchQuery, SqliteBackend, SearchService};
#[tokio::main]
async fn main() -> anyhow::Result<()> {
let backend = Arc::new(SqliteBackend::new_in_system_temp().await?);
let _index_svc = IndexService::new(backend.clone());
let search_svc = SearchService::new(backend.clone());
let docs = vec![
mf_search::model::IndexDoc {
node_id: "n1".into(),
node_type: "paragraph".into(),
parent_id: Some("root".into()),
marks: vec!["bold".into()],
marks_json: r#"[{"type":"bold","attrs":{}}]"#.into(),
attrs_flat: vec![("lang".into(), "zh".into())],
attrs_json: r#"{"lang":"zh"}"#.into(),
text: Some("Rust 搜索引擎示例".into()),
path: vec!["root".into(), "n1".into()],
order_i64: Some(1),
created_at_i64: Some(1_000),
updated_at_i64: Some(1_500),
},
mf_search::model::IndexDoc {
node_id: "n2".into(),
node_type: "paragraph".into(),
parent_id: Some("root".into()),
marks: vec![],
marks_json: "[]".into(),
attrs_flat: vec![("lang".into(), "en".into())],
attrs_json: r#"{"lang":"en"}"#.into(),
text: Some("SQLite backend quick demo".into()),
path: vec!["root".into(), "n2".into()],
order_i64: Some(2),
created_at_i64: Some(2_000),
updated_at_i64: Some(2_500),
},
];
backend.rebuild_all(docs).await?;
let ids = search_svc
.search(SearchQuery {
text: Some("示例".into()),
node_type: Some("paragraph".into()),
limit: 10,
..Default::default()
})
.await?;
println!("命中节点: {ids:?}");
let ids_text = search_svc.search_text("搜索", 10).await?;
println!("全文搜索: {ids_text:?}");
let ids2 = backend
.search_ids(SearchQuery {
attrs: vec![("lang".into(), "en".into())],
limit: 10,
..Default::default()
})
.await?;
println!("按属性过滤命中: {ids2:?}");
let first_page = backend
.search_ids(SearchQuery {
sort_by: Some("created_at_i64".into()),
sort_asc: false,
limit: 1,
..Default::default()
})
.await?;
println!("按 created_at_i64 降序第一页: {first_page:?}");
let second_page = backend
.search_ids(SearchQuery {
sort_by: Some("created_at_i64".into()),
sort_asc: false,
offset: 1,
limit: 1,
..Default::default()
})
.await?;
println!("按 created_at_i64 降序第二页: {second_page:?}");
let ranged = backend
.search_ids(SearchQuery {
range_field: Some("created_at_i64".into()),
range_min: Some(1_000),
range_max: Some(1_500),
limit: 10,
..Default::default()
})
.await?;
println!("范围过滤命中: {ranged:?}");
println!("索引目录: {}", backend.index_dir().display());
Ok(())
}