In addition to providing an input vector to your query, you can also filter by vector metadata associated with every vector. Query results only include vectors that match filter criteria, meaning that filter is applied first, and topK results are taken from the filtered set.
By using metadata filtering to limit the scope of a query, you can filter by specific customer IDs, tenant, product category or any other metadata you associate with your vectors.
Limits
You can store up to 10KiB of metadata per vector, and create up to 10 metadata indexes per Vectorize index.
For metadata indexes of type number, the indexed number precision is that of float64.
For metadata indexes of type string, each vector indexes the first 64B of the string data truncated on UTF-8 character boundaries to the longest well-formed UTF-8 substring within that limit, so vectors are filterable on the first 64B of their value for each indexed property.
Optional filter property on query() method specifies metadata filter:
Operator
Description
$eq
Equals
$ne
Not equals
filter must be non-empty object whose compact JSON representation must be less than 2048 bytes.
filter object keys cannot be empty, contain " | . (dot is reserved for nesting), start with $, or be longer than 512 characters.
filter object non-nested values can be string, number, boolean, or null values.
Namespace versus metadata filtering
Both namespaces and metadata filtering narrow the vector search space for a query. Consider the following when evaluating both filter types:
A namespace filter is applied before metadata filter(s).
A vector can only be part of a single namespace with the documented limits. Vector metadata can contain multiple key-value pairs up to metadata per vector limits. Metadata values support different types (string, boolean, and others), therefore offering more flexibility.