Wer ElasticSearch in Neos verwendet, kann dies natürlich auch in PHP tun. Das bietet nochmal deutlich mehr Filter-Möglichkeiten und steigert die Performance.
Um auch Nodes finden zu können, sollte "./flow nodeindex:build" nach Einrichtung des ContentRepositoryAdaptors einmal ausgeführt werden.
Wie bei FlowQuery, brauchen wir auch für ElasticSearch einen Context, um Nodes finden zu können. Um einen solchen zu erstellen, kann die Factory (\Neos\ContentRepository\Domain\Service\ContextFactoryInterface) genutzt werden:
$context = $this->contextFactory->create();
Bevor wir nach bestimmten Kriterien filtern können, wird eine Instanz von "Flowpack\ElasticSearch\ContentRepositoryAdaptor\Eel\ElasticSearchQueryBuilder" erstellt und die Site-Node als Suchbasis übergeben.
$search = new ElasticSearchQueryBuilder();
$search->query($context->getRootNode()); #Equivalent zu ${Search.query(site)}
Anschließend können wir Filter auf die Query anwenden und sie letztlich ausführen. Eine Übersicht aller verfügbaren Filter, ist im Package zu finden.
#100 Bilder, sortiert nach alter
$nodes = $search
->nodeType('Neos.NodeTypes:Image') #Nach NodeType filtern
->sortAsc('_creationDateTime') #Aufsteigende Sortierung nach Zeitpunkt der Erstellung
->limit(100) #100 Ergebnisse
->execute() #Query ausführen
->toArray(); #Ergebnis in Array aus Nodes umwandeln
Wichtig ist, dass das Limit auf die gewünschte Größe gesetzt wird. Andernfalls gibt ElasticSearch nämlich nur 10 Nodes zurück.
Wenn das Query-Ergebnis nicht in einem Fluid-Template verwendet wird, bietet es meistens "->toArray()" am Ende der Query an. So bekommen wir die Nodes als Array zurück.