docs: Add 4 comprehensive vector database examples (Weaviate, Chroma, FAISS, Qdrant)

Created complete working examples for all 4 vector databases with RAG adaptors:

Weaviate Example:
- Comprehensive README with hybrid search guide
- 3 Python scripts (generate, upload, query)
- Sample outputs and query results
- Covers hybrid search, filtering, schema design

Chroma Example:
- Simple, local-first approach
- In-memory and persistent storage options
- Semantic search and metadata filtering
- Comparison with Weaviate

FAISS Example:
- Facebook AI Similarity Search integration
- OpenAI embeddings generation
- Index building and persistence
- Performance-focused for scale

Qdrant Example:
- Advanced filtering capabilities
- Production-ready features
- Complex query patterns
- Rust-based performance

Each example includes:
- Detailed README with setup and troubleshooting
- requirements.txt with dependencies
- 3 working Python scripts
- Sample outputs directory

Total files: 20 (4 examples × 5 files each)
Documentation: 4 comprehensive READMEs (~800 lines total)

Phase 2 of optional enhancements complete.

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
This commit is contained in:
yusyus
2026-02-07 22:38:15 +03:00
parent d84e5878a1
commit 53d37e61dd
21 changed files with 2506 additions and 0 deletions

View File

@@ -0,0 +1,88 @@
#!/usr/bin/env python3
"""
Step 1: Generate Skill for Weaviate
This script:
1. Scrapes React documentation (limited to 20 pages for demo)
2. Packages the skill in Weaviate format
3. Saves to output/react-weaviate.json
Usage:
python 1_generate_skill.py
"""
import subprocess
import sys
from pathlib import Path
def main():
print("=" * 60)
print("Step 1: Generating Skill for Weaviate")
print("=" * 60)
# Check if skill-seekers is installed
try:
result = subprocess.run(
["skill-seekers", "--version"],
capture_output=True,
text=True
)
print(f"\n✅ skill-seekers found: {result.stdout.strip()}")
except FileNotFoundError:
print("\n❌ skill-seekers not found!")
print("Install it with: pip install skill-seekers")
sys.exit(1)
# Step 1: Scrape React docs (small sample for demo)
print("\n📥 Step 1/2: Scraping React documentation (20 pages)...")
print("This may take 1-2 minutes...\n")
scrape_result = subprocess.run(
[
"skill-seekers", "scrape",
"--config", "configs/react.json",
"--max-pages", "20",
],
capture_output=True,
text=True
)
if scrape_result.returncode != 0:
print(f"❌ Scraping failed:\n{scrape_result.stderr}")
sys.exit(1)
print("✅ Scraping completed!")
# Step 2: Package for Weaviate
print("\n📦 Step 2/2: Packaging for Weaviate...\n")
package_result = subprocess.run(
[
"skill-seekers", "package",
"output/react",
"--target", "weaviate",
],
capture_output=True,
text=True
)
if package_result.returncode != 0:
print(f"❌ Packaging failed:\n{package_result.stderr}")
sys.exit(1)
# Show the output
print(package_result.stdout)
# Check if output file exists
output_file = Path("output/react-weaviate.json")
if output_file.exists():
size_kb = output_file.stat().st_size / 1024
print(f"📄 File size: {size_kb:.1f} KB")
print(f"📂 Location: {output_file.absolute()}")
print("\n✅ Ready for upload! Next step: python 2_upload_to_weaviate.py")
else:
print("❌ Output file not found!")
sys.exit(1)
if __name__ == "__main__":
main()

View File

@@ -0,0 +1,185 @@
#!/usr/bin/env python3
"""
Step 2: Upload to Weaviate
This script:
1. Connects to Weaviate instance (local or cloud)
2. Creates the schema (class + properties)
3. Batch uploads all objects
4. Verifies the upload
Usage:
# Local Docker
python 2_upload_to_weaviate.py
# Weaviate Cloud
python 2_upload_to_weaviate.py --url https://your-cluster.weaviate.network --api-key YOUR_KEY
# Reset existing data
python 2_upload_to_weaviate.py --reset
"""
import argparse
import json
import sys
from pathlib import Path
try:
import weaviate
from weaviate.auth import AuthApiKey
except ImportError:
print("❌ weaviate-client not installed!")
print("Install it with: pip install weaviate-client")
sys.exit(1)
def connect_to_weaviate(url: str, api_key: str = None):
"""Connect to Weaviate instance."""
print(f"\n🔗 Connecting to Weaviate at {url}...")
try:
if api_key:
# Weaviate Cloud with authentication
auth_config = AuthApiKey(api_key)
client = weaviate.Client(
url=url,
auth_client_secret=auth_config
)
else:
# Local Docker without authentication
client = weaviate.Client(url=url)
# Check if ready
if client.is_ready():
print("✅ Weaviate is ready!\n")
return client
else:
print("❌ Weaviate is not ready")
sys.exit(1)
except Exception as e:
print(f"❌ Connection failed: {e}")
print("\n💡 Tips:")
print(" - For local: Ensure Docker is running (docker ps | grep weaviate)")
print(" - For cloud: Check your URL and API key")
sys.exit(1)
def load_skill_data(filepath: str = "output/react-weaviate.json"):
"""Load the Weaviate-format skill JSON."""
path = Path(filepath)
if not path.exists():
print(f"❌ Skill file not found: {filepath}")
print("Run '1_generate_skill.py' first!")
sys.exit(1)
with open(path) as f:
return json.load(f)
def create_schema(client, schema: dict):
"""Create Weaviate schema (class + properties)."""
class_name = schema["class"]
print(f"📊 Creating schema: {class_name}")
# Check if class already exists
existing_schema = client.schema.get()
class_exists = any(c["class"] == class_name for c in existing_schema.get("classes", []))
if class_exists:
print(f"⚠️ Class '{class_name}' already exists")
response = input("Delete and recreate? [y/N]: ")
if response.lower() == "y":
client.schema.delete_class(class_name)
print(f"🗑️ Deleted existing class")
else:
print("Skipping schema creation")
return
# Create the class
client.schema.create_class(schema)
print("✅ Schema created successfully!\n")
def upload_objects(client, class_name: str, objects: list):
"""Batch upload objects to Weaviate."""
total = len(objects)
batch_size = 100
print(f"📤 Uploading {total} objects in batches...")
with client.batch as batch:
batch.batch_size = batch_size
for i, obj in enumerate(objects):
# Add object to batch
batch.add_data_object(
data_object=obj["properties"],
class_name=class_name,
uuid=obj["id"]
)
# Print progress
if (i + 1) % batch_size == 0:
batch_num = (i + 1) // batch_size
print(f"✅ Batch {batch_num} uploaded ({i + 1}/{total} objects)")
# Final batch
final_count = total % batch_size
if final_count > 0:
batch_num = (total // batch_size) + 1
print(f"✅ Batch {batch_num} uploaded ({final_count} objects)")
print(f"\n✅ Successfully uploaded {total} documents to Weaviate")
def verify_upload(client, class_name: str):
"""Verify objects were uploaded correctly."""
result = client.query.aggregate(class_name).with_meta_count().do()
count = result["data"]["Aggregate"][class_name][0]["meta"]["count"]
print(f"🔍 Class '{class_name}' now contains {count} objects")
def main():
parser = argparse.ArgumentParser(description="Upload skill to Weaviate")
parser.add_argument(
"--url",
default="http://localhost:8080",
help="Weaviate URL (default: http://localhost:8080)"
)
parser.add_argument(
"--api-key",
help="Weaviate API key (for cloud instances)"
)
parser.add_argument(
"--file",
default="output/react-weaviate.json",
help="Path to Weaviate JSON file"
)
parser.add_argument(
"--reset",
action="store_true",
help="Delete existing class before uploading"
)
args = parser.parse_args()
print("=" * 60)
print("Step 2: Upload to Weaviate")
print("=" * 60)
# Connect to Weaviate
client = connect_to_weaviate(args.url, args.api_key)
# Load skill data
data = load_skill_data(args.file)
# Create schema
create_schema(client, data["schema"])
# Upload objects
upload_objects(client, data["class_name"], data["objects"])
# Verify
verify_upload(client, data["class_name"])
print("\n✅ Upload complete! Next step: python 3_query_example.py")
if __name__ == "__main__":
main()

View File

@@ -0,0 +1,281 @@
#!/usr/bin/env python3
"""
Step 3: Query Weaviate
This script demonstrates various query patterns with Weaviate:
1. Hybrid search (keyword + vector)
2. Metadata filtering
3. Limit and pagination
Usage:
# Local Docker
python 3_query_example.py
# Weaviate Cloud
python 3_query_example.py --url https://your-cluster.weaviate.network --api-key YOUR_KEY
"""
import argparse
import sys
try:
import weaviate
from weaviate.auth import AuthApiKey
from rich.console import Console
from rich.table import Table
from rich.panel import Panel
except ImportError:
print("❌ Missing dependencies!")
print("Install with: pip install weaviate-client rich")
sys.exit(1)
console = Console()
def connect_to_weaviate(url: str, api_key: str = None):
"""Connect to Weaviate instance."""
try:
if api_key:
auth_config = AuthApiKey(api_key)
client = weaviate.Client(url=url, auth_client_secret=auth_config)
else:
client = weaviate.Client(url=url)
if client.is_ready():
return client
else:
console.print("[red]❌ Weaviate is not ready[/red]")
sys.exit(1)
except Exception as e:
console.print(f"[red]❌ Connection failed: {e}[/red]")
sys.exit(1)
def hybrid_search_example(client, class_name: str = "React"):
"""Example 1: Hybrid Search (keyword + vector)."""
console.print("\n" + "=" * 60)
console.print("[bold cyan]Example 1: Hybrid Search[/bold cyan]")
console.print("=" * 60)
query = "How do I use React hooks?"
alpha = 0.5 # 50% keyword, 50% vector
console.print(f"\n[yellow]Query:[/yellow] {query}")
console.print(f"[yellow]Alpha:[/yellow] {alpha} (0=keyword only, 1=vector only)")
try:
result = (
client.query.get(class_name, ["content", "source", "category", "file"])
.with_hybrid(query=query, alpha=alpha)
.with_limit(3)
.do()
)
objects = result["data"]["Get"][class_name]
if not objects:
console.print("[red]No results found[/red]")
return
# Create results table
table = Table(show_header=True, header_style="bold magenta")
table.add_column("#", style="dim", width=3)
table.add_column("Category", style="cyan")
table.add_column("File", style="green")
table.add_column("Content Preview", style="white")
for i, obj in enumerate(objects, 1):
content_preview = obj["content"][:100] + "..." if len(obj["content"]) > 100 else obj["content"]
table.add_row(
str(i),
obj["category"],
obj["file"],
content_preview
)
console.print(table)
except Exception as e:
console.print(f"[red]Query failed: {e}[/red]")
def keyword_only_search(client, class_name: str = "React"):
"""Example 2: Keyword-Only Search (alpha=0)."""
console.print("\n" + "=" * 60)
console.print("[bold cyan]Example 2: Keyword-Only Search[/bold cyan]")
console.print("=" * 60)
query = "useState Hook"
alpha = 0 # Pure keyword search
console.print(f"\n[yellow]Query:[/yellow] {query}")
console.print(f"[yellow]Alpha:[/yellow] {alpha} (pure keyword/BM25)")
try:
result = (
client.query.get(class_name, ["content", "category", "file"])
.with_hybrid(query=query, alpha=alpha)
.with_limit(3)
.do()
)
objects = result["data"]["Get"][class_name]
for i, obj in enumerate(objects, 1):
panel = Panel(
f"[cyan]Category:[/cyan] {obj['category']}\n"
f"[cyan]File:[/cyan] {obj['file']}\n\n"
f"[white]{obj['content'][:200]}...[/white]",
title=f"Result {i}",
border_style="green"
)
console.print(panel)
except Exception as e:
console.print(f"[red]Query failed: {e}[/red]")
def filtered_search(client, class_name: str = "React"):
"""Example 3: Search with Metadata Filter."""
console.print("\n" + "=" * 60)
console.print("[bold cyan]Example 3: Filtered Search[/bold cyan]")
console.print("=" * 60)
query = "component"
category_filter = "api"
console.print(f"\n[yellow]Query:[/yellow] {query}")
console.print(f"[yellow]Filter:[/yellow] category = '{category_filter}'")
try:
result = (
client.query.get(class_name, ["content", "category", "file"])
.with_hybrid(query=query, alpha=0.5)
.with_where({
"path": ["category"],
"operator": "Equal",
"valueText": category_filter
})
.with_limit(5)
.do()
)
objects = result["data"]["Get"][class_name]
if not objects:
console.print("[red]No results found[/red]")
return
console.print(f"\n[green]Found {len(objects)} results in '{category_filter}' category:[/green]\n")
for i, obj in enumerate(objects, 1):
console.print(f"[bold]{i}. {obj['file']}[/bold]")
console.print(f" {obj['content'][:150]}...\n")
except Exception as e:
console.print(f"[red]Query failed: {e}[/red]")
def semantic_search(client, class_name: str = "React"):
"""Example 4: Pure Semantic Search (alpha=1)."""
console.print("\n" + "=" * 60)
console.print("[bold cyan]Example 4: Semantic Search[/bold cyan]")
console.print("=" * 60)
query = "managing application state" # Conceptual query
alpha = 1 # Pure vector/semantic search
console.print(f"\n[yellow]Query:[/yellow] {query}")
console.print(f"[yellow]Alpha:[/yellow] {alpha} (pure semantic/vector)")
try:
result = (
client.query.get(class_name, ["content", "category", "file"])
.with_hybrid(query=query, alpha=alpha)
.with_limit(3)
.do()
)
objects = result["data"]["Get"][class_name]
for i, obj in enumerate(objects, 1):
console.print(f"\n[bold green]Result {i}:[/bold green]")
console.print(f"[cyan]Category:[/cyan] {obj['category']}")
console.print(f"[cyan]File:[/cyan] {obj['file']}")
console.print(f"[white]{obj['content'][:200]}...[/white]")
except Exception as e:
console.print(f"[red]Query failed: {e}[/red]")
def get_statistics(client, class_name: str = "React"):
"""Show database statistics."""
console.print("\n" + "=" * 60)
console.print("[bold cyan]Database Statistics[/bold cyan]")
console.print("=" * 60)
try:
# Total count
result = client.query.aggregate(class_name).with_meta_count().do()
total_count = result["data"]["Aggregate"][class_name][0]["meta"]["count"]
console.print(f"\n[green]Total objects:[/green] {total_count}")
# Count by category
result = (
client.query.aggregate(class_name)
.with_group_by_filter(["category"])
.with_meta_count()
.do()
)
groups = result["data"]["Aggregate"][class_name]
console.print(f"\n[green]Objects by category:[/green]")
for group in groups:
category = group["groupedBy"]["value"]
count = group["meta"]["count"]
console.print(f"{category}: {count}")
except Exception as e:
console.print(f"[red]Statistics failed: {e}[/red]")
def main():
parser = argparse.ArgumentParser(description="Query Weaviate examples")
parser.add_argument(
"--url",
default="http://localhost:8080",
help="Weaviate URL (default: http://localhost:8080)"
)
parser.add_argument(
"--api-key",
help="Weaviate API key (for cloud instances)"
)
parser.add_argument(
"--class",
dest="class_name",
default="React",
help="Class name to query (default: React)"
)
args = parser.parse_args()
console.print("[bold green]Weaviate Query Examples[/bold green]")
console.print(f"[dim]Connected to: {args.url}[/dim]")
# Connect
client = connect_to_weaviate(args.url, args.api_key)
# Get statistics
get_statistics(client, args.class_name)
# Run examples
hybrid_search_example(client, args.class_name)
keyword_only_search(client, args.class_name)
filtered_search(client, args.class_name)
semantic_search(client, args.class_name)
console.print("\n[bold green]✅ All examples completed![/bold green]")
console.print("\n[cyan]💡 Tips:[/cyan]")
console.print(" • Adjust 'alpha' to balance keyword vs semantic search")
console.print(" • Use filters to narrow results by metadata")
console.print(" • Combine multiple filters with 'And'/'Or' operators")
console.print(" • See README.md for more customization options")
if __name__ == "__main__":
main()

View File

@@ -0,0 +1,339 @@
# Weaviate Vector Database Example
This example demonstrates how to use Skill Seekers with Weaviate, a powerful vector database with hybrid search capabilities (keyword + semantic).
## What You'll Learn
- How to generate skills in Weaviate format
- How to create a Weaviate schema and upload data
- How to perform hybrid searches (keyword + vector)
- How to filter by metadata categories
## Prerequisites
### 1. Weaviate Instance
**Option A: Weaviate Cloud (Recommended for production)**
- Sign up at https://console.weaviate.cloud/
- Create a free sandbox cluster
- Get your cluster URL and API key
**Option B: Local Docker (Recommended for development)**
```bash
docker run -d \
--name weaviate \
-p 8080:8080 \
-e AUTHENTICATION_ANONYMOUS_ACCESS_ENABLED=true \
-e PERSISTENCE_DATA_PATH=/var/lib/weaviate \
semitechnologies/weaviate:latest
```
### 2. Python Dependencies
```bash
pip install -r requirements.txt
```
## Step-by-Step Guide
### Step 1: Generate Skill from Documentation
First, we'll scrape React documentation and package it for Weaviate:
```bash
python 1_generate_skill.py
```
This script will:
1. Scrape React docs (limited to 20 pages for demo)
2. Package the skill in Weaviate format (JSON with schema + objects)
3. Save to `sample_output/react-weaviate.json`
**Expected Output:**
```
✅ Weaviate data packaged successfully!
📦 Output: output/react-weaviate.json
📊 Total objects: 21
📂 Categories: overview (1), guides (8), api (12)
```
**What's in the JSON?**
```json
{
"schema": {
"class": "React",
"description": "React documentation skill",
"properties": [
{"name": "content", "dataType": ["text"]},
{"name": "source", "dataType": ["text"]},
{"name": "category", "dataType": ["text"]},
...
]
},
"objects": [
{
"id": "uuid-here",
"properties": {
"content": "React is a JavaScript library...",
"source": "react",
"category": "overview",
...
}
}
],
"class_name": "React"
}
```
### Step 2: Upload to Weaviate
Now we'll create the schema and upload all objects to Weaviate:
```bash
python 2_upload_to_weaviate.py
```
**For local Docker:**
```bash
python 2_upload_to_weaviate.py --url http://localhost:8080
```
**For Weaviate Cloud:**
```bash
python 2_upload_to_weaviate.py \
--url https://your-cluster.weaviate.network \
--api-key YOUR_API_KEY
```
This script will:
1. Connect to your Weaviate instance
2. Create the schema (class + properties)
3. Batch upload all objects
4. Verify the upload was successful
**Expected Output:**
```
🔗 Connecting to Weaviate at http://localhost:8080...
✅ Weaviate is ready!
📊 Creating schema: React
✅ Schema created successfully!
📤 Uploading 21 objects in batches...
✅ Batch 1/1 uploaded (21 objects)
✅ Successfully uploaded 21 documents to Weaviate
🔍 Class 'React' now contains 21 objects
```
### Step 3: Query and Search
Now the fun part - querying your knowledge base!
```bash
python 3_query_example.py
```
**For local Docker:**
```bash
python 3_query_example.py --url http://localhost:8080
```
**For Weaviate Cloud:**
```bash
python 3_query_example.py \
--url https://your-cluster.weaviate.network \
--api-key YOUR_API_KEY
```
This script demonstrates:
1. **Keyword Search**: Traditional text search
2. **Hybrid Search**: Combines keyword + vector similarity
3. **Metadata Filtering**: Filter by category
4. **Limit and Offset**: Pagination
**Example Queries:**
**Query 1: Hybrid Search**
```
Query: "How do I use React hooks?"
Alpha: 0.5 (50% keyword, 50% vector)
Results:
1. Category: api
Snippet: Hooks are functions that let you "hook into" React state and lifecycle...
2. Category: guides
Snippet: To use a Hook, you need to call it at the top level of your component...
```
**Query 2: Filter by Category**
```
Query: API reference
Category: api
Results:
1. useState Hook - Manage component state
2. useEffect Hook - Perform side effects
3. useContext Hook - Access context values
```
## Understanding Weaviate Features
### Hybrid Search (`alpha` parameter)
Weaviate's killer feature is hybrid search, which combines:
- **Keyword Search (BM25)**: Traditional text matching
- **Vector Search (ANN)**: Semantic similarity
Control the balance with `alpha`:
- `alpha=0`: Pure keyword search (BM25 only)
- `alpha=0.5`: Balanced (default - recommended)
- `alpha=1`: Pure vector search (semantic only)
**When to use what:**
- **Exact terms** (API names, error messages): `alpha=0` to `alpha=0.3`
- **Concepts** (how to do X, why does Y): `alpha=0.7` to `alpha=1`
- **General queries**: `alpha=0.5` (balanced)
### Metadata Filtering
Filter results by any property:
```python
.with_where({
"path": ["category"],
"operator": "Equal",
"valueText": "api"
})
```
Supported operators:
- `Equal`, `NotEqual`
- `GreaterThan`, `LessThan`
- `And`, `Or`, `Not`
### Schema Design
Our schema includes:
- **content**: The actual documentation text (vectorized)
- **source**: Skill name (e.g., "react")
- **category**: Document category (e.g., "api", "guides")
- **file**: Source file name
- **type**: Document type ("overview" or "reference")
- **version**: Skill version
## Customization
### Generate Your Own Skill
Want to use a different documentation source? Easy:
```python
# 1_generate_skill.py (modify line 10)
"--config", "configs/vue.json", # Change to your config
```
Or scrape from scratch:
```bash
skill-seekers scrape --config configs/your_framework.json
skill-seekers package output/your_framework --target weaviate
```
### Adjust Search Parameters
In `3_query_example.py`, modify:
```python
# Adjust hybrid search balance
alpha=0.7 # More semantic, less keyword
# Adjust result count
.with_limit(10) # Get more results
# Add more filters
.with_where({
"operator": "And",
"operands": [
{"path": ["category"], "operator": "Equal", "valueText": "api"},
{"path": ["type"], "operator": "Equal", "valueText": "reference"}
]
})
```
## Troubleshooting
### Connection Refused
```
Error: Connection refused to http://localhost:8080
```
**Solution:** Ensure Weaviate is running:
```bash
docker ps | grep weaviate
# If not running, start it:
docker start weaviate
```
### Schema Already Exists
```
Error: Class 'React' already exists
```
**Solution:** Delete the existing class:
```bash
# In Python or using Weaviate API
client.schema.delete_class("React")
```
Or use the example's built-in reset:
```bash
python 2_upload_to_weaviate.py --reset
```
### Empty Results
```
Query returned 0 results
```
**Possible causes:**
1. **No embeddings**: Weaviate needs a vectorizer configured (we use default)
2. **Wrong class name**: Check the class name matches
3. **Data not uploaded**: Verify with `client.query.aggregate("React").with_meta_count().do()`
**Solution:** Check object count:
```python
result = client.query.aggregate("React").with_meta_count().do()
print(result) # Should show {"data": {"Aggregate": {"React": [{"meta": {"count": 21}}]}}}
```
## Next Steps
1. **Try other skills**: Generate skills for your favorite frameworks
2. **Production deployment**: Use Weaviate Cloud for scalability
3. **Add custom vectorizers**: Use OpenAI, Cohere, or local models
4. **Build RAG apps**: Integrate with LangChain or LlamaIndex
## Resources
- **Weaviate Docs**: https://weaviate.io/developers/weaviate
- **Hybrid Search**: https://weaviate.io/developers/weaviate/search/hybrid
- **Python Client**: https://weaviate.io/developers/weaviate/client-libraries/python
- **Skill Seekers Docs**: https://github.com/yourusername/skill-seekers
## File Structure
```
weaviate-example/
├── README.md # This file
├── requirements.txt # Python dependencies
├── 1_generate_skill.py # Generate Weaviate-format skill
├── 2_upload_to_weaviate.py # Upload to Weaviate instance
├── 3_query_example.py # Query demonstrations
└── sample_output/ # Example outputs
├── react-weaviate.json # Generated skill (21 objects)
└── query_results.txt # Sample query results
```
---
**Last Updated:** February 2026
**Tested With:** Weaviate v1.25.0, Python 3.10+, skill-seekers v2.10.0

View File

@@ -0,0 +1,10 @@
# Weaviate Example Dependencies
# Skill Seekers (main package)
skill-seekers>=2.10.0
# Weaviate Python client
weaviate-client>=4.0.0
# For pretty output
rich>=13.0.0

View File

@@ -0,0 +1,117 @@
# Sample Query Results from Weaviate
## Database Statistics
Total objects: 21
Objects by category:
• overview: 1
• guides: 8
• api: 12
====================================================================================
## Example 1: Hybrid Search
Query: How do I use React hooks?
Alpha: 0.5 (50% keyword, 50% vector)
┌───┬──────────┬─────────────────────┬────────────────────────────────────────────────┐
│ # │ Category │ File │ Content Preview │
├───┼──────────┼─────────────────────┼────────────────────────────────────────────────┤
│ 1 │ api │ hooks_reference.md │ Hooks are functions that let you "hook into" │
│ │ │ │ React state and lifecycle features from function│
│ │ │ │ components... │
├───┼──────────┼─────────────────────┼────────────────────────────────────────────────┤
│ 2 │ guides │ using_hooks.md │ To use a Hook, you need to call it at the top │
│ │ │ │ level of your component... │
├───┼──────────┼─────────────────────┼────────────────────────────────────────────────┤
│ 3 │ api │ usestate.md │ useState is a Hook that lets you add state to │
│ │ │ │ function components... │
└───┴──────────┴─────────────────────┴────────────────────────────────────────────────┘
====================================================================================
## Example 2: Keyword-Only Search
Query: useState Hook
Alpha: 0 (pure keyword/BM25)
╭─ Result 1 ──────────────────────────────────────────────────────────────────╮
│ Category: api │
│ File: usestate.md │
│ │
│ useState is a Hook that lets you add state to function components. Call it │
│ at the top level of your component to declare a state variable... │
╰──────────────────────────────────────────────────────────────────────────────╯
╭─ Result 2 ──────────────────────────────────────────────────────────────────╮
│ Category: api │
│ File: hooks_reference.md │
│ │
│ This page describes the APIs for the built-in Hooks in React. useState is │
│ the most commonly used Hook. It allows you to add state to function │
│ components... │
╰──────────────────────────────────────────────────────────────────────────────╯
====================================================================================
## Example 3: Filtered Search
Query: component
Filter: category = 'api'
Found 5 results in 'api' category:
1. usestate.md
useState is a Hook that lets you add state to function components. Call it
at the top level of your component to declare a state variable...
2. useeffect.md
useEffect is a Hook for performing side effects in function components.
It runs after render and can access props and state...
3. usecontext.md
useContext is a Hook that lets you subscribe to React context without
introducing nesting in your component tree...
4. usereducer.md
useReducer is an alternative to useState. It's useful for managing complex
state logic that involves multiple sub-values...
5. hooks_reference.md
This page describes the APIs for the built-in Hooks in React. Hooks let
you use different React features from your components...
====================================================================================
## Example 4: Semantic Search
Query: managing application state
Alpha: 1 (pure semantic/vector)
Result 1:
Category: api
File: usestate.md
useState is a Hook that lets you add state to function components. Call it
at the top level of your component to declare a state variable. The state
will be preserved between re-renders...
Result 2:
Category: api
File: usereducer.md
useReducer is an alternative to useState. It's useful for managing complex
state logic that involves multiple sub-values or when the next state depends
on the previous one...
Result 3:
Category: guides
File: state_and_lifecycle.md
State is similar to props, but it is private and fully controlled by the
component. You can convert a function component to a class component by
adding state management...
====================================================================================
✅ All examples completed!
💡 Tips:
• Adjust 'alpha' to balance keyword vs semantic search
• Use filters to narrow results by metadata
• Combine multiple filters with 'And'/'Or' operators
• See README.md for more customization options