Filtering and Facets
Filters narrow search results to a specific subset of your catalog. Facets return aggregated counts for field values, enabling faceted navigation interfaces where users can refine results by category, brand, price range, and other attributes.
filter_by Parameter
Add a filter_by string to your search request to restrict results. Filters do not affect relevance scoring -- they only include or exclude documents.
Exact Match
filter_by: "brand:Nike"
Numeric Comparison
filter_by: "price:>50"
filter_by: "price:>=50"
filter_by: "price:<200"
filter_by: "price:<=200"
Range
filter_by: "price:[50..200]"
Negation
filter_by: "brand:!Nike"
Multiple Values (OR within a field)
filter_by: "brand:[Nike,Adidas,Puma]"
Boolean Operators
Combine multiple filter clauses with && (AND) or || (OR):
filter_by: "brand:Nike && price:[50..200]"
filter_by: "category:Running || category:Training"
Full Example
curl -X POST https://api.seekora.ai/v1/search \
-H "Content-Type: application/json" \
-H "x-storeid: your-store-id" \
-H "x-storesecret: your-store-secret" \
-d '{
"q": "shoes",
"filter_by": "brand:[Nike,Adidas] && price:[50..200] && in_stock:true",
"per_page": 10
}'
This returns shoes from Nike or Adidas, priced between $50 and $200, that are currently in stock.
Facets
Facets return the distinct values for specified fields along with the count of matching documents for each value. They are essential for building filter sidebars.
facet_by
Pass a comma-separated list of field names to facet_by:
curl -X POST https://api.seekora.ai/v1/search \
-H "Content-Type: application/json" \
-H "x-storeid: your-store-id" \
-H "x-storesecret: your-store-secret" \
-d '{
"q": "shoes",
"facet_by": "brand,category,color",
"max_facet_values": 20
}'
Facet Response
The response includes a facet_counts array alongside the usual hits:
{
"found": 312,
"hits": [ ... ],
"facet_counts": [
{
"field_name": "brand",
"counts": [
{ "value": "Nike", "count": 87 },
{ "value": "Adidas", "count": 64 },
{ "value": "New Balance", "count": 45 },
{ "value": "Puma", "count": 38 }
]
},
{
"field_name": "category",
"counts": [
{ "value": "Running", "count": 120 },
{ "value": "Training", "count": 89 },
{ "value": "Casual", "count": 63 },
{ "value": "Basketball", "count": 40 }
]
},
{
"field_name": "color",
"counts": [
{ "value": "Black", "count": 98 },
{ "value": "White", "count": 76 },
{ "value": "Blue", "count": 52 },
{ "value": "Red", "count": 41 }
]
}
]
}
max_facet_values
Controls how many distinct values are returned per facet. Defaults to 10.
{
"q": "shoes",
"facet_by": "brand",
"max_facet_values": 50
}
Standalone Filter Endpoints
Seekora provides dedicated endpoints for filter-related queries independent of a full search.
POST /v1/filters
Retrieve facet counts without performing a search query. Useful for pre-populating filter sidebars on collection pages.
curl -X POST https://api.seekora.ai/v1/filters \
-H "Content-Type: application/json" \
-H "x-storeid: your-store-id" \
-H "x-storesecret: your-store-secret" \
-d '{
"facet_by": "brand,category,price,color",
"filter_by": "category:Running",
"max_facet_values": 30
}'
POST /v1/filters/{facetName}/values
Retrieve values for a specific facet with typeahead support. This is useful for building searchable dropdowns within a filter panel.
curl -X POST https://api.seekora.ai/v1/filters/brand/values \
-H "Content-Type: application/json" \
-H "x-storeid: your-store-id" \
-H "x-storesecret: your-store-secret" \
-d '{
"q": "ni",
"filter_by": "category:Running"
}'
Response:
{
"values": [
{ "value": "Nike", "count": 87 },
{ "value": "Ninewest", "count": 12 }
]
}
GET /v1/filters/schema
Discover which fields are available for filtering and their types.
curl https://api.seekora.ai/v1/filters/schema \
-H "x-storeid: your-store-id" \
-H "x-storesecret: your-store-secret"
Response:
{
"fields": [
{ "name": "brand", "type": "string", "facet": true },
{ "name": "category", "type": "string", "facet": true },
{ "name": "price", "type": "float", "facet": true },
{ "name": "color", "type": "string", "facet": true },
{ "name": "in_stock", "type": "bool", "facet": false },
{ "name": "rating", "type": "float", "facet": true }
]
}
Combining Filters with Facets
A common pattern is to apply the user's selected filters while still returning facet counts so the sidebar updates dynamically:
curl -X POST https://api.seekora.ai/v1/search \
-H "Content-Type: application/json" \
-H "x-storeid: your-store-id" \
-H "x-storesecret: your-store-secret" \
-d '{
"q": "sneakers",
"filter_by": "brand:Nike && price:[50..150]",
"facet_by": "brand,category,color,price",
"max_facet_values": 20,
"per_page": 12
}'
The facet counts in the response reflect the filtered result set, allowing your UI to show accurate counts for each remaining filter option.
Next Steps
- Sorting and Pagination -- order results and navigate through pages.
- Advanced Search -- typo tolerance, snippets, and more.