Lindera tokenizer for Tantivy
Lindera Tokenizer for Tantivy.
Usage
Make sure you have activated the required dictionaries for the Lindera in Cargo.toml.
The following example enables IPADIC.
[dependencies]
lindera-tantivy = { version = "0.12.0", features = ["ipadic"] }
- ipadic: Japanese dictionary
- unidic: Japanese dictionary
- ko-dic: Korean dictionary
- cc-cedict: Chinese dictionary
Basic example
use tantivy::collector::TopDocs;
use tantivy::query::QueryParser;
use tantivy::schema::{IndexRecordOption, Schema, TextFieldIndexing, TextOptions};
use tantivy::doc;
use tantivy::Index;
use lindera::mode::{Mode, Penalty};
use lindera::tokenizer::{DictionaryType, TokenizerConfig, UserDictionaryType};
use lindera_tantivy::tokenizer::LinderaTokenizer;
fn main() -> tantivy::Result<()> {
let mut schema_builder = Schema::builder();
let id = schema_builder.add_text_field(
"id",
TextOptions::default()
.set_indexing_options(
TextFieldIndexing::default()
.set_tokenizer("raw")
.set_index_option(IndexRecordOption::Basic),
)
.set_stored(),
);
let title = schema_builder.add_text_field(
"title",
TextOptions::default()
.set_indexing_options(
TextFieldIndexing::default()
.set_tokenizer("lang_ja")
.set_index_option(IndexRecordOption::WithFreqsAndPositions),
)
.set_stored(),
);
let body = schema_builder.add_text_field(
"body",
TextOptions::default()
.set_indexing_options(
TextFieldIndexing::default()
.set_tokenizer("lang_ja")
.set_index_option(IndexRecordOption::WithFreqsAndPositions),
)
.set_stored(),
);
let schema = schema_builder.build();
let index = Index::create_in_ram(schema.clone());
let config = TokenizerConfig {
dict_type: DictionaryType::Ipadic,
dict_path: None,
user_dict_path: None,
user_dict_type: UserDictionaryType::Csv,
mode: Mode::Decompose(Penalty::default()),
};
index
.tokenizers()
.register("lang_ja", LinderaTokenizer::with_config(config).unwrap());
let mut index_writer = index.writer(50_000_000)?;
index_writer.add_document(doc!(
id => "1",
title => "成田国際空港",
body => "成田国際空港(なりたこくさいくうこう、英: Narita International Airport)は、千葉県成田市南東部から芝山町北部にかけて建設された日本最大の国際拠点空港である。首都圏東部(東京の東60km)に位置している。空港コードはNRT。"
)).unwrap();
index_writer.add_document(doc!(
id => "2",
title => "東京国際空港",
body => "東京国際空港(とうきょうこくさいくうこう、英語: Tokyo International Airport)は、東京都大田区にある日本最大の空港。通称は羽田空港(はねだくうこう、英語: Haneda Airport)であり、単に「羽田」と呼ばれる場合もある。空港コードはHND。"
)).unwrap();
index_writer.add_document(doc!(
id => "3",
title => "関西国際空港",
body => "関西国際空港(かんさいこくさいくうこう、英: Kansai International Airport)は大阪市の南西35㎞に位置する西日本の国際的な玄関口であり、関西三空港の一つとして大阪国際空港(伊丹空港)、神戸空港とともに関西エアポート株式会社によって一体運営が行われている。"
)).unwrap();
index_writer.commit()?;
let reader = index.reader()?;
let searcher = reader.searcher();
let query_parser = QueryParser::for_index(&index, vec![title, body]);
let query_str = "東京";
let query = query_parser.parse_query(query_str)?;
println!("Query String: {}", query_str);
let top_docs = searcher.search(&query, &TopDocs::with_limit(10))?;
println!("Search Result:");
for (_, doc_address) in top_docs {
let retrieved_doc = searcher.doc(doc_address)?;
println!("{}", schema.to_json(&retrieved_doc));
}
Ok(())
}
API reference
The API reference is available. Please see following URL: