UNPKG

advanced-search-library

Version:

Intelligent search library with typo correction, autocomplete, and flexible data structure support

192 lines (165 loc) β€’ 6.71 kB
/** * Advanced Search Library - Advanced Usage Example * * @author RΔ±dvan Sevindik <sevindikbusiness@gmail.com> * @github https://github.com/Ridvan0 * @linkedin https://www.linkedin.com/in/ridvansevindik/ */ const AdvancedSearch = require('../src/AdvancedSearch'); console.log('πŸ” Advanced Search Library - Advanced Usage\n'); // Create search with custom options const search = new AdvancedSearch({ maxResults: 20, minQueryLength: 2, typoThreshold: 3, historyLimit: 100 }); console.log('βœ… Search engine created with custom settings'); // Advanced data with custom fields const advancedData = [ { id: 1, productName: "Premium Coffee Machine", description: "Automatic espresso machine with built-in grinder", specifications: "15 bar pressure, stainless steel, programmable", manufacturer: "Delonghi", category: "Appliances", price: 1200, rating: 4.8, keywords: ["coffee", "espresso", "automatic", "grinder"], features: ["programmable", "stainless steel", "built-in grinder"] }, { id: 2, title: "Professional Drum Kit", content: "Complete 7-piece drum set for professional musicians", details: "Includes cymbals, hardware, and throne", brand: "Pearl", type: "Musical Instruments", cost: 3500, score: 4.9, searchTerms: ["drum", "kit", "professional", "percussion"], attributes: ["complete", "professional", "7-piece"] }, { id: 3, itemName: "Gaming Laptop", summary: "High-performance gaming laptop with RTX graphics", specs: "Intel i7, 16GB RAM, RTX 4060, 1TB SSD", company: "ASUS", segment: "Computers", value: 2800, rating: 4.7, tags: ["gaming", "laptop", "high-performance", "RTX"], properties: ["Intel i7", "RTX 4060", "16GB RAM"] } ]; // Add data with auto field detection search.addData(advancedData); console.log('βœ… Advanced data added with auto field detection'); console.log(` Detected fields: ${search.searchableFields.map(f => f.field).join(', ')}`); // Performance test with large dataset console.log('\nπŸ“Š Performance Test:'); const largeDataset = []; for (let i = 0; i < 5000; i++) { largeDataset.push({ id: i + 100, name: `Product ${i}`, description: `Description for product ${i} with various keywords`, category: `Category ${i % 20}`, price: Math.floor(Math.random() * 1000) + 10, rating: Math.round((Math.random() * 5) * 10) / 10, tags: [`tag${i % 10}`, `keyword${i % 15}`, `feature${i % 8}`] }); } search.addData(largeDataset); const startTime = performance.now(); const perfResults = search.search('product'); const endTime = performance.now(); console.log(` Search time: ${(endTime - startTime).toFixed(2)}ms`); console.log(` Results found: ${perfResults.length}`); console.log(` Total items: ${search.getStats().totalItems}`); // Advanced filtering combinations console.log('\nπŸ”§ Advanced Filtering:'); // Combined filters const complexFilter = { priceRange: [100, 2000], category: 'Appliances', minRating: 4.5, sortBy: 'rating_desc' }; const filteredResults = search.search('coffee', complexFilter); console.log(` Complex filter search found ${filteredResults.length} results:`); filteredResults.forEach(item => { const name = item.productName || item.name || item.title; const category = item.category || item.type || item.segment; const price = item.price || item.cost || item.value; const rating = item.rating || item.score; console.log(` - ${name} (${category}) - $${price} - ⭐${rating}`); }); // Custom field priority search console.log('\n🎯 Custom Field Priority:'); const customSearch = new AdvancedSearch({ customFields: [ { field: 'productName', priority: 20, exact: 40 }, { field: 'title', priority: 20, exact: 40 }, { field: 'name', priority: 15, exact: 30 }, { field: 'description', priority: 8, exact: 15 }, { field: 'keywords', priority: 12, exact: 20 }, { field: 'tags', priority: 10, exact: 18 } ] }); customSearch.addData(advancedData); const priorityResults = customSearch.search('coffee'); console.log(` Custom priority search found ${priorityResults.length} results:`); priorityResults.forEach(item => { const name = item.productName || item.name || item.title; console.log(` - ${name} (Score: ${item.relevanceScore})`); }); // Multi-word and phrase search console.log('\nπŸ“ Multi-word Search:'); const multiWordQueries = [ 'gaming laptop', 'coffee machine', 'professional drum', 'high performance' ]; multiWordQueries.forEach(query => { const results = search.search(query); console.log(` "${query}": ${results.length} results`); if (results.length > 0) { const topResult = results[0]; const name = topResult.productName || topResult.name || topResult.title || topResult.itemName; console.log(` Top: ${name} (Score: ${topResult.relevanceScore})`); } }); // Search history analysis console.log('\nπŸ“ˆ Search History Analysis:'); const history = search.getSearchHistory(); const queryFrequency = {}; history.forEach(entry => { queryFrequency[entry.query] = (queryFrequency[entry.query] || 0) + 1; }); const popularQueries = Object.entries(queryFrequency) .sort(([,a], [,b]) => b - a) .slice(0, 5); console.log(` Most popular queries:`); popularQueries.forEach(([query, count]) => { console.log(` "${query}": ${count} times`); }); // Autocomplete with context console.log('\nπŸ’‘ Contextual Autocomplete:'); const autocompleteTests = ['cof', 'gam', 'pro', 'lap']; autocompleteTests.forEach(partial => { const suggestions = search.autocomplete(partial); console.log(` "${partial}": [${suggestions.join(', ')}]`); }); // Final statistics console.log('\nπŸ“Š Final Statistics:'); const finalStats = search.getStats(); console.log(` Total items indexed: ${finalStats.totalItems}`); console.log(` Total searches performed: ${finalStats.totalSearches}`); console.log(` Unique search queries: ${finalStats.uniqueSearches}`); console.log(` Average results per search: ${finalStats.averageResultsPerSearch.toFixed(2)}`); console.log('\nβœ… Advanced usage example completed!'); console.log(' The library has successfully processed large datasets and complex queries.');