advanced-search-library
Version:
Intelligent search library with typo correction, autocomplete, and flexible data structure support
192 lines (165 loc) β’ 6.71 kB
JavaScript
/**
* 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.');