Skip to content

Hybrid Search

Hybrid search in Quiver combines vector similarity search with metadata filtering to provide more precise and contextual search results.

Overview

Hybrid search allows you to:

  • Perform vector similarity search
  • Filter results based on metadata
  • Combine multiple search criteria
  • Optimize search performance

How It Works

  1. Vector similarity search is performed first
  2. Results are filtered based on metadata criteria
  3. Final results are ranked and returned

Basic Usage

// Perform a hybrid search with metadata filter
results, err := idx.SearchWithFilter(
    queryVector,    // Your query vector
    10,            // Number of results
    "SELECT * FROM metadata WHERE json->>'category' = 'electronics'"
)

Advanced Filtering

// Complex metadata query
query := `
    SELECT * FROM metadata 
    WHERE json->>'price'::float < 1000 
    AND json->>'category' = 'electronics'
    AND json->>'in_stock'::boolean = true
`

results, err := idx.SearchWithFilter(queryVector, 10, query)

Quiver supports faceted search through metadata:

// Search with facets
facets := map[string]string{
    "category": "electronics",
    "brand": "example"
}

results, err := idx.FacetedSearch(queryVector, 10, facets)

Performance Optimization

Index Optimization

  • Use appropriate HNSW parameters
  • Configure metadata indexing
  • Optimize batch sizes

Query Optimization

  • Write efficient metadata queries
  • Use appropriate filters
  • Balance precision and recall

Best Practices

  1. Metadata Structure
  2. Design metadata schema carefully
  3. Use consistent data types
  4. Index frequently queried fields

  5. Query Design

  6. Start with broad filters
  7. Refine based on results
  8. Monitor query performance

  9. Result Handling

  10. Implement pagination
  11. Cache frequent queries
  12. Handle edge cases

Examples

// Search for similar products within price range
query := `
    SELECT * FROM metadata 
    WHERE json->>'price'::float BETWEEN 100 AND 500
    AND json->>'category' = 'electronics'
`

results, err := idx.SearchWithFilter(
    productVector,
    20,  // top 20 results
    query
)

Content Recommendation

// Find similar content with specific tags
query := `
    SELECT * FROM metadata 
    WHERE json->>'content_type' = 'article'
    AND json->>'tags' LIKE '%technology%'
`

results, err := idx.SearchWithFilter(
    contentVector,
    5,  // top 5 results
    query
)

Advanced Features

Negative Examples

// Search with positive and negative examples
results, err := idx.SearchWithNegatives(
    positiveVector,
    [][]float32{negativeVector1, negativeVector2},
    10,  // k results
    1,   // page
    10,  // page size
)
// Search with multiple query vectors
results, err := idx.MultiVectorSearch(
    [][]float32{vector1, vector2},
    10,  // k results per query
)

Error Handling

results, err := idx.SearchWithFilter(queryVector, 10, query)
if err != nil {
    switch {
    case errors.Is(err, ErrInvalidQuery):
        // Handle invalid query
    case errors.Is(err, ErrNoResults):
        // Handle no results
    default:
        // Handle other errors
    }
}

Next Steps