Files
dht/dht-search/src/search/schema.rs
T

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,
},
)
}