perf(search): eliminate full struct clones when indexing documents into tantivy by building documents on the dispatch thread before crossing the spawn_blocking boundary

This commit is contained in:
Riz Ashraf committed 2026-09-21 17:20:01 +01:00
1 parent 58ad2e76a3
commit d3fce30ca5
1 file changed
+32 -52
+32 -52
View File
@@ -54,21 +54,16 @@ impl MemoryIndex {
pub fn index_entity(&self, e: &Entity) -> tokio::task::JoinHandle<tantivy::Result<()>> { pub fn index_entity(&self, e: &Entity) -> tokio::task::JoinHandle<tantivy::Result<()>> {
let writer = Arc::clone(&self.writer); let writer = Arc::clone(&self.writer);
let e = e.clone();
let id_field = self.id_field; let doc = doc!(
let title_field = self.title_field; self.id_field => e.name.as_str(),
let body_field = self.body_field; self.title_field => e.name.as_str(),
let type_field = self.type_field; self.body_field => e.observations.join(" "),
let namespace_field = self.namespace_field; self.type_field => "entity",
self.namespace_field => e.namespace.as_str()
);
tokio::task::spawn_blocking(move || { tokio::task::spawn_blocking(move || {
let doc = doc!(
id_field => e.name.clone(),
title_field => e.name.clone(),
body_field => e.observations.join(" "),
type_field => "entity",
namespace_field => e.namespace.clone()
);
let writer = writer.lock().unwrap_or_else(|e| e.into_inner()); let writer = writer.lock().unwrap_or_else(|e| e.into_inner());
writer.add_document(doc)?; writer.add_document(doc)?;
Ok(()) Ok(())
@@ -77,21 +72,16 @@ impl MemoryIndex {
pub fn index_task(&self, t: &Task) -> tokio::task::JoinHandle<tantivy::Result<()>> { pub fn index_task(&self, t: &Task) -> tokio::task::JoinHandle<tantivy::Result<()>> {
let writer = Arc::clone(&self.writer); let writer = Arc::clone(&self.writer);
let t = t.clone();
let id_field = self.id_field; let doc = doc!(
let title_field = self.title_field; self.id_field => t.id.as_str(),
let body_field = self.body_field; self.title_field => t.title.as_str(),
let type_field = self.type_field; self.body_field => t.description.as_str(),
let namespace_field = self.namespace_field; self.type_field => "task",
self.namespace_field => "global"
);
tokio::task::spawn_blocking(move || { tokio::task::spawn_blocking(move || {
let doc = doc!(
id_field => t.id.clone(),
title_field => t.title.clone(),
body_field => t.description.clone(),
type_field => "task",
namespace_field => "global"
);
let writer = writer.lock().unwrap_or_else(|e| e.into_inner()); let writer = writer.lock().unwrap_or_else(|e| e.into_inner());
writer.add_document(doc)?; writer.add_document(doc)?;
Ok(()) Ok(())
@@ -169,21 +159,16 @@ impl MemoryIndex {
pub fn index_snippet(&self, s: &Snippet) -> tokio::task::JoinHandle<tantivy::Result<()>> { pub fn index_snippet(&self, s: &Snippet) -> tokio::task::JoinHandle<tantivy::Result<()>> {
let writer = Arc::clone(&self.writer); let writer = Arc::clone(&self.writer);
let s = s.clone();
let id_field = self.id_field; let doc = doc!(
let title_field = self.title_field; self.id_field => s.name.as_str(),
let body_field = self.body_field; self.title_field => s.name.as_str(),
let type_field = self.type_field; self.body_field => format!("{} {}", s.language, s.description),
let namespace_field = self.namespace_field; self.type_field => "snippet",
self.namespace_field => "global"
);
tokio::task::spawn_blocking(move || { tokio::task::spawn_blocking(move || {
let doc = doc!(
id_field => s.name.clone(),
title_field => s.name.clone(),
body_field => format!("{} {}", s.language, s.description),
type_field => "snippet",
namespace_field => "global"
);
let writer = writer.lock().unwrap_or_else(|e| e.into_inner()); let writer = writer.lock().unwrap_or_else(|e| e.into_inner());
writer.add_document(doc)?; writer.add_document(doc)?;
Ok(()) Ok(())
@@ -192,21 +177,16 @@ impl MemoryIndex {
pub fn index_adr(&self, a: &Adr) -> tokio::task::JoinHandle<tantivy::Result<()>> { pub fn index_adr(&self, a: &Adr) -> tokio::task::JoinHandle<tantivy::Result<()>> {
let writer = Arc::clone(&self.writer); let writer = Arc::clone(&self.writer);
let a = a.clone();
let id_field = self.id_field; let doc = doc!(
let title_field = self.title_field; self.id_field => a.id.as_str(),
let body_field = self.body_field; self.title_field => a.title.as_str(),
let type_field = self.type_field; self.body_field => format!("{} {} {}", a.context, a.decision, a.consequence),
let namespace_field = self.namespace_field; self.type_field => "adr",
self.namespace_field => "global"
);
tokio::task::spawn_blocking(move || { tokio::task::spawn_blocking(move || {
let doc = doc!(
id_field => a.id.clone(),
title_field => a.title.clone(),
body_field => format!("{} {} {}", a.context, a.decision, a.consequence),
type_field => "adr",
namespace_field => "global"
);
let writer = writer.lock().unwrap_or_else(|e| e.into_inner()); let writer = writer.lock().unwrap_or_else(|e| e.into_inner());
writer.add_document(doc)?; writer.add_document(doc)?;
Ok(()) Ok(())