Skip to main content
Version: 2026.2

Default Search Models

Default search models build OpenSearch/Elasticsearch query JSON programmatically. Use them when building custom search modifiers or when executing searches directly through the search client. The Generic Data Index search services use these models internally.

Example: Custom Search Modifier

Add a term filter to the search query in a custom search modifier handler:

#[AsSearchModifierHandler]
public function handleCustomFilter(
CustomFilter $customFilter,
SearchModifierContextInterface $context
): void {
$context->getSearch()->addQuery(
new TermFilter(
field: $customFilter->getField(),
term: $customFilter->getValue(),
)
);
}

Search Model

The Search model is the top-level container for building a search query. Add queries, aggregations, sorting, and control pagination:

use Pimcore\Bundle\GenericDataIndexBundle\Model\DefaultSearch\Search;

$search = (new Search())
->setSize(10)
->setFrom(0)
->setSource(['field'])
->addSort(new FieldSort('field', 'asc'))
->addQuery(new TermQuery('field', 'value'))
->addAggregation(new Aggregation('test-aggregation', [...]));

$result = $searchClient->search([
'index' => $indexName,
'body' => $search->toArray()
]);

Query Models

BoolQuery

Combines multiple queries with boolean operators. See OpenSearch or Elasticsearch documentation.

Basic usage

use Pimcore\Bundle\GenericDataIndexBundle\Model\DefaultSearch\Query\BoolQuery;

$boolQuery = new BoolQuery([
'should' => [
['term' => ['field' => 'value']],
['term' => ['field2' => 'value2']],
],
]);

Adding conditions

$boolQuery = new BoolQuery();
$boolQuery->addCondition('must', [
'term' => ['field' => 'value']
]);

Merging queries

$boolQueryA = new BoolQuery([
'should' => [
['term' => ['field' => 'value']],
],
]);

$boolQueryB = new BoolQuery([
'should' => [
['term' => ['field' => 'value']],
],
]);

// Results in a query with two "should" conditions
$boolQueryA->merge($boolQueryB);

Using query objects in sub-queries

$boolQuery = new BoolQuery([
'should' => [
new TermFilter('field', 'value'),
new TermFilter('field2', 'value2'),
]
]);

TermFilter

Combines a boolean query with a term query to filter results by an exact term:

use Pimcore\Bundle\GenericDataIndexBundle\Model\DefaultSearch\Query\TermFilter;

$termFilter = new TermFilter('field', 'value');

TermsFilter

Combines a boolean query with a terms query to filter by multiple terms.

WildcardFilter

Combines a boolean query with a wildcard query. Use * as wildcard:

use Pimcore\Bundle\GenericDataIndexBundle\Model\DefaultSearch\Query\WildcardFilter;

$wildcardFilter = new WildcardFilter('field', 'value*');

See the WildcardFilter constructor for additional options.

DateFilter

Filter results by a date range or exact date:

use Pimcore\Bundle\GenericDataIndexBundle\Model\DefaultSearch\Query\DateFilter;

// Date range
$dateFilter = new DateFilter('datefield', strtotime('2000-01-01'), strtotime('2099-12-31'));

// Exact date
$dateFilter = new DateFilter('datefield', null, null, strtotime('2000-01-01'));

By default, timestamps are rounded to full days. Disable rounding for exact timestamps:

$dateFilter = new DateFilter(
'datefield', null, null, strtotime('2000-01-01 12:00:00'), false
);

Generic Query

Build any query supported by OpenSearch or Elasticsearch:

use Pimcore\Bundle\GenericDataIndexBundle\Model\DefaultSearch\Query\Query;

$matchQuery = new Query('match', [
'field' => 'value'
]);

$rangeQuery = new Query('range', [
'field' => [
'gte' => 10,
'lte' => 20,
]
]);

Aggregation Model

Build any aggregation supported by OpenSearch or Elasticsearch:

use Pimcore\Bundle\GenericDataIndexBundle\Model\DefaultSearch\Aggregation\Aggregation;

$aggregation = new Aggregation('test-aggregation', [
'terms' => [
'field' => 'value',
],
]);