← back to Handbag Authentication
scripts/setup-search.sql
146 lines
-- Setup Full-Text Search for LUXVAULT Database
-- This script creates comprehensive search capabilities for all data
-- Create Full-Text Search virtual table for listings
CREATE VIRTUAL TABLE IF NOT EXISTS listings_fts USING fts5(
external_id,
source,
title,
brand,
model,
condition,
location,
seller_name,
description,
size,
color,
material,
content=listings,
content_rowid=id
);
-- Populate the FTS table with existing data
INSERT OR REPLACE INTO listings_fts (
external_id, source, title, brand, model,
condition, location, seller_name, description,
size, color, material
)
SELECT
external_id, source, title, brand, model,
condition, location, seller_name, description,
size, color, material
FROM listings;
-- Create triggers to keep FTS in sync
CREATE TRIGGER IF NOT EXISTS listings_ai
AFTER INSERT ON listings
BEGIN
INSERT INTO listings_fts (
external_id, source, title, brand, model,
condition, location, seller_name, description,
size, color, material
) VALUES (
new.external_id, new.source, new.title, new.brand, new.model,
new.condition, new.location, new.seller_name, new.description,
new.size, new.color, new.material
);
END;
CREATE TRIGGER IF NOT EXISTS listings_ad
AFTER DELETE ON listings
BEGIN
DELETE FROM listings_fts WHERE rowid = old.id;
END;
CREATE TRIGGER IF NOT EXISTS listings_au
AFTER UPDATE ON listings
BEGIN
UPDATE listings_fts SET
external_id = new.external_id,
source = new.source,
title = new.title,
brand = new.brand,
model = new.model,
condition = new.condition,
location = new.location,
seller_name = new.seller_name,
description = new.description,
size = new.size,
color = new.color,
material = new.material
WHERE rowid = new.id;
END;
-- Create comprehensive indexes for fast searching
CREATE INDEX IF NOT EXISTS idx_listings_brand_model ON listings(brand, model);
CREATE INDEX IF NOT EXISTS idx_listings_price_range ON listings(price_usd, price_jpy);
CREATE INDEX IF NOT EXISTS idx_listings_condition ON listings(condition);
CREATE INDEX IF NOT EXISTS idx_listings_source ON listings(source);
CREATE INDEX IF NOT EXISTS idx_listings_crawled ON listings(crawled_at);
CREATE INDEX IF NOT EXISTS idx_listings_size ON listings(size);
CREATE INDEX IF NOT EXISTS idx_listings_color ON listings(color);
CREATE INDEX IF NOT EXISTS idx_listings_material ON listings(material);
CREATE INDEX IF NOT EXISTS idx_listings_seller ON listings(seller_name);
CREATE INDEX IF NOT EXISTS idx_listings_location ON listings(location);
-- Create a view for easy searching with all data
CREATE VIEW IF NOT EXISTS searchable_listings AS
SELECT
l.id,
l.external_id,
l.source,
l.title,
l.brand,
l.model,
l.size,
l.color,
l.material,
l.price_jpy,
l.price_usd,
l.condition,
l.image_url,
l.thumbnail_url,
l.product_url,
l.listing_type,
l.auction_end_date,
l.location,
l.seller_name,
l.description,
l.crawled_at,
da.deal_percentage,
da.avg_us_price,
da.is_deal,
CASE
WHEN l.image_url IS NOT NULL THEN 'Yes'
ELSE 'No'
END as has_image
FROM listings l
LEFT JOIN deal_analysis da ON l.id = da.listing_id;
-- Add metadata table for tracking searches
CREATE TABLE IF NOT EXISTS search_history (
id INTEGER PRIMARY KEY AUTOINCREMENT,
search_query TEXT NOT NULL,
results_count INTEGER,
search_type TEXT,
searched_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
-- Create a table for image metadata
CREATE TABLE IF NOT EXISTS image_metadata (
id INTEGER PRIMARY KEY AUTOINCREMENT,
listing_id INTEGER,
image_url TEXT,
thumbnail_url TEXT,
image_hash TEXT,
image_size INTEGER,
has_logo INTEGER DEFAULT 0,
primary_color TEXT,
indexed_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
FOREIGN KEY(listing_id) REFERENCES listings(id) ON DELETE CASCADE
);
-- Index for image searching
CREATE INDEX IF NOT EXISTS idx_image_url ON image_metadata(image_url);
CREATE INDEX IF NOT EXISTS idx_image_hash ON image_metadata(image_hash);
CREATE INDEX IF NOT EXISTS idx_image_color ON image_metadata(primary_color);