We are using a generic method to apply cq dynamically across multiple pages. The function is accessed in different parts of our application, including a tabbed search interface, where each tab applies a different cq filter.
Current Implementation
Here’s how we are applying cq when a tab is selected:
const handleTabSelection = (selectedTabId: string) => {
const tabs = Object.values(tabsConfig);
if (selectedTabId) {
const tabExpression = tabs.find((tab) => tab.label === selectedTabId)?.expression;
if (tabExpression) {
manager.applyContextualQuery(tabExpression); // Apply the new CQ
manager.getEngine().executeFirstSearch();
}
}
};
In our CoveoManager.ts, we are applying cq using AdvancedSearchQueryActions:
import { loadAdvancedSearchQueryActions } from '@coveo/headless';
applyContextualQuery(expression: string) {
const { updateAdvancedSearchQueries } = loadAdvancedSearchQueryActions(this.engine);
// Reset CQ before applying a new one
this.engine.dispatch(
updateAdvancedSearchQueries({
cq: '', // Clear existing CQ
})
);
// Apply the new CQ
this.engine.dispatch(
updateAdvancedSearchQueries({
cq: expression,
})
);
this.engine.executeFirstSearch();
}
Issue
When switching tabs, the cq appends instead of replacing the previous one. This results in an unintended filter combination across multiple tabs.
Current Payloads
Here are two example cq values when switching tabs:
Tab: "All Content"
@swcontenttype==("Knowledge Base", Community, "All Pages", "Technical Documentation", "Products and Solutions", Briefs, Blog, Datasheets, "Video Tutorials", Videos, "Case Studies", Whitepapers, Infographics, YouTube, "Support Pages", eBook, "On-Demand Webcasts", "Product Life Cycle Tables", Trials, "Product Notification", Notices) OR @source==("SonicWall YouTube", PSIRT)
Tab: "Support"
@swcontenttype==("Knowledge Base",Blog, "Technical Documentation", "All Pages", "Video Tutorials", "Product Life Cycle Tables", "Support Pages", Community, "Product Notification", Notices, "Security Advisories")
When switching to "Support", the cq from "All Content" is still present, causing them to be combined instead of replacing the old one. see below.
@swcontenttype==("Knowledge Base", Community, "All Pages", "Technical Documentation", "Products and Solutions", Briefs, Blog, Datasheets, "Video Tutorials", Videos, "Case Studies", Whitepapers, Infographics, YouTube, "Support Pages", eBook, "On-Demand Webcasts", "Product Life Cycle Tables", Trials, "Product Notification", Notices) OR @source==("SonicWall YouTube", PSIRT) AND @swcontenttype==("Knowledge Base", Community, "All Pages", "Technical Documentation", "Products and Solutions", Briefs, Blog, Datasheets, "Video Tutorials", Videos, "Case Studies", Whitepapers, Infographics, YouTube, "Support Pages", eBook, "On-Demand Webcasts", "Product Life Cycle Tables", Trials, "Product Notification", Notices) OR @source==("SonicWall YouTube", PSIRT)
Questions
What is the best approach to apply cq dynamically without it persisting across tabs?
Should we be resetting cq before applying a new one, or is there a recommended way to handle this with AdvancedSearchQueryActions?
Would it be better to use buildSearchParameterManager for managing cq instead?
Is there a way to register cq at the initial load without affecting tab switching behavior?
Any insights on the best practice for handling contextual queries dynamically would be helpful!
Questions
What is the best approach to apply cq dynamically without it persisting across tabs? Should we be resetting cq before applying a new one, or is there a recommended way to handle this with AdvancedSearchQueryActions? Would it be better to use buildSearchParameterManager for managing cq instead? Is there a way to register cq at the initial load without affecting tab switching behavior?
Any insights on the best practice for handling contextual queries dynamically would be helpful!