Blog

De ES|Objetos de QL a PHP

Aprende a ejecutar y gestionar ES|Consultas QL en PHP. Sigue esta guía para mapear ES|QL resulta en un objeto PHP o clase personalizada.

A partir de elasticsearch-php v8.13.0 puedes ejecutar ES|QL consulta y mapea el resultado a un objeto PHP de stdClass o a una clase personalizada.

ES|QL

ES|QL es un nuevo lenguaje de consulta Elasticsearch introducido en Elasticsearch 8.11.0. Ahora mismo, está disponible en vista previa técnica. Proporciona una forma poderosa de filtrar, transformar y analizar los datos almacenados en Elasticsearch.

Emplea "tuberías" (|) para manipular y transformar datos paso a paso. Este enfoque permite a los usuarios componer un serial de operaciones, donde la salida de una operación se convierte en la entrada para la siguiente, permitiendo transformaciones y análisis complejos de datos.

Por ejemplo, la siguiente consulta devuelve los primeros 3 documentos (filas) del índice sample_data :

FROM sample_data
| LIMIT 3
ES|QL produce tablas

Caso de uso: ES|Funciones de QL en el cliente oficial de PHP

Para ilustrar el ES|Características de QL desarrolladas en el cliente oficial de PHP, almacenamos en Elasticsearch un archivo CSV de 81.828 libros (54,4 MB) incluyendo la siguiente información:

Title;Descrition;Author;Year;Publisher;Ratings

Extrajimos esta lista del conjunto de datos de Amazon Books Reviews, disponible al público.

Creamos un índice books con los siguientes mapeos de Elasticsearch:

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

El valor rating es la media de las reseñas de clasificación tomadas del archivo Books_rating.csv de 2,9 GB.

Aquí puedes encontrar el script PHP que usamos para importar en masa todos los libros en Elasticsearch. La operación a granel consumía 7 segundos y 28 MB de RAM usando PHP 8.2.17. Con el mapeo propuesto, el tamaño del índice en Elasticsearch es de unos 62 MB.

Mapa ES|Resultados QL a un objeto PHP o clase personalizada

Podemos ejecutar ES|Consulta QL en PHP usando el punto final esql()->query() . El resultado de esta consulta es una estructura de datos de tabla. Esto se expresa en JSON usando los campos columns y values . En el campo columns tenemos la definición de name y type .

Aquí tienes un ejemplo de ES|Consulta QL para recuperar los 10 mejores libros escritos por Stephen King ordenados por las reseñas de ranking de usuarios:

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

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

El resultado JSON de Elasticsearch es el siguiente:

{
    "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
        ],
        ...
    ]
}

En este ejemplo tenemos 6 propiedades (autor, descripción, editor, valoración, título, año) relacionadas con un libro y 10 resultados, todos libros de Stephen King.

Una lista de todos los tipos soportados en ES|Aquí se informa de QL.

El objeto de respuesta $result puede acceder como un array, una cadena o un objeto ( ver aquí para más información).

Usando la interfaz objeto, podemos acceder a los valores mediante propiedades e índices. Por ejemplo, $result->values[0][4] devuelve el título (4) del primer libro (0) en la lista, $result->values[1][3] devuelve el puntaje de rango (3) del segundo libro (1), etc. Recuerda, el índice de un array en PHP empieza desde cero.

Esta interfaz puede ser suficientemente buena para algunos casos de uso, pero la mayoría de las veces nos gustaría tener una variedad de objetos como resultado.

Para mapear el resultado en un array de objetos podemos usar la nueva función mapTo() de elasticsearch-php.

Esta función está disponible directamente en el objeto de respuesta Elasticsearch. Eso significa que puedes acceder a él de la siguiente manera:

$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
    );
}

Si tienes una clase Book personalizada, puedes mapear el resultado usándola de la siguiente manera:

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

Si tu clase tiene otras propiedades además de las incluidas en el ES|Resultado QL, esto también funcionará. La función mapTo() usará solo las propiedades devueltas como columnas del ES|Resultado de QL.

Puedes descargar todos los ejemplos que se mencionan en este artículo aquí.

Preguntas frecuentes

¿Qué es ES|¿QL?

ES|QL es un lenguaje de consulta Elasticsearch, que fue introducido en Elasticsearch 8.11.0. Proporciona una forma poderosa de filtrar, transformar y analizar los datos almacenados en Elasticsearch.

Contenido relacionado

LINQ a Elasticsearch ES|QL: escribir en C#, buscar en Elasticsearch

Florian Bernd

Búsqueda geoespacial de Elasticsearch con ES|QL

Craig Taverner

Estadísticas ES|QL más rápidas con tablas hash de estilo suizo

Chris Hegarty

Introducción del soporte de Elasticsearch en Google MCP Toolbox for Databases

Enrico Zimuel

Ingirir datos geoespaciales en Elasticsearch con Kibana para su uso en ES|QL

Craig Taverner

¿Estás listo para crear experiencias de búsqueda de última generación?

No se logra una búsqueda suficientemente avanzada con los esfuerzos de uno. Elasticsearch está impulsado por científicos de datos, operaciones de ML, ingenieros y muchos más que son tan apasionados por la búsqueda como tú. Conectemos y trabajemos juntos para crear la experiencia mágica de búsqueda que te dará los resultados que deseas.

Pruébalo tú mismo