You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

40 lines
1.1KB

  1. extern crate tantivy;
  2. use tantivy::{Index, SegmentMeta};
  3. use std::path::PathBuf;
  4. use clap::ArgMatches;
  5. use futures::Future;
  6. const HEAP_SIZE: usize = 300_000_000;
  7. fn error_msg(err: tantivy::Error) -> String {
  8. format!("Merge failed : {:?}", err)
  9. }
  10. pub fn run_merge_cli(argmatch: &ArgMatches) -> Result<(), String> {
  11. let index_directory = PathBuf::from(argmatch.value_of("index").unwrap());
  12. run_merge(index_directory).map_err(error_msg)
  13. // we rollback to force a gc.
  14. }
  15. fn run_merge(path: PathBuf) -> tantivy::Result<()> {
  16. let index = Index::open_in_dir(&path)?;
  17. let segments = index.searchable_segment_ids()?;
  18. let segment_meta: SegmentMeta = index
  19. .writer(HEAP_SIZE)?
  20. .merge(&segments)?
  21. .wait()
  22. .expect("Merge failed");
  23. //.map_err(|_| tantivy::Error::ErrorInThread(String::from("Merge got cancelled")));
  24. println!("Merge finished with segment meta {:?}", segment_meta);
  25. println!("Garbage collect irrelevant segments.");
  26. Index::open_in_dir(&path)?
  27. .writer_with_num_threads(1, 40_000_000)?
  28. .garbage_collect_files()?;
  29. Ok(())
  30. }