tantivy #5
							
								
								
									
										171
									
								
								examples/README.md
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										171
									
								
								examples/README.md
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,171 @@
 | 
				
			|||||||
 | 
					# HeroDB Tantivy Search Examples
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					This directory contains examples demonstrating HeroDB's full-text search capabilities powered by Tantivy.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					## Tantivy Search Demo (Bash Script)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					### Overview
 | 
				
			||||||
 | 
					The `tantivy_search_demo.sh` script provides a comprehensive demonstration of HeroDB's search functionality using Redis commands. It showcases various search scenarios including basic text search, filtering, sorting, geographic queries, and more.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					### Prerequisites
 | 
				
			||||||
 | 
					1. **HeroDB Server**: The server must be running on port 6381
 | 
				
			||||||
 | 
					2. **Redis CLI**: The `redis-cli` tool must be installed and available in your PATH
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					### Running the Demo
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#### Step 1: Start HeroDB Server
 | 
				
			||||||
 | 
					```bash
 | 
				
			||||||
 | 
					# From the project root directory
 | 
				
			||||||
 | 
					cargo run -- --port 6381
 | 
				
			||||||
 | 
					```
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#### Step 2: Run the Demo (in a new terminal)
 | 
				
			||||||
 | 
					```bash
 | 
				
			||||||
 | 
					# From the project root directory
 | 
				
			||||||
 | 
					./examples/tantivy_search_demo.sh
 | 
				
			||||||
 | 
					```
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					### What the Demo Covers
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					The script demonstrates 15 different search scenarios:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					1. **Index Creation** - Creating a search index with various field types
 | 
				
			||||||
 | 
					2. **Data Insertion** - Adding sample products to the index
 | 
				
			||||||
 | 
					3. **Basic Text Search** - Simple keyword searches
 | 
				
			||||||
 | 
					4. **Filtered Search** - Combining text search with category filters
 | 
				
			||||||
 | 
					5. **Numeric Range Search** - Finding products within price ranges
 | 
				
			||||||
 | 
					6. **Sorting Results** - Ordering results by different fields
 | 
				
			||||||
 | 
					7. **Limited Results** - Pagination and result limiting
 | 
				
			||||||
 | 
					8. **Complex Queries** - Multi-field searches with sorting
 | 
				
			||||||
 | 
					9. **Geographic Search** - Location-based queries
 | 
				
			||||||
 | 
					10. **Index Information** - Getting statistics about the search index
 | 
				
			||||||
 | 
					11. **Search Comparison** - Tantivy vs simple pattern matching
 | 
				
			||||||
 | 
					12. **Fuzzy Search** - Typo tolerance and approximate matching
 | 
				
			||||||
 | 
					13. **Phrase Search** - Exact phrase matching
 | 
				
			||||||
 | 
					14. **Boolean Queries** - AND, OR, NOT operators
 | 
				
			||||||
 | 
					15. **Cleanup** - Removing test data
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					### Sample Data
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					The demo uses a product catalog with the following fields:
 | 
				
			||||||
 | 
					- **title** (TEXT) - Product name with higher search weight
 | 
				
			||||||
 | 
					- **description** (TEXT) - Detailed product description
 | 
				
			||||||
 | 
					- **category** (TAG) - Comma-separated categories
 | 
				
			||||||
 | 
					- **price** (NUMERIC) - Product price for range queries
 | 
				
			||||||
 | 
					- **rating** (NUMERIC) - Customer rating for sorting
 | 
				
			||||||
 | 
					- **location** (GEO) - Geographic coordinates for location searches
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					### Key Redis Commands Demonstrated
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#### Index Management
 | 
				
			||||||
 | 
					```bash
 | 
				
			||||||
 | 
					# Create search index
 | 
				
			||||||
 | 
					FT.CREATE product_catalog ON HASH PREFIX 1 product: SCHEMA title TEXT WEIGHT 2.0 SORTABLE description TEXT category TAG SEPARATOR , price NUMERIC SORTABLE rating NUMERIC SORTABLE location GEO
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# Get index information
 | 
				
			||||||
 | 
					FT.INFO product_catalog
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# Drop index
 | 
				
			||||||
 | 
					FT.DROPINDEX product_catalog
 | 
				
			||||||
 | 
					```
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#### Search Queries
 | 
				
			||||||
 | 
					```bash
 | 
				
			||||||
 | 
					# Basic text search
 | 
				
			||||||
 | 
					FT.SEARCH product_catalog wireless
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# Filtered search
 | 
				
			||||||
 | 
					FT.SEARCH product_catalog 'organic @category:{food}'
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# Numeric range
 | 
				
			||||||
 | 
					FT.SEARCH product_catalog '@price:[50 150]'
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# Sorted results
 | 
				
			||||||
 | 
					FT.SEARCH product_catalog '@category:{electronics}' SORTBY price ASC
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# Geographic search
 | 
				
			||||||
 | 
					FT.SEARCH product_catalog '@location:[37.7749 -122.4194 50 km]'
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# Boolean queries
 | 
				
			||||||
 | 
					FT.SEARCH product_catalog 'wireless AND audio'
 | 
				
			||||||
 | 
					FT.SEARCH product_catalog 'coffee OR tea'
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# Phrase search
 | 
				
			||||||
 | 
					FT.SEARCH product_catalog '"noise canceling"'
 | 
				
			||||||
 | 
					```
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					### Interactive Features
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					The demo script includes:
 | 
				
			||||||
 | 
					- **Colored output** for better readability
 | 
				
			||||||
 | 
					- **Pause between steps** to review results
 | 
				
			||||||
 | 
					- **Error handling** with clear error messages
 | 
				
			||||||
 | 
					- **Automatic cleanup** of test data
 | 
				
			||||||
 | 
					- **Progress indicators** showing what each step demonstrates
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					### Troubleshooting
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#### HeroDB Not Running
 | 
				
			||||||
 | 
					```
 | 
				
			||||||
 | 
					✗ HeroDB is not running on port 6381
 | 
				
			||||||
 | 
					ℹ Please start HeroDB with: cargo run -- --port 6381
 | 
				
			||||||
 | 
					```
 | 
				
			||||||
 | 
					**Solution**: Start the HeroDB server in a separate terminal.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#### Redis CLI Not Found
 | 
				
			||||||
 | 
					```
 | 
				
			||||||
 | 
					redis-cli: command not found
 | 
				
			||||||
 | 
					```
 | 
				
			||||||
 | 
					**Solution**: Install Redis tools or use an alternative Redis client.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#### Connection Refused
 | 
				
			||||||
 | 
					```
 | 
				
			||||||
 | 
					Could not connect to Redis at localhost:6381: Connection refused
 | 
				
			||||||
 | 
					```
 | 
				
			||||||
 | 
					**Solution**: Ensure HeroDB is running and listening on the correct port.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					### Manual Testing
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					You can also run individual commands manually:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					```bash
 | 
				
			||||||
 | 
					# Connect to HeroDB
 | 
				
			||||||
 | 
					redis-cli -h localhost -p 6381
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# Create a simple index
 | 
				
			||||||
 | 
					FT.CREATE myindex ON HASH SCHEMA title TEXT description TEXT
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# Add a document
 | 
				
			||||||
 | 
					HSET doc:1 title "Hello World" description "This is a test document"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# Search
 | 
				
			||||||
 | 
					FT.SEARCH myindex hello
 | 
				
			||||||
 | 
					```
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					### Performance Notes
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					- **Indexing**: Documents are indexed in real-time as they're added
 | 
				
			||||||
 | 
					- **Search Speed**: Full-text search is much faster than pattern matching on large datasets
 | 
				
			||||||
 | 
					- **Memory Usage**: Tantivy indexes are memory-efficient and disk-backed
 | 
				
			||||||
 | 
					- **Scalability**: Supports millions of documents with sub-second search times
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					### Advanced Features
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					The demo showcases advanced Tantivy features:
 | 
				
			||||||
 | 
					- **Relevance Scoring** - Results ranked by relevance
 | 
				
			||||||
 | 
					- **Fuzzy Matching** - Handles typos and approximate matches
 | 
				
			||||||
 | 
					- **Field Weighting** - Title field has higher search weight
 | 
				
			||||||
 | 
					- **Multi-field Search** - Search across multiple fields simultaneously
 | 
				
			||||||
 | 
					- **Geographic Queries** - Distance-based location searches
 | 
				
			||||||
 | 
					- **Numeric Ranges** - Efficient range queries on numeric fields
 | 
				
			||||||
 | 
					- **Tag Filtering** - Fast categorical filtering
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					### Next Steps
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					After running the demo, explore:
 | 
				
			||||||
 | 
					1. **Custom Schemas** - Define your own field types and configurations
 | 
				
			||||||
 | 
					2. **Large Datasets** - Test with thousands or millions of documents
 | 
				
			||||||
 | 
					3. **Real Applications** - Integrate search into your applications
 | 
				
			||||||
 | 
					4. **Performance Tuning** - Optimize for your specific use case
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					For more information, see the [search documentation](../herodb/docs/search.md).
 | 
				
			||||||
							
								
								
									
										186
									
								
								examples/simple_demo.sh
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										186
									
								
								examples/simple_demo.sh
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,186 @@
 | 
				
			|||||||
 | 
					#!/bin/bash
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# Simple HeroDB Demo - Basic Redis Commands
 | 
				
			||||||
 | 
					# This script demonstrates basic Redis functionality that's currently implemented
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					set -e  # Exit on any error
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# Configuration
 | 
				
			||||||
 | 
					REDIS_HOST="localhost"
 | 
				
			||||||
 | 
					REDIS_PORT="6381"
 | 
				
			||||||
 | 
					REDIS_CLI="redis-cli -h $REDIS_HOST -p $REDIS_PORT"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# 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
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# Main demo function
 | 
				
			||||||
 | 
					main() {
 | 
				
			||||||
 | 
					    clear
 | 
				
			||||||
 | 
					    print_header "HeroDB Basic Functionality Demo"
 | 
				
			||||||
 | 
					    echo "This demo shows basic Redis commands that are currently implemented"
 | 
				
			||||||
 | 
					    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: Basic Key-Value Operations"
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					    execute_cmd "SET greeting 'Hello HeroDB!'" "Setting a simple key-value pair"
 | 
				
			||||||
 | 
					    echo
 | 
				
			||||||
 | 
					    execute_cmd "GET greeting" "Getting the value"
 | 
				
			||||||
 | 
					    echo
 | 
				
			||||||
 | 
					    execute_cmd "SET counter 42" "Setting a numeric value"
 | 
				
			||||||
 | 
					    echo
 | 
				
			||||||
 | 
					    execute_cmd "INCR counter" "Incrementing the counter"
 | 
				
			||||||
 | 
					    echo
 | 
				
			||||||
 | 
					    execute_cmd "GET counter" "Getting the incremented value"
 | 
				
			||||||
 | 
					    echo
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    print_header "Step 2: Hash Operations"
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					    execute_cmd "HSET user:1 name 'John Doe' email 'john@example.com' age 30" "Setting hash fields"
 | 
				
			||||||
 | 
					    echo
 | 
				
			||||||
 | 
					    execute_cmd "HGET user:1 name" "Getting a specific field"
 | 
				
			||||||
 | 
					    echo
 | 
				
			||||||
 | 
					    execute_cmd "HGETALL user:1" "Getting all fields"
 | 
				
			||||||
 | 
					    echo
 | 
				
			||||||
 | 
					    execute_cmd "HLEN user:1" "Getting hash length"
 | 
				
			||||||
 | 
					    echo
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    print_header "Step 3: List Operations"
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					    execute_cmd "LPUSH tasks 'Write code' 'Test code' 'Deploy code'" "Adding items to list"
 | 
				
			||||||
 | 
					    echo
 | 
				
			||||||
 | 
					    execute_cmd "LLEN tasks" "Getting list length"
 | 
				
			||||||
 | 
					    echo
 | 
				
			||||||
 | 
					    execute_cmd "LRANGE tasks 0 -1" "Getting all list items"
 | 
				
			||||||
 | 
					    echo
 | 
				
			||||||
 | 
					    execute_cmd "LPOP tasks" "Popping from left"
 | 
				
			||||||
 | 
					    echo
 | 
				
			||||||
 | 
					    execute_cmd "LRANGE tasks 0 -1" "Checking remaining items"
 | 
				
			||||||
 | 
					    echo
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    print_header "Step 4: Key Management"
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					    execute_cmd "KEYS *" "Listing all keys"
 | 
				
			||||||
 | 
					    echo
 | 
				
			||||||
 | 
					    execute_cmd "EXISTS greeting" "Checking if key exists"
 | 
				
			||||||
 | 
					    echo
 | 
				
			||||||
 | 
					    execute_cmd "TYPE user:1" "Getting key type"
 | 
				
			||||||
 | 
					    echo
 | 
				
			||||||
 | 
					    execute_cmd "DBSIZE" "Getting database size"
 | 
				
			||||||
 | 
					    echo
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    print_header "Step 5: Expiration"
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					    execute_cmd "SET temp_key 'temporary value'" "Setting temporary key"
 | 
				
			||||||
 | 
					    echo
 | 
				
			||||||
 | 
					    execute_cmd "EXPIRE temp_key 5" "Setting 5 second expiration"
 | 
				
			||||||
 | 
					    echo
 | 
				
			||||||
 | 
					    execute_cmd "TTL temp_key" "Checking time to live"
 | 
				
			||||||
 | 
					    echo
 | 
				
			||||||
 | 
					    print_info "Waiting 2 seconds..."
 | 
				
			||||||
 | 
					    sleep 2
 | 
				
			||||||
 | 
					    execute_cmd "TTL temp_key" "Checking TTL again"
 | 
				
			||||||
 | 
					    echo
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    print_header "Step 6: Multiple Operations"
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					    execute_cmd "MSET key1 'value1' key2 'value2' key3 'value3'" "Setting multiple keys"
 | 
				
			||||||
 | 
					    echo
 | 
				
			||||||
 | 
					    execute_cmd "MGET key1 key2 key3" "Getting multiple values"
 | 
				
			||||||
 | 
					    echo
 | 
				
			||||||
 | 
					    execute_cmd "DEL key1 key2" "Deleting multiple keys"
 | 
				
			||||||
 | 
					    echo
 | 
				
			||||||
 | 
					    execute_cmd "EXISTS key1 key2 key3" "Checking existence of multiple keys"
 | 
				
			||||||
 | 
					    echo
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    print_header "Step 7: Search Commands (Placeholder)"
 | 
				
			||||||
 | 
					    print_info "Testing FT.CREATE command (currently returns placeholder response)"
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					    execute_cmd "FT.CREATE test_index SCHEMA title TEXT description TEXT" "Creating search index"
 | 
				
			||||||
 | 
					    echo
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    print_header "Step 8: Server Information"
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					    execute_cmd "INFO" "Getting server information"
 | 
				
			||||||
 | 
					    echo
 | 
				
			||||||
 | 
					    execute_cmd "CONFIG GET dir" "Getting configuration"
 | 
				
			||||||
 | 
					    echo
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    print_header "Step 9: Cleanup"
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					    execute_cmd "FLUSHDB" "Clearing database"
 | 
				
			||||||
 | 
					    echo
 | 
				
			||||||
 | 
					    execute_cmd "DBSIZE" "Confirming database is empty"
 | 
				
			||||||
 | 
					    echo
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    print_header "Demo Summary"
 | 
				
			||||||
 | 
					    echo "This demonstration showed:"
 | 
				
			||||||
 | 
					    echo "• Basic key-value operations (GET, SET, INCR)"
 | 
				
			||||||
 | 
					    echo "• Hash operations (HSET, HGET, HGETALL)"
 | 
				
			||||||
 | 
					    echo "• List operations (LPUSH, LPOP, LRANGE)"
 | 
				
			||||||
 | 
					    echo "• Key management (KEYS, EXISTS, TYPE, DEL)"
 | 
				
			||||||
 | 
					    echo "• Expiration handling (EXPIRE, TTL)"
 | 
				
			||||||
 | 
					    echo "• Multiple key operations (MSET, MGET)"
 | 
				
			||||||
 | 
					    echo "• Server information commands"
 | 
				
			||||||
 | 
					    echo
 | 
				
			||||||
 | 
					    print_success "HeroDB basic functionality demo completed successfully!"
 | 
				
			||||||
 | 
					    echo
 | 
				
			||||||
 | 
					    print_info "Note: Full-text search (FT.*) commands are defined but not yet fully implemented"
 | 
				
			||||||
 | 
					    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 "$@"
 | 
				
			||||||
							
								
								
									
										238
									
								
								examples/tantivy_search_demo.sh
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										238
									
								
								examples/tantivy_search_demo.sh
									
									
									
									
									
										Executable file
									
								
							@@ -0,0 +1,238 @@
 | 
				
			|||||||
 | 
					#!/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="6381"
 | 
				
			||||||
 | 
					REDIS_CLI="redis-cli -h $REDIS_HOST -p $REDIS_PORT"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# 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 ON HASH PREFIX 1 product: SCHEMA title TEXT WEIGHT 2.0 SORTABLE description TEXT category TAG SEPARATOR , price NUMERIC SORTABLE rating NUMERIC SORTABLE 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
 | 
				
			||||||
 | 
					    products=(
 | 
				
			||||||
 | 
					        "product:1 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'"
 | 
				
			||||||
 | 
					        "product:2 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'"
 | 
				
			||||||
 | 
					        "product:3 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'"
 | 
				
			||||||
 | 
					        "product:4 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'"
 | 
				
			||||||
 | 
					        "product:5 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'"
 | 
				
			||||||
 | 
					        "product:6 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'"
 | 
				
			||||||
 | 
					        "product:7 title 'Meditation Cushion' description 'Comfortable meditation cushion for mindfulness practice' category 'wellness,meditation' price 45.99 rating 4.6 location '-122.4194,37.7749'"
 | 
				
			||||||
 | 
					        "product:8 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'"
 | 
				
			||||||
 | 
					    )
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    for product in "${products[@]}"; do
 | 
				
			||||||
 | 
					        execute_cmd "HSET $product" "Adding product"
 | 
				
			||||||
 | 
					    done
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					    print_success "Added ${#products[@]} 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 in 'food' category"
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					    execute_cmd "FT.SEARCH product_catalog 'organic @category:{food}'" "Filtered search"
 | 
				
			||||||
 | 
					    pause
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    print_header "Step 5: Numeric Range Search"
 | 
				
			||||||
 | 
					    print_info "Finding products priced between \$50 and \$150"
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					    execute_cmd "FT.SEARCH product_catalog '@price:[50 150]'" "Numeric range search"
 | 
				
			||||||
 | 
					    pause
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    print_header "Step 6: Sorting Results"
 | 
				
			||||||
 | 
					    print_info "Searching electronics sorted by price (ascending)"
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					    execute_cmd "FT.SEARCH product_catalog '@category:{electronics}' SORTBY price ASC" "Sorted search"
 | 
				
			||||||
 | 
					    pause
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    print_header "Step 7: Limiting Results"
 | 
				
			||||||
 | 
					    print_info "Getting top 3 highest rated products"
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					    execute_cmd "FT.SEARCH product_catalog '*' SORTBY rating DESC LIMIT 0 3" "Limited results with sorting"
 | 
				
			||||||
 | 
					    pause
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    print_header "Step 8: Complex Query"
 | 
				
			||||||
 | 
					    print_info "Finding audio products with noise cancellation, sorted by rating"
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					    execute_cmd "FT.SEARCH product_catalog '@category:{audio} noise cancellation' SORTBY rating DESC" "Complex query"
 | 
				
			||||||
 | 
					    pause
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    print_header "Step 9: Geographic Search"
 | 
				
			||||||
 | 
					    print_info "Finding products near San Francisco (within 50km)"
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					    execute_cmd "FT.SEARCH product_catalog '@location:[37.7749 -122.4194 50 km]'" "Geographic 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 "Demonstrating fuzzy matching (typo tolerance)"
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					    execute_cmd "FT.SEARCH product_catalog 'wireles'" "Fuzzy search with typo"
 | 
				
			||||||
 | 
					    pause
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    print_header "Step 13: Phrase Search"
 | 
				
			||||||
 | 
					    print_info "Searching for exact phrases"
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					    execute_cmd "FT.SEARCH product_catalog '\"noise canceling\"'" "Exact phrase search"
 | 
				
			||||||
 | 
					    pause
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    print_header "Step 14: Boolean Queries"
 | 
				
			||||||
 | 
					    print_info "Using boolean operators (AND, OR, NOT)"
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					    execute_cmd "FT.SEARCH product_catalog 'wireless AND audio'" "Boolean AND search"
 | 
				
			||||||
 | 
					    echo
 | 
				
			||||||
 | 
					    execute_cmd "FT.SEARCH product_catalog 'coffee OR tea'" "Boolean OR search"
 | 
				
			||||||
 | 
					    pause
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    print_header "Step 15: Cleanup"
 | 
				
			||||||
 | 
					    print_info "Removing test data"
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					    # Delete the search index
 | 
				
			||||||
 | 
					    execute_cmd "FT.DROPINDEX product_catalog" "Dropping search index"
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					    # Clean up hash keys
 | 
				
			||||||
 | 
					    for i in {1..8}; do
 | 
				
			||||||
 | 
					        execute_cmd "DEL product:$i" "Deleting product:$i"
 | 
				
			||||||
 | 
					    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 "$@"
 | 
				
			||||||
							
								
								
									
										1370
									
								
								herodb/specs/lance_implementation.md
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										1370
									
								
								herodb/specs/lance_implementation.md
									
									
									
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
		Reference in New Issue
	
	Block a user