To learn more about the difference between filters and facets, read our blog post.
Filters allow users to filter search results based on a condition.
You can use filters in a few ways:
- Static filters which allow end-users to filter content after entering a search query.
- Dynamic filters (also referred to as facets), which are generated based on the values of the search result set.
- Filter results using filter expressions. In this case, the end-users will always see the filtered results.
1. Static filters
Static filters can be applied when a user interacts with a UI component (e.g. a tab-filter, radio buttons, or checkboxes). You can set up tab filters easily when you generate a Search Interface in the console.
As an example use case, you can provide users with preset tab filters to filter different domains (blog, news, docs). Another example use case is to create filters to allow users to based on rating (1-5 stars).
2. Dynamic filters
Dynamic filters (also referred to as facets) are generated based on the values of the search result set. Learn more about dynamic filters (or facets).
You can also allow users to select multiple options in the search UI for both static and dynamic filters. A typical use-case of multiple fields is an e-commerce store, where a user enters a search term, select multiple brands, and then filter price range. View the React SDK documentation to set up multi-select facets or filters.
3. Filter results using filter expressions
You can use filter expressions to filter content when making a search request.
As an example, if you are looking to filter out specific sections of a website, you can use filter to remove a specific section (e.g. you can filter out a blog section by using
dir1!='blog'). You can also test the filter expressions in our Preview section as well, refer to this documentation for more details.
If you are using our Website Search Integration, see more details down below.
Note: If you used a generated code from the Integrate section of your Console, you are also using Website Search Integration.
Filters are used to limit the results that are returned with a search. In a search interface filters are commonly seen as tabs, checkboxes, or sliders on the side.
To make filtering easier, our crawler extracts common fields when it crawls web pages (such as the first and second directories of URLs).
Aside from commonly used fields like title, description and og:image our crawler also extracts other fields which can be useful for filtering. Here are some examples that assume that the page URL is
urlThe full page URL:
dir1The first directory of the page URL: blog
dir2The second directory of the page URL: year-in-review
domainThe domain of the page URL:
langThe language of the page, extracted from the
<html>element (if present).
When querying a field, there are a few operators that can be used. Note, all
values must be enclosed in single quotation marks, i.e. "field boost must be
greater than 10" is written as
|Equal To (||Field is equal to a value (numeric or string)|
|Not Equal To (||Field is not equal to a value (numeric or string)|
|Greater Than (||Field is greater than a numeric value|
|Greater Than Or Equal To (||Field is greater than or equal to a numeric value|
|Less Than (||Field is less than a given numeric value|
|Less Than Or Equal To (||Field is less than or equal to a given numeric value|
|Begins With (||Field begins with a string|
|Ends With (||Field ends with a string|
|Contains (||Field contains a string|
|Does Not Contain (||Field does not contain a string|
It's also possible to build more complex filters by combining field filter
OR operators, and brackets.
|Both expressions must match|
|One expression must match|
For example, to match pages with language set to
www.sajari.com or any
page within the
(domain='www.sajari.com' AND lang='en') OR domain='en.sajari.com'
Some filters are difficult to express in boolean logic. For these there are filter functions that are utilised to create filters for you. They can also be part of larger boolean expressions.
Checking for existance or non-existance
field is NULL
field is NOT NULL
Filtering based on geo distance
GEO_INSIDE(latitude, longitude, lat_var, lng_var, radius)
TRUE if the input geopoint
lat_var, lng_var is within the haversine radius (in kilometres) of the
latitude, longitude geopoint on the record.
Note: there is also a
geo_boost step that can be used to boost results based on their geo distance as opposed to filtering as per above.
Time based filtering
TRUE if the timestamp
field is at most
duration from the current time.
A duration string is a signed sequence of decimal numbers, each with optional fraction and a unit suffix, such as "300ms", "-1.5h" or "2h45m". Valid time units are "ns", "us" (or "µs"), "ms", "s", "m", "h". So for example to filter records within 1 day of their timestamp
field you could use
Handling sub variants
TRUE for records where repeated fields have an offset matching the
For example, if a record had 3 variants of a product with varying price, color and size. These variants could be stored in three array based fields and the
ARRAY_MATCH() filter function could be used to evaluate each offset in these fields collectively as if they were singular. To illustrate this, if we had the following product indexed:
|title||No||Air jordan shoes|
|color||Yes||red, red, white|
|size||Yes||13, 14, 13|
|price||Yes||122.00, 122.00, 130.00|
If we were to search using the filter function
ARRAY_MATCH(size = 14 AND color = 'white'), this would look at each offset in the
color arrays respectively and evaluate the values like they were singular. In this case each of the offsets does not match the filter and
FALSE would be returned for this function when evaluating this record.
This filter function is a powerful way to handle variants. Some common examples are price variations (i.e. volume based price breaks) and automotive parts (parts can match many makes and models).