Auto-update fts index
Some checks failed
CI / Typos (push) Successful in 18s
CI / Build and test (push) Failing after 1m4s
CI / Clippy (push) Successful in 1m56s

This commit is contained in:
2026-02-21 16:03:20 -08:00
parent 5d8ad4665d
commit 5aab61bd1b
36 changed files with 1121 additions and 275 deletions

View File

@@ -27,8 +27,8 @@ pub struct DbFtsIndex {
impl DbFtsIndex {
fn fts_cfg(&self) -> &DatasetFts {
static DEFAULT: LazyLock<DatasetFts> = LazyLock::new(|| DatasetFts::default());
&self.cfg.fts.as_ref().unwrap_or(&DEFAULT)
static DEFAULT: LazyLock<DatasetFts> = LazyLock::new(DatasetFts::default);
self.cfg.fts.as_ref().unwrap_or(&DEFAULT)
}
}
@@ -47,9 +47,9 @@ impl DbFtsIndex {
let fields = &cfg.fts.as_ref().unwrap_or(&default).fields;
for (name, field) in fields {
if field.tokenize {
schema_builder.add_text_field(&name, schema::TEXT);
schema_builder.add_text_field(name, schema::TEXT);
} else {
schema_builder.add_text_field(&name, schema::STRING);
schema_builder.add_text_field(name, schema::STRING);
}
}
@@ -70,19 +70,23 @@ impl DbFtsIndex {
) -> Result<Option<TantivyDocument>, TantivyError> {
let mut doc = TantivyDocument::default();
{
let f_ptr = self.schema.get_field("_meta_source")?;
doc.add_text(f_ptr, item.source_name());
}
let key = match item.key().to_string() {
Some(x) => x,
None => {
warn!(
message = "Item key cannot be converted to a string, skipping",
key = ?item.key(),
);
return Ok(None);
}
};
{
let f_ptr = self.schema.get_field("_meta_key")?;
doc.add_text(f_ptr, item.key().to_string());
}
doc.add_text(self.schema.get_field("_meta_source")?, item.source_name());
doc.add_text(self.schema.get_field("_meta_key")?, key);
let json = item.json().unwrap();
let json = item.json()?;
let mut empty = true;
for (name, _field) in &self.fts_cfg().fields {
for name in self.fts_cfg().fields.keys() {
let val = match self.get_field(&json, name)? {
Some(x) => x,
None => continue,
@@ -118,7 +122,7 @@ impl DbFtsIndex {
// Try paths in order, using the first value we find
'outer: for path in field.path.as_slice() {
let val = match json.query(&path) {
let val = match json.query(path) {
Ok(mut x) => {
if x.len() > 1 {
warn!(
@@ -168,6 +172,7 @@ impl DbFtsIndex {
loop {
val = match val {
#[expect(clippy::unwrap_used)]
Value::Array(ref mut x) => {
if x.len() == 1 {
x.pop().unwrap()