notifications Notificaciones

Marcar todas como leídas

Ver más

lightbulb_outline

Integrar elastichsearch en larvavel

timer 3 Min.

remove_red_eye 701

calendar_today

En este tutorial aprenderemos a integrar elasticsearch en laravel como nuestro search engine.

Pasos iniciales

Para comenzar lo que tenemos que hacer es decargar elasticsearch, para ello vamos a su página oficial elasticsearch.

Dentro elegimos el sistema operativo, este nos descargará un .rar con todos los archivos, dentro de la carpeta encontraremos una carpeta bin, dentro de la carpeta bin encontraremos el binario elasticsearch.

Otro método para usar elasticsearch que podemos usar descargar una imagen de docker.

docker pull docker.elastic.co/elasticsearch/elasticsearch:7.4.1

Ahora para ejecutar elasticsearch vamos a nuestra terminal y ejectuamos el binario, recuerda que si estás en windows puedes ejecutar el elasticsearch.bat .

O bien si estamos usando docker, ejecutamos.

docker run -p 9200:9200 -p 9300:9300 -e "discovery.type=single-node" docker.elastic.co/elasticsearch/elasticsearch:7.4.1

Para ver que todo está funcionando vamos a nuestro navegador en http://localhost:9200/

Integración

Para integrar elasticsearch con nuestra app vamos a proceder a instalar el cliente oficial.

composer require elasticsearch/elasticsearch:7.0

Como siguiente paso vamos a proceder a crear nuestro cliente, esto lo haremos dentro de nuestro AppServicesProvider dentro del método register.

Como primer paso vamos a importar nuestras clases dentro del AppServicesProviders.

use Elasticsearch\ClientBuilder;
use Elasticsearch\Client;

Y dentro del método register vamos a registrar a nuestro cliente.

$this->app->bind(Client::class, function($app) {
    return ClientBuilder::create()->build();
});

Para trabajar con elasticsearch tenemos que definir un index, un index lo podemos ver como una base de datos, esto por dar una comparación, dentro del index es donde vamos a definir nuestros registros.

Para poder crear un index lo podemos hacer directamente desde nuestro cliente.

$client->indices()->create(['index' => 'articles'])

Algo que tenemos que tener encuenta es que solo podemos ejecutar la linea anterior una vez, ya que si ejecutamos más de una vez nos dará una exception.

En mi caso crearé un index llamado articles, es común nombrar a nuestro index, con el nombre de nuestra tabla. Como siguiente paso tenemos que replicar nuestro modelos de nuestra base de datos a elasticsearch.

La forma más fácil de realizar esto es a través de un observer, esto para poder hacer la replica cada vez que agregamos un nuevo modelo.

Entonces procedemos a crear nuestro observador.

 php artisan make:observer ArticleObserver --model=MODEL

En donde MODEL es el nombre del modelo a usar. Dentro del observer vamos a proceder a importar la clase cliente.

use Elasticsearch\Client;

Y dentro del constructor vamos a proceder a inyectar a nuestra clase cliente.

private $client;

public function __construct(Client $client)
{
    $this->client = $client;
}

Ahora dentro del observer vamos a procerder a definir un método saved().

public function saved($model)
{}

Dentro del método vamos a replicar nuestros datos con el cliente.

public function saved($model)
{
    $this->client->index([
        'index' => 'articles',
        'type' => 'articles',
        'id' => $model->id,
        'body' => [
            'title' => $model->title
        ]
    ]);
}

Como último paso vamos a proceder a registar nuestro observer en el archivo AppServiceProvider en el método boot.

App\Article::observe(App\Observers\ArticleObserver::class);

Para crear hacer la replica vamos a ejecutar el método index, como parametro pasamos un arreglo, dentro del arreglo definiremos 4 propiedades, index y type corresponde al nombre de nuestro index que creamos anteriormente, el apartado de id corresponde al identificador único en este caso usamos el mismo que el de nuestro modelo, el apartado de body es el apartado mas importante y es donde vamos a definir todos los atributos que queremos replicar a elasticsearch, en este caso definimos un arreglo y dentro definimos el atributo title.

Con esto nos aseguramos que al crear un modelo de eloquent este se replique direcamente a elasticsearch.

Ahora si creamos un nuevo registro.

Article::create(['title' => 'lorem insu'])

Y si ahora vamos a nuestro navegador a http://localhost:9200/articles/_search?scroll=1m. En donde articles es el nombre de nuestro index.

Dento del navegador veremos en el apartado hits veremos a nuestro registro.

Consultando datos

Como paso final veremos la consulta de datos para hacer esto vamos a usar al cliente con el metodo search.

Dentro del metodo pasamos un arreglo, en el cual definimos el index y el type con el nombre que definimos anteriomente, en el apartado de body es donde definiremos la configuración de nuestra consulta.


use Elasticsearch\Client;

Route::get('/search', function(Client $client) {
    $res = $client->search([
        'index' => 'articles',
        'type' => 'articles',
        'body' => [
            'query' => [
                'match' => [
                    'title' => 'lorem insu'
                ]
            ]
        ]
    ]);

    dd($res);
});

Dentro de match definimos las diferentes configuraciónes ya se para hacer un match de titulo o de todos los campos en los que necesitemos hacer una busqueda.

Y como resultado tenemos lo siguiente.

array:4 [▼
  "took" => 2
  "timed_out" => false
  "_shards" => array:4 [▶]
  "hits" => array:3 [▼
    "total" => array:2 [▶]
    "max_score" => 0.5753642
    "hits" => array:1 [▼
      0 => array:5 [▼
        "_index" => "articles"
        "_type" => "articles"
        "_id" => "5"
        "_score" => 0.5753642
        "_source" => array:1 [▼
          "title" => "lorem insu"
        ]
      ]
    ]
  ]
]

Otros artículos del blog

Comunidad