← back to Handbag Auth Nextjs
COMPREHENSIVE_SEARCH_SYSTEM.md
312 lines
# Comprehensive Search System - LUXVAULT
## Overview
The LUXVAULT platform now includes a **unified search system** that searches across ALL data sources in the platform, providing comprehensive results in a single query.
## Data Sources
The search system queries these databases and tables:
### 1. **Handbags Database** (`data/handbags.db`)
- **listings** - Current luxury handbag listings from premium marketplaces
- **price_history** - Historical price tracking data
- **deal_analysis** - AI-powered deal quality analysis
- **us_comparisons** - US marketplace price comparisons
- **crawl_history** - Crawler activity logs
- **price_alerts** - User-configured price alerts
### 2. **Auctions Database** (`data/auction-history/auctions.db`)
- **auctions** - Live and historical auction house data
- **auctions_fts** - Full-text search index for auction data
- Includes Christie's, Sotheby's, Bonhams, Phillips, and other auction houses
### 3. **Arbitrage Database** (`data/arbitrage.db`)
- **arbitrage_opportunities** - Cross-market price differentials
- Includes Japan, Hong Kong, and USA market comparisons
- Profit margin calculations and verified opportunities
## API Endpoint
### `/api/search/unified`
**Method:** GET
**Query Parameters:**
| Parameter | Type | Required | Description | Default |
|-----------|------|----------|-------------|---------|
| `q` | string | Yes | Search query (min 2 chars) | - |
| `sources` | string | No | Comma-separated source list | `all` |
| `limit` | number | No | Max results to return (1-100) | `50` |
| `minPrice` | number | No | Minimum price in USD | `0` |
| `maxPrice` | number | No | Maximum price in USD | `999999` |
**Valid Sources:**
- `all` - Search all data sources
- `listings` - Marketplace listings only
- `auctions` - Auction data only
- `arbitrage` - Arbitrage opportunities only
- `price_history` - Historical price data only
**Example Requests:**
```bash
# Search for "Hermès" across all sources
curl "http://45.61.58.125:7991/api/search/unified?q=hermes&limit=10"
# Search for "Birkin" in arbitrage opportunities only
curl "http://45.61.58.125:7991/api/search/unified?q=birkin&sources=arbitrage"
# Search for "Chanel" with price filter
curl "http://45.61.58.125:7991/api/search/unified?q=chanel&minPrice=1000&maxPrice=5000"
# Search across specific sources
curl "http://45.61.58.125:7991/api/search/unified?q=louis&sources=listings,auctions"
```
**Response Format:**
```json
{
"success": true,
"query": "hermes",
"total": 10,
"returned": 10,
"results": [
{
"type": "listing",
"id": 123,
"title": "Hermès Birkin 30cm Black Togo",
"description": "Excellent condition, includes box",
"price": 12500,
"currency": "USD",
"url": "https://...",
"brand": "Hermès",
"model": "Birkin",
"source": "Listing - Fashionphile",
"relevance": 85,
"created_at": "2024-11-17T10:00:00Z",
"metadata": {
"condition": "excellent",
"isDeal": true,
"dealPercentage": 15.5,
"imageUrl": "https://..."
}
}
],
"sources": ["all"],
"stats": {
"listings": 5,
"auctions": 4,
"arbitrage": 1,
"price_history": 0
}
}
```
## Search Features
### 1. **Multi-Field Search**
The search algorithm queries multiple fields for each data source:
**Listings:**
- Title
- Brand
- Model
- Description
- Condition
- AI-generated notes
**Auctions:**
- Title
- Search term (brand)
- Auction house name
**Arbitrage:**
- Brand
- Model
- Condition
**Price History:**
- Title (via listings join)
- Brand (via listings join)
- Model (via listings join)
### 2. **Relevance Ranking**
Results are ranked by relevance score:
- **Exact match**: 100 points (decreasing by field index)
- **Starts with query**: 50 points (decreasing by field index)
- **Contains query**: 25 points (decreasing by field index)
- **Verified arbitrage**: +10 bonus points
### 3. **Price Filtering**
Filter results by price range using `minPrice` and `maxPrice` parameters.
Works across all data sources with USD normalization.
### 4. **Source Filtering**
Choose which data sources to search:
- Single source: `sources=listings`
- Multiple sources: `sources=listings,auctions`
- All sources: `sources=all` (default)
### 5. **Rate Limiting**
- 30 searches per minute per IP address
- Prevents abuse and ensures fair usage
## UI Components
### UnifiedSearch Component
Location: `src/components/UnifiedSearch.tsx`
**Features:**
- Real-time search with 500ms debounce
- Source filtering toggles
- Price range filters
- Result type badges
- Deal highlighting
- Verified indicators
- Click-to-open URLs
**Usage:**
```tsx
import { UnifiedSearch } from '@/components/UnifiedSearch'
<UnifiedSearch
placeholder="Search across all data sources..."
autoFocus={true}
showFilters={true}
onResultClick={(result) => console.log(result)}
/>
```
### Search Page
Location: `src/app/search/page.tsx`
Dedicated search page with:
- Full unified search interface
- Info cards explaining each data source
- Search tips and examples
- Beautiful gradient design
**URL:** http://45.61.58.125:7991/search
## Architecture
### Backend Structure
```
src/app/api/search/unified/route.ts
├── GET handler
│ ├── Rate limiting
│ ├── Input validation
│ ├── Parallel source queries
│ │ ├── searchListings()
│ │ ├── searchAuctions()
│ │ ├── searchArbitrage()
│ │ └── searchPriceHistory()
│ ├── Result merging & sorting
│ └── Response formatting
```
### Database Access
All database access uses **better-sqlite3** for:
- Fast, synchronous queries
- No connection pooling needed
- Read-only connections
- Type safety
### Security
- Input validation using URL search params
- Rate limiting per IP
- Security headers on all responses
- SQL injection prevention via prepared statements
- Read-only database connections
## Performance
### Optimization Techniques
1. **Parallel Queries**: All data sources searched simultaneously
2. **Query Limits**: Each source limited to prevent excessive results
3. **Indexed Searches**: Database indexes on searchable columns
4. **Debounced Input**: UI debounces search queries (500ms)
5. **Relevance Sorting**: Top results prioritized
### Typical Response Times
- Single source: 50-150ms
- All sources: 100-300ms
- With price filtering: 150-400ms
## Testing
### Manual Testing
```bash
# Test all sources
curl "http://45.61.58.125:7991/api/search/unified?q=hermes"
# Test specific source
curl "http://45.61.58.125:7991/api/search/unified?q=birkin&sources=arbitrage"
# Test price filtering
curl "http://45.61.58.125:7991/api/search/unified?q=chanel&minPrice=1000&maxPrice=5000"
# Test multiple sources
curl "http://45.61.58.125:7991/api/search/unified?q=louis&sources=listings,auctions"
```
### Expected Results
Each test should return:
- ✅ `success: true`
- ✅ Valid `total` count
- ✅ Correct `stats` breakdown
- ✅ Results matching query
- ✅ Proper relevance sorting
## Navigation
The search feature is accessible from:
1. **Main Navigation** - 🔍 Search link in header
2. **Direct URL** - `/search` path
3. **API Endpoint** - `/api/search/unified`
## Future Enhancements
Potential improvements for v2:
1. **Fuzzy Matching** - Handle typos and similar spellings
2. **Saved Searches** - Allow users to save favorite searches
3. **Search History** - Track user search patterns
4. **Advanced Filters** - Color, size, material, year
5. **Sorting Options** - Price, date, relevance, popularity
6. **Export Results** - CSV/JSON export functionality
7. **Search Analytics** - Track popular queries
8. **Auto-Suggestions** - Search term suggestions as user types
## Support
For issues or questions:
- Check logs: `pm2 logs luxvault-web`
- API health: http://45.61.58.125:7991/api/health
- Database status: Check file sizes in `data/` directory
---
**Version:** 1.0.0
**Last Updated:** 2025-11-17
**Author:** Claude AI Assistant