Query Rules | Yext Hitchhikers Platform
Query rules allows you to modify search results by adding precise rules. Check out the Query Rules unit for more details.
Search Configuration Schema
Within the Search configuration, the rules
array defines the configuration settings for query rules. Each item in the array is an object that defines the query rule. Refer to the table below for the available fields. View where rules
fits into the configuration in the
Search Config Properties - Top Level
reference doc.
Property | Type | Shown in Config UI | Description |
---|---|---|---|
criteria |
object | Yes | Map of criterion type to value |
actions |
array of objects | Yes | Array of actions |
actionType |
string | Yes | The action type |
name |
string | Yes | (Optional) The display name of the query rule |
See below for the possible options for criteria
and actionType
and the JSON structure for each.
Top-Level JSON
The JSON below is for demonstrative purposes only to show the structure of the rules
object through the top-level properties. Find more detail about each criteria and action option, with sample code snippets, below.
{
"rules": [
{
"criteria": {},
"actions": [
{},
{}
],
"name": "Query Rule 1"
},
{
"criteria": {},
"actions": [
{},
{}
],
"name": "Query Rule 2"
}
],
}
Criteria
The criteria outlines the conditions that need to be met to activate the query rule. All criteria must be met in order for the query rule to trigger. The possible criteria options are listed below:
Property in UI | Property in JSON | Type | Description |
---|---|---|---|
Search Term contains all | searchTermContainsAll |
array of strings | Check for a token match on the search term. If multiple tokens are included, they must all be present in the search term. |
Search Term starts with | searchTermStartsWith |
string | Check if the search term starts with exactly this phrase. |
Search Term ends with | searchTermEndsWith |
string | Check if the search term ends with exactly this phrase. |
Search Term exactly matches | searchTermExactlyMatches |
string | Check if the search term exactly matches this phrase. |
Search Term matches regex | searchTermMatchesRegex |
regular expression | Check if the search term matches this regular expression. |
Context contains | contextContainsKey |
string | Check if the context object contains a certain key. This uses JSONPath. |
Context matches | contextMatches |
object of filters | Check if a property in the context object equals a specific value uses filter syntax . |
Referrer Page URL Regex | referrerPageURLRegex |
regular expression | Check if the referrer page URL, which is the user’s entry point into the Search experience, matches this regular expression. This will stay consistent during their Search session. |
Vertical | verticalKeys |
array of strings | Restrict the rule to only one or more verticals. |
Search Type is | searchTypes |
string | Restrict to just vertical or universal search. The default is all searches. Options are ALL , VERTICAL , or UNIVERSAL . |
Search Term Contains All
Check for a token match on the search term with the criteria searchTermContainsAll
. If multiple tokens are included it will make sure they are all present.
For example, the search query “open jobs for executive chef” would trigger the criteria below:
"criteria": {
"searchTermContainsAll": [
"executive chef",
"open jobs"
]
},
Search Term Starts With
Check if the search term starts with exactly this phrase with the criteria searchTermStartsWith
.
For example, the criteria below checks to see if the search term starts with “How do I”.
"criteria": {
"searchTermStartsWith": "How do I"
},
Search Term Ends With
Check if the search term ends with exactly this phrase with the criteria searchTermEndsWith
.
For example, the criteria below checks to see if the search term ends with the word “test”.
"criteria": {
"searchTermEndsWith": "test",
},
Search Term Exactly Matches
Check if the search term exactly matches this phrase with the criteria searchTermExactlyMatches
.
For example, the criteria below checks to see if the search term is exactly “cancel my account”.
"criteria": {
"searchTermExactlyMatches": "cancel my account",
},
Search Term Matches Regex
Check if the search term matches this regular expression with the criteria searchTermMatchesRegex
.
For example, the criteria below checks whether the query is a phone number with the format ###-###-####. Notice there are extra \
compared to the regex needed (^\d{3}-\d{3}-\d{4}$
) as they are escape symbols to use the \
.
"criteria": {
"searchTermMatchesRegex": "^\\d{3}-\\d{3}-\\d{4}$",
},
Context Contains
Check if the context object contains a certain key with the criteria contextContainsKey
. This criteria uses JSONPath to do the matching. Learn more about JSONPath
here
. Learn how to set the context in the
Search Integration - Setting Context
guide.
For example, let’s say a user has the context below:
{
jobProspect: true,
market: "Mid-Atlantic"
}
The following criteria checks whether the context contains the jobProspect
key, i.e. whether the user is a job prospect because otherwise the key would not be set.
"criteria": {
"contextContainsKey": "$.jobProspect"
},
Context Matches
Check if a property in the context object equals a specific value with the criteria contextMatches
. This criteria uses the filter syntax. Check out the
Entities API documentation
for how to construct filters based on fields. Learn how to set the context in the
Search Integration - Setting Context
guide.
Using the same context above, the following criteria would check that the value of the jobProspect
field equals true
and the market
field equals Mid-Atlantic
.
"criteria": {
"contextMatches": {
"$.jobProspect": {
"$eq": true
},
"$.market": {
"$eq": "Mid-Atlantic"
}
}
},
Referrer Page URL Regex
Check if the referrer page URL, which is the user’s entry point into the Search experience, matches this regular expression with the criteria referrerPageURLRegex
. This will stay consistent during their Search session.
For example, the criteria below checks to see if the user came from the Yext Help site with the domain “help.yext.com”.
"criteria": {
"referrerPageURLRegex": "^.*help.yext.com.*",
},
Vertical
Restrict the rule to only one or more verticals with the criteria verticalKeys
. For example, the criteria below restricts the rule to just the jobs vertical.
"criteria": {
"verticalKeys": [
"jobs"
]
},
Search Type
Restrict to just vertical or universal search with the criteria searchTypes
. The default is all searches. Options are ALL
, VERTICAL
, or UNIVERSAL
.
For example, the criteria below restricts to just universal search.
"criteria": {
"searchTypes": "UNIVERSAL",
},
Actions
Actions will be performed in the order specified.
Property in UI | Property in JSON | Description |
---|---|---|
Boost Entities | BOOST_ENTITIES |
Boost entities to the top of the vertical results. Specify individual entities or in bulk using filter syntax . |
Bury Entities | BURY_ENTITIES |
Bury entities to the bottom of the vertical results. Specify individual entities or in bulk using filter syntax . |
Return No Results | RETURN_NO_RESULTS |
Return no results for a given vertical. |
Add Filter | ADD_FILTER |
Add an additional filter to the search results. Uses filter syntax . |
Boost Verticals | BOOST_VERTICALS |
Boost verticals to the top of the search results page. |
Bury Verticals | BURY_VERTICALS |
Bury verticals to the bottom of the search results page. |
Boost Vertical Intent | BOOST_VERTICAL_INTENT |
Adjust the vertical intent of a query. This can be used to boost or bury entire verticals in universal search. Note: This is being rolled out in favor of the Boost and Bury Verticals rules. |
Return Pinned Result | RETURN_PINNED_RESULT |
Return an exact hardcoded set of results. This will completely override the search algorithm. |
Use Function | USE_FUNCTION |
Run a Typescript function from a Yext plugin on our servers and forward the return value to the front-end. Learn more in the Serverless Functions in Query Rules guide. |
Return Custom Data | RETURN_CUSTOM_DATA |
Return a static JSON blob that signals to the front-end to trigger an action. Learn more in the Serverless Functions in Query Rules guide. |
Boost and Bury Entities
Boost entities to the top of vertical results with the action BOOST_ENTITIES
. Bury entities to the bottom of vertical results with the action BURY_ENTITIES
.
Both the boost entities action and the bury entities action use the following properties. verticalKey
is always required. You can choose to select individual entityIds
or use the filter
property to specify entities in bulk with
filter syntax
.
Property in UI | Property in JSON | Type | Description |
---|---|---|---|
Entities | entityIds |
array of strings | An array of entity IDs to boost or bury. |
Filters | filter |
object of filters | Filter to set of entities using either a saved filter or a Content field using filter syntax . |
Verticals | verticalKey |
string | The vertical that contains these entities. |
(not in UI) | forceResults |
boolean | If true, entities that are not in results will be returned if they are boosted. If false, entities will only be boosted if they are in the results. Defaults to true. |
When configuring the action in JSON, the only difference between boosting and burying entities is whether you set the actionType
as BOOST_ENTITIES
or BURY_ENTITIES
.
Boost entities by specifying entities: In the following example, the Menu Items entity with the ID “NEW-BURRITO” is boosted.
"actions": [
{
"actionType": "BOOST_ENTITIES",
"entityIds": [
"NEW-BURRITO"
],
"verticalKey": "menuItems"
}
]
Boost entities by specifying filters: In the following example, the boosted Menu Item entities are referred to in bulk using the saved filter with ID “1234”. Check out the Entities API documentation for how to construct filters based on fields.
"actions": [
{
"actionType": "BOOST_ENTITIES",
"entityIds": [],
"filter": {
"savedFilterId": {
"$eq": "1234"
}
},
"verticalKey": "menuItems"
}
]
Bury entities by specifying entities: In the following example, the Job entity with ID “job-16” is buried.
"actions": [
{
"actionType": "BURY_ENTITIES",
"entityIds": [
"job-16"
],
"verticalKey": "jobs"
}
]
Bury entities by specifying filters: In the following example, the buried Menu Item entities are selected by filtering on whether the custom field c_oldItem
is set to true. Check out the
Entities API documentation
for how to construct filters based on fields.
"actions": [
{
"actionType": "BURY_ENTITIES",
"entityIds": [],
"filter": {
"c_oldItem": {
"$eq": true
}
},
"verticalKey": "menuItems"
}
]
Return No Results
Return no results for a given vertical with action RETURN_NO_RESULTS
. Only one property is needed to specify the verticals.
Property in UI | Property in JSON | Type | Description |
---|---|---|---|
Verticals | verticals |
array of strings | The vertical(s) to return no results for. |
In the following example, no results are returned for the Jobs vertical.
"actions": [
{
"actionType": "RETURN_NO_RESULTS",
"verticals": [ "jobs" ]
}
]
Add Filter
Add an additional filter to the search results with action ADD_FILTER
. Both properties are required. Check out the
Entities API documentation
for how to construct filters based on fields.
Property in UI | Property in JSON | Type | Description |
---|---|---|---|
Verticals | verticals | array of strings | The vertical(s) affected by the filter. |
Filter | filter | object of filters | The filter to apply. Uses filter syntax . |
In the following example, a saved filter is applied to the FAQs, Jobs, and Locations verticals.
"actions": [
"actionType":"ADD_FILTER",
"verticals": [
"faqs",
"jobs",
"locations"
],
"filter": {
"savedFilterId":{
"$eq":"21466424"
}
}
]
Boost and Bury Verticals
Boost verticals to the top of universal search results with the action BOOST_VERTICALS
. Bury entities to the bottom of universal search results with the action BURY_VERTICALS
.
Both the boost verticals action and the bury verticals action use the following properties only require one property to specify the verticals.
Property in UI | Property in JSON | Type | Description |
---|---|---|---|
Verticals | verticals |
array of strings | The vertical(s) to boost or bury. |
Boost verticals: In the following example, the FAQs and Help Articles verticals are boosted.
"actions": [
{
"actionType": "BOOST_VERTICALS",
"verticals": [
"faqs",
"help_articles"
]
}
]
Bury verticals: In the following example, the Events vertical is buried.
"actions": [
{
"actionType": "BURY_VERTICALS",
"verticals": [
"faqs"
]
}
]
Boost Vertical Intent
Boost vertical intent is our legacy method for boosting and burying verticals in query rules. It is still supported, but may be removed in a future version of Search. Use the “Boost Verticals” and “Bury Verticals” actions instead.
Property in UI | Property in JSON | Type | Description |
---|---|---|---|
Verticals | verticals |
array of strings | The vertical(s) to boost or bury. |
Boost Value | boostValue |
number | Value between -100 and 100 to bury (negative) or boost (positive) verticals by. |
In the following example, the Events vertical is boosted by a value of 5.
"actions": [
{
"actionType": "BOOST_VERTICAL_INTENT",
"boostValue": 5,
"verticals": [
"events"
]
}
]
Return Pinned Result
Return an exact hardcoded set of results with the action RETURN_PINNED_RESULTS
. This will completely override the search algorithm.
For the verticals
object, include each an object for each vertical you want in the results. verticalKey
is always required. For a Yext vertical, you can choose to select individual entityIds
or use the savedFilterId
property to specify entities in bulk with a saved filter. For a vertical that is not powered by the Yext platform, it will show the normal results from that backend – you cannot control the order of the results.
Property in JSON | Type | Description |
---|---|---|
verticals |
array of objects | Defines the behavior of each vertical included in the pinned results. |
verticalKey |
string | The vertical that contains these entities. |
entityIds |
array of strings | An array of entity IDs to include. |
savedFilterId |
string | The saved filter ID to specify entities in bulk. |
directAnswer |
object | A direct answer that should show alongside the entity results. |
entityId |
string | The entity to pull the direct answer from. |
fieldId |
string | The field from the entity to pull the direct answer from. Note that this fieldId must have direct answers enabled. |
verticalKey | string | The vertical to pull the direct answer from. |
In the following example, a pinned result is returned with a direct answer from the name field of an entity in the Doctors vertical. The entity results returned are the Specialties vertical using a saved filter, the FAQs vertical with two entities, and the Links vertical.
"actions": [
"actionType": "RETURN_PINNED_RESULT",
"directAnswer": {
"entityId": "230s",
"fieldId": "name",
"verticalKey": "doctors"
},
"verticals": [
{
"verticalKey": "specialties",
"savedFilterId": "21466424"
},
{
"verticalKey": "faqs",
"entityIds": [
"FAQ-1",
"FAQ-2"
]
},
{
"verticalKey": "links"
}
]
]
Use Function
Run a Typescript function from a Yext plugin on our servers and forward the return value to the front-end with the action USE_FUNCTION
. Learn more in the
Serverless Functions in Query Rules
guide. This action is only available in the JSON editor.
Property in JSON | Type | Description |
---|---|---|
plugin |
string | Collections of TypeScript files that are defined as CaC resources in a Yext account. Each plugin has a unique ID and can contain many functions. |
function |
string | The individual TypeScript function that is triggered by this query rule. |
key |
string | Required for any action that returns data in the API response. This is necessary because the front-end needs to know which action the data came from so that it can react appropriately. |
timeout |
number | Optional timeout, defined in milliseconds. If the function invocation takes any longer than this, the request proceeds without it and adds an indication to the API response that the rule has exceeded the timeout. |
async |
boolean | Optional. Set the action as asynchronous, so that nothing is forwarded to the front-end, and the function is not subject to the normal timeout. |
In the example from the guide, we fetch stock prices. If the stock price meets a certain criteria, we want to use the function fetchStockData
that we wrote, like so:
"actions": [
{
"actionType": "USE_FUNCTION",
"plugin": "stockDataPlugin",
"function": "fetchStockData",
"key": "stockData",
"timeout": 250,
}
]
If we want to make the function async instead of setting a timeout, it would look like:
"actions": [
{
"actionType": "USE_FUNCTION",
"plugin": "stockDataPlugin",
"function": "fetchStockData",
"key": "stockData",
"async": true,
}
]
Return Custom Data
Return a static JSON blob that signals to the front-end to trigger an action with RETURN_CUSTOM_DATA
. Learn more in the
Serverless Functions in Query Rules
guide. This action is only available in the JSON editor.
The RETURN_CUSTOM_DATA
action is somewhat similar to USE_FUNCTION
except it skips the function invocation altogether and just returns some arbitrary JSON to the front-end. This means that we don’t have to worry about errors, timeouts, or asynchronous functions, since we aren’t actually executing any code.
Generally speaking, the JSON data that is returned in these rules will be some indicator that the front-end should perform some action, such as redirecting to another page or fetching from an API on the client-side.
Property in JSON | Type | Description |
---|---|---|
key |
string | Required for any action that returns data in the API response. This is necessary because the front-end needs to know which action the data came from so that it can react appropriately. |
customData |
object | |
action |
string | The action for the frontend to implement. |
In the following example, the action is basically informing the front-end that it should fetch and display the package data, but it’s up to the front-end to actually implement the logic.
"actions": [
{
"actionType": "RETURN_CUSTOM_DATA",
"key": "trackingInfo",
"customData": {
"action": "FETCH_PACKAGE_DATA",
}
}
]