use std::{fs::create_dir_all, path::Path};
use anyhow::Result;
use tantivy::{
Index, IndexSettings,
directory::MmapDirectory,
schema::Schema,
store::{Compressor, ZstdCompressor},
tokenizer::{LowerCaser, RemoveLongFilter, Stemmer, TextAnalyzer},
};
pub fn open(path: impl AsRef<Path>, schema: &Schema) -> Result<Index> {
let path = path.as_ref();
if !path.exists() {
create_dir_all(path)?;
}
let settings = IndexSettings {
docstore_compression: Compressor::Zstd(ZstdCompressor {
compression_level: Some(3),
}),
..Default::default()
};
let index = Index::builder()
.schema(schema.clone())
.settings(settings)
.open_or_create(MmapDirectory::open(path)?)?;
let analyzer = TextAnalyzer::builder(tantivy_jieba::JiebaTokenizer {})
.filter(RemoveLongFilter::limit(40))
.filter(LowerCaser)
.filter(Stemmer::default())
.build();
index.tokenizers().register("zh", analyzer);
Ok(index)
}