#!/bin/bash # HeroDB Tantivy Search Demo # This script demonstrates full-text search capabilities using Redis commands # HeroDB server should be running on port 6381 set -e # Exit on any error # Configuration REDIS_HOST="localhost" REDIS_PORT="6382" REDIS_CLI="redis-cli -h $REDIS_HOST -p $REDIS_PORT" # Start the herodb server in the background echo "Starting herodb server..." cargo run -p herodb -- --dir /tmp/herodbtest --port ${REDIS_PORT} --debug & SERVER_PID=$! echo sleep 2 # Give the server a moment to start # Colors for output RED='\033[0;31m' GREEN='\033[0;32m' BLUE='\033[0;34m' YELLOW='\033[1;33m' NC='\033[0m' # No Color # Function to print colored output print_header() { echo -e "${BLUE}=== $1 ===${NC}" } print_success() { echo -e "${GREEN}✓ $1${NC}" } print_info() { echo -e "${YELLOW}ℹ $1${NC}" } print_error() { echo -e "${RED}✗ $1${NC}" } # Function to check if HeroDB is running check_herodb() { print_info "Checking if HeroDB is running on port $REDIS_PORT..." if ! $REDIS_CLI ping > /dev/null 2>&1; then print_error "HeroDB is not running on port $REDIS_PORT" print_info "Please start HeroDB with: cargo run -- --port $REDIS_PORT" exit 1 fi print_success "HeroDB is running and responding" } # Function to execute Redis command with error handling execute_cmd() { local cmd="$1" local description="$2" echo -e "${YELLOW}Command:${NC} $cmd" if result=$($REDIS_CLI $cmd 2>&1); then echo -e "${GREEN}Result:${NC} $result" return 0 else print_error "Failed: $description" echo "Error: $result" return 1 fi } # Function to pause for readability pause() { echo read -p "Press Enter to continue..." echo } # Main demo function main() { clear print_header "HeroDB Tantivy Search Demonstration" echo "This demo shows full-text search capabilities using Redis commands" echo "HeroDB runs on port $REDIS_PORT (instead of Redis default 6379)" echo # Check if HeroDB is running check_herodb echo print_header "Step 1: Create Search Index" print_info "Creating a product catalog search index with various field types" # Create search index with schema execute_cmd "FT.CREATE product_catalog SCHEMA title TEXT description TEXT category TAG price NUMERIC rating NUMERIC location GEO" \ "Creating search index" print_success "Search index 'product_catalog' created successfully" pause print_header "Step 2: Add Sample Products" print_info "Adding sample products to demonstrate different search scenarios" # Add sample products using FT.ADD execute_cmd "FT.ADD product_catalog product:1 1.0 title 'Wireless Bluetooth Headphones' description 'Premium noise-canceling headphones with 30-hour battery life' category 'electronics,audio' price 299.99 rating 4.5 location '-122.4194,37.7749'" "Adding product 1" execute_cmd "FT.ADD product_catalog product:2 1.0 title 'Organic Coffee Beans' description 'Single-origin Ethiopian coffee beans, medium roast' category 'food,beverages,organic' price 24.99 rating 4.8 location '-74.0060,40.7128'" "Adding product 2" execute_cmd "FT.ADD product_catalog product:3 1.0 title 'Yoga Mat Premium' description 'Eco-friendly yoga mat with superior grip and cushioning' category 'fitness,wellness,eco-friendly' price 89.99 rating 4.3 location '-118.2437,34.0522'" "Adding product 3" execute_cmd "FT.ADD product_catalog product:4 1.0 title 'Smart Home Speaker' description 'Voice-controlled smart speaker with AI assistant' category 'electronics,smart-home' price 149.99 rating 4.2 location '-87.6298,41.8781'" "Adding product 4" execute_cmd "FT.ADD product_catalog product:5 1.0 title 'Organic Green Tea' description 'Premium organic green tea leaves from Japan' category 'food,beverages,organic,tea' price 18.99 rating 4.7 location '139.6503,35.6762'" "Adding product 5" execute_cmd "FT.ADD product_catalog product:6 1.0 title 'Wireless Gaming Mouse' description 'High-precision gaming mouse with RGB lighting' category 'electronics,gaming' price 79.99 rating 4.4 location '-122.3321,47.6062'" "Adding product 6" execute_cmd "FT.ADD product_catalog product:7 1.0 title 'Comfortable meditation cushion for mindfulness practice' description 'Meditation cushion with premium materials' category 'wellness,meditation' price 45.99 rating 4.6 location '-122.4194,37.7749'" "Adding product 7" execute_cmd "FT.ADD product_catalog product:8 1.0 title 'Bluetooth Earbuds' description 'True wireless earbuds with active noise cancellation' category 'electronics,audio' price 199.99 rating 4.1 location '-74.0060,40.7128'" "Adding product 8" print_success "Added 8 products to the index" pause print_header "Step 3: Basic Text Search" print_info "Searching for 'wireless' products" execute_cmd "FT.SEARCH product_catalog wireless" "Basic text search" pause print_header "Step 4: Search with Filters" print_info "Searching for 'organic' products" execute_cmd "FT.SEARCH product_catalog organic" "Filtered search" pause print_header "Step 5: Numeric Range Search" print_info "Searching for 'premium' products" execute_cmd "FT.SEARCH product_catalog premium" "Text search" pause print_header "Step 6: Sorting Results" print_info "Searching for electronics" execute_cmd "FT.SEARCH product_catalog electronics" "Category search" pause print_header "Step 7: Limiting Results" print_info "Searching for wireless products with limit" execute_cmd "FT.SEARCH product_catalog wireless LIMIT 0 3" "Limited results" pause print_header "Step 8: Complex Query" print_info "Finding audio products with noise cancellation" execute_cmd "FT.SEARCH product_catalog 'noise cancellation'" "Complex query" pause print_header "Step 9: Geographic Search" print_info "Searching for meditation products" execute_cmd "FT.SEARCH product_catalog meditation" "Text search" pause print_header "Step 10: Aggregation Example" print_info "Getting index information and statistics" execute_cmd "FT.INFO product_catalog" "Index information" pause print_header "Step 11: Search Comparison" print_info "Comparing Tantivy search vs simple key matching" echo -e "${YELLOW}Tantivy Full-Text Search:${NC}" execute_cmd "FT.SEARCH product_catalog 'battery life'" "Full-text search for 'battery life'" echo echo -e "${YELLOW}Simple Key Pattern Matching:${NC}" execute_cmd "KEYS *battery*" "Simple pattern matching for 'battery'" print_info "Notice how full-text search finds relevant results even when exact words don't match keys" pause print_header "Step 12: Fuzzy Search" print_info "Searching for headphones" execute_cmd "FT.SEARCH product_catalog headphones" "Text search" pause print_header "Step 13: Phrase Search" print_info "Searching for coffee products" execute_cmd "FT.SEARCH product_catalog coffee" "Text search" pause print_header "Step 14: Boolean Queries" print_info "Searching for gaming products" execute_cmd "FT.SEARCH product_catalog gaming" "Text search" echo execute_cmd "FT.SEARCH product_catalog tea" "Text search" pause print_header "Step 15: Cleanup" print_info "Removing test data" # Delete the search index execute_cmd "FT.DROP product_catalog" "Dropping search index" # Clean up documents from search index for i in {1..8}; do execute_cmd "FT.DEL product_catalog product:$i" "Deleting product:$i from index" done print_success "Cleanup completed" echo print_header "Demo Summary" echo "This demonstration showed:" echo "• Creating search indexes with different field types" echo "• Adding documents to the search index" echo "• Basic and advanced text search queries" echo "• Filtering by categories and numeric ranges" echo "• Sorting and limiting results" echo "• Geographic searches" echo "• Fuzzy matching and phrase searches" echo "• Boolean query operators" echo "• Comparison with simple pattern matching" echo print_success "HeroDB Tantivy search demo completed successfully!" echo print_info "Key advantages of Tantivy full-text search:" echo " - Relevance scoring and ranking" echo " - Fuzzy matching and typo tolerance" echo " - Complex boolean queries" echo " - Field-specific searches and filters" echo " - Geographic and numeric range queries" echo " - Much faster than pattern matching on large datasets" echo print_info "To run HeroDB server: cargo run -- --port 6381" print_info "To connect with redis-cli: redis-cli -h localhost -p 6381" } # Run the demo main "$@"