A demonstration of integrating powerful client-side search libraries (Fuse.js and MiniSearch.js) with the Reflex framework. This project showcases how to implement fast, responsive search functionality entirely on the frontend without requiring server-side processing.
- ⚡ Real-time search with 300ms debouncing
- 🔍 Fuzzy matching for typo-tolerant searches
- 📱 Responsive design with dialog-based search interface
- 🎯 Multiple field search across titles and authors
- 🚀 No server requests - all searching happens client-side
- ⌨️ Keyboard shortcuts (⌘K to open search)
The search interface includes:
- Clean, modern dialog-based search modal
- Real-time results as you type
- Score-based result ranking
- Structured display of search results
Fuse.js is a powerful, lightweight fuzzy-search library with excellent customization options.
- Advanced fuzzy matching algorithms
- Flexible scoring system
- Extensive configuration options
- ~50KB library size (uncompressed)
-
Install Dependencies
uv sync
-
File Structure
your-project/ ├── app.py ├── assets/ │ └── fuse.js │ └── list.json │
-
Data Format Your
list.json
should follow this structure:[ { "title": "Document Title", "author": { "firstName": "John", "lastName": "Doe" } } ]
-
Custom Script (
/public/fuse.js
)let fuse; window.initializeFuse = function(data) { const options = { keys: ['title', 'author.firstName', 'author.lastName'], threshold: 0.3, includeScore: true }; fuse = new Fuse(data, options); }; window.searchFuse = function(query) { if (!fuse || !query.trim()) return []; return fuse.search(query); };
threshold
: Controls fuzziness (0.0 = perfect match, 1.0 = match anything)keys
: Fields to search withinincludeScore
: Return relevance scoresshouldSort
: Sort results by score
MiniSearch is a tiny, fast full-text search engine optimized for performance.
- Extremely fast search performance
- Small bundle size (~25KB uncompressed)
- Memory efficient
- Advanced text processing
-
File Structure (same as Fuse.js)
your-project/ ├── app.py ├── assets/ │ └── minisearch.js │ └── list.json │
-
Custom Script (
/public/minisearch.js
)let miniSearch; window.initializeMinisearch = function(data) { miniSearch = new MiniSearch({ fields: ['title', 'author.firstName', 'author.lastName'], storeFields: ['title', 'author'], searchOptions: { boost: { title: 2 }, fuzzy: 0.2, prefix: true } }); const dataWithIds = data.map((item, index) => ({ id: index, ...item })); miniSearch.addAll(dataWithIds); }; window.searchMinisearch = function(query) { if (!miniSearch || !query.trim()) return []; const results = miniSearch.search(query, { fuzzy: 0.2, prefix: true, boost: { title: 2 } }); return results.map((result, index) => ({ item: { title: result.title, author: result.author }, refIndex: result.id || index, score: 1 - result.score })); };
fields
: Fields to index for searchingstoreFields
: Fields to include in resultsfuzzy
: Fuzzy matching toleranceprefix
: Enable prefix matchingboost
: Boost specific fields in ranking
reflex run