1use tantivy::schema::{
5 FAST, Field, INDEXED, IndexRecordOption, STORED, STRING, Schema, TextFieldIndexing, TextOptions,
6};
7
8#[derive(Clone, Copy)]
9pub struct SearchFields {
10 pub session_id: Field,
11 pub seq: Field,
12 pub event_key: Field,
13 pub ts_ms: Field,
14 pub agent: Field,
15 pub kind: Field,
16 pub text: Field,
17 pub path: Field,
18 pub skill: Field,
19 pub tokens_total: Field,
20}
21
22pub fn build_schema() -> (Schema, SearchFields) {
23 let mut b = Schema::builder();
24 let session_id = b.add_text_field("session_id", STRING | STORED);
25 let seq = b.add_i64_field("seq", INDEXED | FAST | STORED);
26 let event_key = b.add_text_field("event_key", STRING);
27 let ts_ms = b.add_i64_field("ts_ms", INDEXED | FAST | STORED);
28 let agent = b.add_text_field("agent", STRING | STORED);
29 let kind = b.add_text_field("kind", STRING | STORED);
30 let text = b.add_text_field("text", bm25_text());
31 let path = b.add_text_field("path", STRING);
32 let skill = b.add_text_field("skill", STRING);
33 let tokens_total = b.add_i64_field("tokens_total", INDEXED | FAST | STORED);
34 let schema = b.build();
35 let fields = SearchFields {
36 session_id,
37 seq,
38 event_key,
39 ts_ms,
40 agent,
41 kind,
42 text,
43 path,
44 skill,
45 tokens_total,
46 };
47 (schema, fields)
48}
49
50fn bm25_text() -> TextOptions {
51 TextOptions::default().set_indexing_options(
52 TextFieldIndexing::default().set_index_option(IndexRecordOption::WithFreqsAndPositions),
53 )
54}
55
56pub fn event_key(session_id: &str, seq: u64) -> String {
57 format!("{session_id}\0{seq}")
58}