Combine must, should, and must-not filter types to create complex queries. This approach handles scenarios requiring strict requirements, flexible alternatives, and explicit exclusions.
Before you begin, make sure you have a running VectorAI DB instance and a products collection with 128-dimensional vectors and payload fields: category (string), price (float), rating (float), and condition (string).
from actian_vectorai import VectorAIClient, FilterBuilder, Field
import random
# Connect to VectorAI DB server
with VectorAIClient("localhost:50051") as client:
# Generate query vector
query_vector = [random.gauss(0, 1) for _ in range(128)]
# Must be electronics
# Should be either cheap OR highly rated
# Must NOT be refurbished
filter = FilterBuilder()\
.must(Field("category").eq("electronics"))\
.should(Field("price").lt(50.0))\
.should(Field("rating").gt(4.0))\
.must_not(Field("condition").eq("refurbished"))\
.build()
# Search with combined filters
results = client.points.search(
"products", # Collection name
vector=query_vector, # Query vector
limit=10, # Maximum results
filter=filter # Apply filter
)
# Display results
for result in results:
print(f"Category: {result.payload['category']}")
print(f"Price: ${result.payload['price']}")
print(f"Rating: {result.payload.get('rating', 'N/A')}")
print("-" * 50)
Each result includes these fields:
id: The unique identifier of the matching point.
score: Similarity score based on vector distance.
payload: Full metadata dictionary for the matching point.