Blog

Von ES|QL zu PHP-Objekten

Lernen Sie, wie Sie ES|QL-Abfragen in PHP ausführen und verwalten. Folgen Sie dieser Anleitung, um ES|QL-Ergebnisse einem PHP-Objekt oder einer benutzerdefinierten Klasse zuzuordnen.

Ab elasticsearch-php v8.13.0 können Sie ES|QL- Abfragen ausführen und das Ergebnis einem PHP-Objekt vom Typ stdClass oder einer benutzerdefinierten Klasse zuordnen.

ES|QL

ES|QL ist eine neue Elasticsearch-Abfragesprache, die in Elasticsearch 8.11.0 eingeführt wurde. Aktuell ist es als technische Vorschau verfügbar. Es bietet eine leistungsstarke Möglichkeit, in Elasticsearch gespeicherte Daten zu filtern, zu transformieren und zu analysieren.

Es verwendet "Pipes" (|), um Daten schrittweise zu manipulieren und zu transformieren. Dieser Ansatz ermöglicht es den Benutzern, eine Reihe von Operationen zu erstellen, wobei das Ergebnis einer Operation als Eingabe für die nächste dient, wodurch komplexe Datentransformationen und -analysen möglich werden.

Die folgende Abfrage gibt beispielsweise die ersten 3 Dokumente (Zeilen) des Index sample_data zurück:

FROM sample_data
| LIMIT 3
ES|QL erzeugt Tabellen

Anwendungsfall: ES|QL-Funktionen im offiziellen PHP-Client

Um die im offiziellen PHP-Client entwickelten ES|QL-Funktionen zu veranschaulichen, haben wir eine CSV-Datei mit 81.828 Büchern (54,4 MB) in Elasticsearch gespeichert, die folgende Informationen enthält:

Title;Descrition;Author;Year;Publisher;Ratings

Wir haben diese Liste aus dem öffentlich verfügbaren Datensatz der Amazon-Buchrezensionen extrahiert.

Wir haben einen books -Index mit den folgenden Elasticsearch-Mappings erstellt:

'mappings' : {
    'properties': {
        'title': {
            'type': 'text'
        },
        'description': {
            'type': 'text'
        },
        'author': {
            'type': 'text'
        },
        'year': {
            'type': 'short'
        },
        'publisher': {
            'type': 'keyword'
        },
        'rating': {
            'type': 'half_float'
        }
    }
}

Der Wert rating ist der Durchschnitt der Ranking-Rezensionen aus der 2,9 GB großen Datei Books_rating.csv .

Hier finden Sie das PHP-Skript, mit dem wir alle Bücher in Elasticsearch per Massenimport importiert haben. Die Massenverarbeitung dauerte 7 Sekunden und benötigte 28 MB RAM unter Verwendung von PHP 8.2.17. Mit dem vorgeschlagenen Mapping beträgt die Indexgröße in Elasticsearch etwa 62 MB.

ES|QL-Ergebnisse einem PHP-Objekt oder einer benutzerdefinierten Klasse zuordnen

Wir können ES|QL-Abfragen in PHP über den esql()->query() -Endpunkt ausführen. Das Ergebnis dieser Abfrage ist eine Tabellendatenstruktur. Dies wird in JSON mithilfe der Felder columns und values ausgedrückt. Im Feld columns haben wir die Definitionen name und type .

Hier ist ein Beispiel für eine ES|QL-Abfrage, um die Top-10-Bücher von Stephen King, sortiert nach den Nutzerbewertungen, abzurufen:

$query = <<<EOD
    FROM books
    | WHERE author == "Stephen King"
    | SORT rating DESC
    | LIMIT 10
EOD;

$result = $client->esql()->query([
    'body' => ['query' => $query]
]);

Das JSON-Ergebnis von Elasticsearch sieht wie folgt aus:

{
    "columns": [
        { "name": "author", "type": "text" },
        { "name": "description", "type": "text" },
        { "name": "publisher", "type": "keyword" },
        { "name": "rating", "type": "double" },
        { "name": "title", "type": "text" },
        { "name": "year", "type": "integer" }
    ],
    "values": [
        [
            "Stephen King",
            "The author ...",
            "Turtleback",
            5.0,
            "How writers write",
            2002
        ],
        [
            "Stephen King",
            "In Blockade Billy, a retired coach...",
            "Simon and Schuster",
            5.0,
            "Blockade",
            2010
        ],
        [
            "Stephen King",
            "A chilling collection of twenty horror stories.",
            "Signet Book",
            4.55859375,
            "Night Shift (Signet)",
            1979
        ],
        ...
    ]
}

In diesem Beispiel haben wir 6 Eigenschaften (Autor, Beschreibung, Verlag, Bewertung, Titel, Jahr) zu einem Buch und 10 Ergebnisse, alle Bücher von Stephen King.

Eine Liste aller in ES|QL unterstützten Datentypen finden Sie hier.

Das $result -Antwortobjekt kann als Array, als Zeichenkette oder als Objekt aufgerufen werden (siehe hier für weitere Informationen).

Mithilfe der Objektschnittstelle können wir über Eigenschaften und Indizes auf die Werte zugreifen. Beispielsweise gibt $result->values[0][4] den Titel (4) des ersten Buches (0) in der Liste zurück, $result->values[1][3] die Bewertung (3) des zweiten Buches (1) usw. Denken Sie daran, dass der Index eines Arrays in PHP bei Null beginnt.

Diese Schnittstelle mag für einige Anwendungsfälle ausreichend sein, aber in den meisten Fällen möchten wir als Ergebnis ein Array von Objekten erhalten.

Um das Ergebnis in ein Array von Objekten abzubilden, können wir die neue mapTo()- Funktion von elasticsearch-php verwenden.

Diese Funktion ist direkt im Elasticsearch-Antwortobjekt verfügbar. Das bedeutet, Sie können wie folgt darauf zugreifen:

$books = $result->mapTo(); // Array of stdClass
foreach ($books as $book) {
    printf(
        "%s, %s, %d, Rating: %.2f\n",
        $book->author,
        $book->title,
        $book->year,
        $book->rating
    );
}

Wenn Sie eine benutzerdefinierte Buchklasse haben, können Sie das Ergebnis mithilfe dieser Klasse wie folgt abbilden:

class Book
{
    public string $author;
    public string $title;
    public string $description;
    public int $year;
    public float $rating;
}

$books = $result->mapTo(Book::class); // Array of Book

Wenn Ihre Klasse neben den im ES|QL-Ergebnis enthaltenen Eigenschaften noch weitere Eigenschaften besitzt, funktioniert dies ebenfalls. Die Funktion mapTo() verwendet nur die Eigenschaften, die als Spalten des ES|QL-Ergebnisses zurückgegeben werden.

Sie können alle in diesem Artikel genannten Beispiele hier herunterladen.

Häufige Fragen

Was ist ES|QL?

ES|QL ist eine Elasticsearch-Abfragesprache, die in Elasticsearch 8.11.0 eingeführt wurde. Es bietet eine leistungsstarke Möglichkeit, in Elasticsearch gespeicherte Daten zu filtern, zu transformieren und zu analysieren.

Zugehörige Inhalte

LINQ to Elasticsearch ES|QL: C# schreiben, Elasticsearch abfragen

Florian Bernd

Geodaten-Suche mit Elasticsearch und ES|QL

Craig Taverner

Schnellere ES|QL-Statistiken mit Hashtabellen im Schweizer Stil

Chris Hegarty

Einführung der Elasticsearch-Unterstützung in der Google MCP Toolbox for Databases

Enrico Zimuel

Geodaten mit Kibana in Elasticsearch einlesen und in ES|QL verwenden

Craig Taverner

Sind Sie bereit, hochmoderne Sucherlebnisse zu schaffen?

Eine ausreichend fortgeschrittene Suche kann nicht durch die Bemühungen einer einzelnen Person erreicht werden. Elasticsearch wird von Datenwissenschaftlern, ML-Ops-Experten, Ingenieuren und vielen anderen unterstützt, die genauso leidenschaftlich an der Suche interessiert sind wie Sie. Lasst uns in Kontakt treten und zusammenarbeiten, um das magische Sucherlebnis zu schaffen, das Ihnen die gewünschten Ergebnisse liefert.

Probieren Sie es selbst aus