Search Config
The search config defines the behavior of a search app. It is configured per search app in the admin and contains settings for results, facets, sorting, spellcheck, validation, and more.
Validation
The validation section configures request validation rules that are evaluated by the QscSearchRequestValidationFilter in the search pipeline. These rules are merged with any rules defined in the pipeline YAML.
{
"validation": {
"rules": [
"q: required, minLength=1, maxLength=500",
"page: min=0, max=100, default=1",
"rows: min=0, max=100, default=10",
"parameter.customerId: required, type=integer"
]
}
}
Rule Syntax
Each rule is a string with the format:
target: constraint1, constraint2, ...
| Category | Format | Description |
|---|---|---|
| Field | fieldName: constraints | Validates a standard search query field (q, locale, page, rows, requestId, userId, sessionId, requestOrigin) |
| Parameter | parameter.name: constraints | Validates a parameter from the parameters map |
| Filter | filter.id: constraints | Validates a search filter from the filter list |
Available Constraints
Fields:
| Constraint | Description | Example |
|---|---|---|
required | Must be non-null and non-blank | q: required |
values | Must be one of the listed values (separated by |) | locale: values=de|en|fr |
minLength | Minimum string length | q: minLength=1 |
maxLength | Maximum string length | q: maxLength=500 |
min | Minimum numeric value | page: min=0 |
max | Maximum numeric value | page: max=100 |
default | Default value if null | page: default=1 |
Parameters:
| Constraint | Description | Example |
|---|---|---|
required | Must be present | parameter.customerId: required |
values | Must be one of the listed values (separated by |) | parameter.sort: values=relevance|price|name |
type | Data type: string, integer, long, double, boolean | parameter.limit: type=integer |
type (array) | Append [] to require an array; each element is type-checked | parameter.ids: type=integer[] |
pattern | Regex match (applied per element for arrays) | parameter.email: pattern=^[\w@.]+$ |
default | Default value if missing | parameter.sort: default=relevance |
Filters:
| Constraint | Description | Example |
|---|---|---|
required | Must be present | filter.category: required |
values | Every filter value must be one of the listed values (separated by |) | filter.color: values=red|green|blue |
type | Expected filter type | filter.category: type=term |
dataType | Expected data type | filter.price: dataType=number |
default | Creates filter with this value if missing | filter.status: default=active |
defaultType | Default filter type if null | filter.price: defaultType=range |
defaultDataType | Default data type if null | filter.price: defaultDataType=number |
defaultOperator | Default operator if null | filter.category: defaultOperator=and |
Options (on any rule):
| Option | Description | Example |
|---|---|---|
statusCode | HTTP status code (default: 400) | statusCode=422 |
message | Custom error message (must be last) | message=Custom error text |
Pipeline vs Search Config Rules
Rules can be defined in both places:
| Source | Scope | Use case |
|---|---|---|
| Pipeline YAML | All search apps | Shared base rules (e.g. required fields, paging limits) |
| Search config | Per search app | App-specific rules (e.g. required parameters, custom limits) |
Pipeline rules run first, then search config rules. Both use the same string syntax.
Example
Pipeline YAML (shared):
rules:
- "locale: required, values=de|en|fr"
- "q: required"
- "page: min=0, default=1"
- "rows: min=0, default=10"
Search config (per app):
{
"validation": {
"rules": [
"q: minLength=3, message=Please enter at least 3 characters",
"rows: max=50",
"parameter.customerId: required, type=integer",
"parameter.sort: values=relevance|price|name, default=relevance",
"parameter.ids: type=integer[]",
"filter.color: values=red|green|blue"
]
}
}
For the full documentation of the validation filter, see QscSearchRequestValidationFilter.