Search and Discovery UX
Regulated KB search must let a compliance officer answer "who can see what, and why?" and a practitioner quickly find the right guidance.
Global Search Bar
Query Capabilities
- Search across:
- Title
- Headings
- Body
- Tags
- Regulation tags (e.g.,
hipaa:breach-notification,sec:17a-4)
Typeahead Sections
| Section | Description |
|---|---|
| Documents | Matching document titles |
| Spaces | Matching collections/workspaces |
| People/Owners | Document owners matching query |
Advanced Search Panel
Facet Filters
| Facet | Values |
|---|---|
| Document Type | Policy, SOP, Clinical Guideline, Risk Procedure |
| Classification Level | Public, Internal, Confidential, Restricted, PHI |
| Retention Category | HIPAA-6Y, FINRA-6Y, SEC-7Y |
| Jurisdiction | US, EU, UK, BR, Multi-jurisdiction |
| Business Unit | Compliance, Clinical, Trading, Risk |
Status Filters
- Draft
- In review
- Approved
- Deprecated
- On hold
Time-Based Filters
Keyed to retention:
- Creation date
- Last review date
- Next re-certification date
- Effective date
- Expiry date
Saved Searches
Examples
| Saved Search | Query |
|---|---|
| HIPAA policies in review | regulations:HIPAA AND status:in_review |
| KYC procedures expiring | type:procedure AND tag:kyc AND review_due_date:<90d |
| High-risk without attestation | risk_level:high AND attestation:missing |
Features
- User-defined smart folders
- Scheduled alerts
- Shared with team
RAG Integration
Integrate RAG-style semantic search in the results panel but always anchored back to specific Markdown docs and sections for auditability.
Requirements
- Auditability: Every AI answer must cite source doc and section
- Transparency: Show confidence scores
- Fallback: Offer traditional search when semantic fails
Component Structure
// GlobalSearchBar.tsx
interface GlobalSearchBarProps {
query: string;
onQueryChange: (query: string) => void;
onSearch: (query: string) => void;
suggestions: SearchSuggestion[];
}
// AdvancedSearchPanel.tsx
interface AdvancedSearchPanelProps {
facets: FacetDefinition[];
selectedFilters: FacetSelection;
onFilterChange: (facet: string, values: string[]) => void;
}
// SavedSearchList.tsx
interface SavedSearchListProps {
searches: SavedSearch[];
onSelect: (searchId: string) => void;
onCreate: (search: SavedSearchInput) => void;
}