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:
1 parent
58ad2e76a3
commit
d3fce30ca5
1 file changed
+32
-52
+32
-52
@@ -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(())
|
||||||
|
|||||||
Reference in new issue
Block a user