81 lines
3.1 KiB
Rust
81 lines
3.1 KiB
Rust
// 负责定义 Tantivy 字段分词索引存储和快速字段策略
|
|
|
|
use tantivy::schema::{
|
|
FAST, Field, IndexRecordOption, STORED, STRING, Schema, TextFieldIndexing, TextOptions,
|
|
};
|
|
|
|
pub(crate) const MIXED_NGRAM_TOKENIZER: &str = "dht_mixed_ngram";
|
|
|
|
#[derive(Debug, Clone, Copy)]
|
|
pub(crate) struct SearchFields {
|
|
pub(crate) info_hash: Field,
|
|
pub(crate) name: Field,
|
|
pub(crate) display_name: Field,
|
|
pub(crate) aliases: Field,
|
|
pub(crate) files_text: Field,
|
|
pub(crate) regex_text: Field,
|
|
pub(crate) extensions: Field,
|
|
pub(crate) total_size: Field,
|
|
pub(crate) file_count: Field,
|
|
pub(crate) first_seen: Field,
|
|
pub(crate) last_seen: Field,
|
|
pub(crate) seen_count: Field,
|
|
pub(crate) content_key: Field,
|
|
pub(crate) availability_status: Field,
|
|
pub(crate) reachable_peers: Field,
|
|
pub(crate) last_verified_at: Field,
|
|
pub(crate) heat_score: Field,
|
|
pub(crate) variant_count: Field,
|
|
}
|
|
|
|
pub(crate) fn build_schema() -> (Schema, SearchFields) {
|
|
let mut builder = Schema::builder();
|
|
let info_hash = builder.add_text_field("info_hash", STRING | STORED);
|
|
let indexed_text = TextOptions::default().set_indexing_options(
|
|
TextFieldIndexing::default()
|
|
.set_tokenizer(MIXED_NGRAM_TOKENIZER)
|
|
.set_index_option(IndexRecordOption::WithFreqsAndPositions),
|
|
);
|
|
let name = builder.add_text_field("name", indexed_text.clone());
|
|
let display_name = builder.add_text_field("display_name", STORED);
|
|
let aliases = builder.add_text_field("aliases", indexed_text.clone());
|
|
let files_text = builder.add_text_field("files_text", indexed_text);
|
|
let regex_text = builder.add_text_field("regex_text", STRING);
|
|
let extensions = builder.add_text_field("extensions", STRING);
|
|
let total_size = builder.add_u64_field("total_size", FAST | STORED);
|
|
let file_count = builder.add_u64_field("file_count", FAST | STORED);
|
|
let first_seen = builder.add_u64_field("first_seen", FAST | STORED);
|
|
let last_seen = builder.add_u64_field("last_seen", FAST | STORED);
|
|
let seen_count = builder.add_u64_field("seen_count", FAST | STORED);
|
|
let content_key = builder.add_text_field("content_key", STRING | STORED);
|
|
let availability_status = builder.add_u64_field("availability_status", FAST | STORED);
|
|
let reachable_peers = builder.add_u64_field("reachable_peers", FAST | STORED);
|
|
let last_verified_at = builder.add_u64_field("last_verified_at", FAST | STORED);
|
|
let heat_score = builder.add_u64_field("heat_score", FAST | STORED);
|
|
let variant_count = builder.add_u64_field("variant_count", FAST | STORED);
|
|
let schema = builder.build();
|
|
(
|
|
schema,
|
|
SearchFields {
|
|
info_hash,
|
|
name,
|
|
display_name,
|
|
aliases,
|
|
files_text,
|
|
regex_text,
|
|
extensions,
|
|
total_size,
|
|
file_count,
|
|
first_seen,
|
|
last_seen,
|
|
seen_count,
|
|
content_key,
|
|
availability_status,
|
|
reachable_peers,
|
|
last_verified_at,
|
|
heat_score,
|
|
variant_count,
|
|
},
|
|
)
|
|
}
|