Skip to main content

kaizen/search/
schema.rs

1// SPDX-License-Identifier: AGPL-3.0-or-later
2//! Tantivy schema for event search.
3
4use 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}