use clap::ArgMatches; use rustc_serialize::json::as_json; use std::convert::From; use std::path::Path; use std::path::PathBuf; use tantivy; use tantivy::Index; use tantivy::query::QueryParser; use tantivy::schema::Field; use tantivy::schema::FieldType; pub fn run_search_cli(matches: &ArgMatches) -> Result<(), String> { let index_directory = PathBuf::from(matches.value_of("index").unwrap()); let query = matches.value_of("query").unwrap(); run_search(&index_directory, &query).map_err(|e| format!("{:?}", e)) } fn run_search(directory: &Path, query: &str) -> tantivy::Result<()> { let index = Index::open(directory)?; let schema = index.schema(); let default_fields: Vec = schema .fields() .iter() .enumerate() .filter( |&(_, ref field_entry)| { match *field_entry.field_type() { FieldType::Str(ref text_field_options) => { text_field_options.get_indexing_options().is_indexed() }, FieldType::U32(_) => false } } ) .map(|(i, _)| Field(i as u8)) .collect(); let query_parser = QueryParser::new(schema.clone(), default_fields); let query = query_parser.parse_query(query)?; let searcher = index.searcher(); let weight = query.weight(&searcher)?; let schema = index.schema(); for segment_reader in searcher.segment_readers() { let mut scorer = try!(weight.scorer(segment_reader)); while scorer.advance() { let doc_id = scorer.doc(); let doc = segment_reader.doc(doc_id)?; let named_doc = schema.to_named_doc(&doc); println!("{}", as_json(&named_doc)); } } Ok(()) }