- Documentation >
- Search >
- Extend search >
- Manipulate Elasticsearch query
Manipulate Elasticsearch query
You can customize the search query before it's executed.
To do it, subscribe to Ibexa\Contracts\Elasticsearch\Query\Event\QueryFilterEvent
.
The following example shows how to add a Search Criterion to all queries.
Depending on your configuration, this might impact all search queries, including those used for search and content tree in the back office.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37 | <?php
declare(strict_types=1);
namespace App\EventSubscriber;
use Ibexa\Contracts\Core\Repository\Values\Content\Query\Criterion\LogicalAnd;
use Ibexa\Contracts\Core\Repository\Values\Content\Query\Criterion\ObjectStateIdentifier;
use Ibexa\Contracts\Elasticsearch\Query\Event\QueryFilterEvent;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
final class CustomQueryFilterSubscriber implements EventSubscriberInterface
{
public function onQueryFilter(QueryFilterEvent $event): void
{
$query = $event->getQuery();
$additionalCriteria = new ObjectStateIdentifier('locked');
if ($query->filter !== null) {
$query->filter = $additionalCriteria;
} else {
// Append Criterion to existing filter
$query->filter = new LogicalAnd([
$query->filter,
$additionalCriteria,
]);
}
}
public static function getSubscribedEvents(): array
{
return [
QueryFilterEvent::class => 'onQueryFilter',
];
}
}
|
If you're not using Symfony's autoconfiguration
for event subscribers, register it as a service:
| services:
App\EventSubscriber\CustomQueryFilterSubscriber:
tags:
- { name: kernel.event_subscriber }
|