feat(globalsearch): Implement tag-based filters in global search (#5151)

This commit is contained in:
Sandeep Kumar
2024-07-01 17:45:39 +05:30
committed by GitHub
parent 8a33bd5e73
commit 4314fcd173
3 changed files with 75 additions and 5 deletions

View File

@ -371,7 +371,7 @@ pub struct OpenSearchQueryBuilder {
pub query: String,
pub offset: Option<i64>,
pub count: Option<i64>,
pub filters: Vec<(String, String)>,
pub filters: Vec<(String, Vec<String>)>,
}
impl OpenSearchQueryBuilder {
@ -391,7 +391,7 @@ impl OpenSearchQueryBuilder {
Ok(())
}
pub fn add_filter_clause(&mut self, lhs: String, rhs: String) -> QueryResult<()> {
pub fn add_filter_clause(&mut self, lhs: String, rhs: Vec<String>) -> QueryResult<()> {
self.filters.push((lhs, rhs));
Ok(())
}
@ -403,7 +403,7 @@ impl OpenSearchQueryBuilder {
let mut filters = self
.filters
.iter()
.map(|(k, v)| json!({"match_phrase" : {k : v}}))
.map(|(k, v)| json!({"terms" : {k : v}}))
.collect::<Vec<Value>>();
query.append(&mut filters);

View File

@ -20,9 +20,43 @@ pub async fn msearch_results(
OpenSearchQueryBuilder::new(OpenSearchQuery::Msearch(indexes.clone()), req.query);
query_builder
.add_filter_clause("merchant_id".to_string(), merchant_id.to_string())
.add_filter_clause(
"merchant_id.keyword".to_string(),
vec![merchant_id.to_string()],
)
.switch()?;
if let Some(filters) = req.filters {
if let Some(currency) = filters.currency {
if !currency.is_empty() {
query_builder
.add_filter_clause("currency.keyword".to_string(), currency.clone())
.switch()?;
}
};
if let Some(status) = filters.status {
if !status.is_empty() {
query_builder
.add_filter_clause("status.keyword".to_string(), status.clone())
.switch()?;
}
};
if let Some(payment_method) = filters.payment_method {
if !payment_method.is_empty() {
query_builder
.add_filter_clause("payment_method.keyword".to_string(), payment_method.clone())
.switch()?;
}
};
if let Some(customer_email) = filters.customer_email {
if !customer_email.is_empty() {
query_builder
.add_filter_clause("customer_email.keyword".to_string(), customer_email.clone())
.switch()?;
}
};
};
let response_text: OpenMsearchOutput = client
.execute(query_builder)
.await
@ -82,9 +116,42 @@ pub async fn search_results(
OpenSearchQueryBuilder::new(OpenSearchQuery::Search(req.index), search_req.query);
query_builder
.add_filter_clause("merchant_id".to_string(), merchant_id.to_string())
.add_filter_clause(
"merchant_id.keyword".to_string(),
vec![merchant_id.to_string()],
)
.switch()?;
if let Some(filters) = search_req.filters {
if let Some(currency) = filters.currency {
if !currency.is_empty() {
query_builder
.add_filter_clause("currency.keyword".to_string(), currency.clone())
.switch()?;
}
};
if let Some(status) = filters.status {
if !status.is_empty() {
query_builder
.add_filter_clause("status.keyword".to_string(), status.clone())
.switch()?;
}
};
if let Some(payment_method) = filters.payment_method {
if !payment_method.is_empty() {
query_builder
.add_filter_clause("payment_method.keyword".to_string(), payment_method.clone())
.switch()?;
}
};
if let Some(customer_email) = filters.customer_email {
if !customer_email.is_empty() {
query_builder
.add_filter_clause("customer_email.keyword".to_string(), customer_email.clone())
.switch()?;
}
};
};
query_builder
.set_offset_n_count(search_req.offset, search_req.count)
.switch()?;

View File

@ -3,6 +3,9 @@ use serde_json::Value;
#[derive(Clone, Debug, Default, serde::Deserialize, serde::Serialize)]
pub struct SearchFilters {
pub payment_method: Option<Vec<String>>,
pub currency: Option<Vec<String>>,
pub status: Option<Vec<String>>,
pub customer_email: Option<Vec<String>>,
}
#[derive(Clone, Debug, serde::Deserialize, serde::Serialize)]