Full Text Search com Laravel, Scout e Algolia

Realizar buscas em textos é algo que a maioria dos bancos de dados não fazem muito bem (com eficiência). Isso fica ainda pior quando temos que buscar em vários campos com muitas informações. O problema é que esse tipo de situação é cada vez mais comum nos sistemas, devido a diminuição no valor do armazenamento, maior presença das pessoas online e outros fatores.

Baseado nisso, existem algumas soluções que ajudam a resolver essa demanda. Basicamente elas consistem em carregar esses dados para índices e usar algoritmos específicos para esse tipo de busca. Existem alguns softwares que podem ser instalados diretamente no seu servidor como o Apache Solr, Elasticsearch etc, também existem algumas aplicações SaaS que fazem esse “trabalho sujo” e que disponibilizam uma API para se comunicar com o seu software, como é o caso do Algolia e searchly.

Desenvolvedor Laravel Full-Stack
Formação: Desenvolvedor Laravel Full-Stack
Nesta formação você aprenderá desenvolver aplicações PHP usando o framework Laravel com maestria. Ao final desta formação, você terá condições de trabalhar em grandes aplicações web ou APIs integradas com diversos serviços, tudo isso utilizando as melhores práticas do mercado.
CONHEÇA A FORMAÇÃO

Laravel Scout

O Scout é um package para Laravel que adiciona aos models do Eloquent a possibilidade de usar mecanismos de busca de forma fácil. Ele usa model observers para manter os índices do serviço de busca sempre atualizado.

Esse package trabalha com conceito de driver, um driver é a interface que o Scout usa para se comunicar como serviço de busca. Por padrão, até o momento, o único driver que ele possui nativamente é para trabalhar com o Algolia, porém, existe uma certa facilidade na criação de outros drivers.

Instalação do Scout

Para instalar o package precisamos primeiro adicionar a dependência ao composer:

composer require laravel/scout  

Agora, precisamos registrar o provider, acesse o arquivo de configuração config/app.php e adicione no array providers:

Laravel\Scout\ScoutServiceProvider::class,  

Para finalizar, vamos executar o comando para copiar o arquivo de configuração do Scout para dentro da pasta config do projeto:

php artisan vendor:publish --provider="Laravel\Scout\ScoutServiceProvider"  

Criando a conta no Algolia

Para usar o Algolia é necessário uma conta no serviço e também um aplicativo criado dentro dele. Para criar uma nova conta, clique aqui. Após logado, você deve ir no item APPS e criar uma nova aplicação:

O valor da mensalidade é cobrado baseado na quantidade de operações que você faz por mês e quantidade de registros cadastrados. Qualquer interação como (busca, criação, atualização e exclusão) são consideradas operações. No plano gratuito são permitidas 100.000 iterações e 10.000 registros.

Na tela principal do aplicativo temos um item de menu chamado API Keys:

Precisamos das informações Application ID e Admin API Key:

Guarde essas informações!

Configurando o Scout

Se olhar dentro do arquivo de configuração do config/scout.php verá que o driver padrão dele é Algolia e que é necessário configurar os dados da API:

'driver' => env('SCOUT_DRIVER', 'algolia'),  
'algolia' => [  
    'id' => env('ALGOLIA_APP_ID', ''),
    'secret' => env('ALGOLIA_SECRET', ''),
 ],

No arquivo .env da sua aplicação adicione as seguintes configurações:

ALGOLIA_APP_ID=O application Id copiado do site  
ALGOLIA_SECRET=Admin API Key copiado do site  

Como no arquivo de configuração ele está obtendo do .env, ele usará essas configurações para o Scout se conectar ao Algolia

Após adicionar essas informações, é necessário instalar um package que o Scout utiliza para trabalhar com o Algolia:

composer require algolia/algoliasearch-client-php  

Indicando um “model buscável”

Após instalarmos e configurarmos o Scout, precisamos indicar quais models serão indexados. Para isso, basta adicionar uma trait no model:

<?php

namespace App;

use Laravel\Scout\Searchable;  
use Illuminate\Database\Eloquent\Model;

class User extends Model  
{
    use Searchable;
}

Criando índices

A primeira vez que indicamos um model como buscável, precisamos enviar os dados existentes no nosso banco de dados para criar o índice. Isso é feito a partir do comando:

php artisan scout:import "App\User"  

Não se esqueça de trocar o caminho para a seu model.

Se tudo ocorrer bem, ao acessar o painel do Algolia, você terá o índice criado com os registros da sua tabela:

Buscando os dados

Para buscar os dados é mais fácil que roubar doce de criança. Basta usar o método search como qualquer método do Eloquent:

$users = App\User::search('João Silva')->get();

Isso buscará dentro de todos atributos o texto joão Silva, mas você pode configurar dentro das opções do índice no painel do Algolia quais são os atributos buscáveis, qual a ordem de preferência deles, sinônimos de busca e muito mais.

Além disso, também é possível usar outros métodos do Eloquent como where():

$users = App\User::search('João Silva')->where('address_id', 30)->get();

E paginate():

$users = App\User::search('João Silva')->paginate(15);

Personalizando o item antes de enviar

É possível também personalizar os dados que criarão os índices no serviço. Pense que temos uma relação 1 para 1 com o model Profile e precisamos também buscar nos campos dessa tabela. Basta adicionar um método no model User chamado toSearchableArray e retornar um array para definir isso:

<?php

namespace App;

use Laravel\Scout\Searchable;  
use Illuminate\Database\Eloquent\Model;

class User extends Model  
{
    use Searchable;

    /**
     * Profile associated with user.
     *
     * @return \Illuminate\Database\Eloquent\Relations\HasOne
     */
    public function profile()
    {
        return $this->belongsTo(App\Profile');
    }

    /**
     * Relation define for search
     *
     * @return array
     */
    public function toSearchableArray()
    {
        $user = $this->toArray();
        $profile = $this->profile->toArray();

        return array_merge($user, $profile);
    }

}
Laravel - Desenvolvimento de APIs REST
Curso de Laravel - Desenvolvimento de APIs REST
CONHEÇA O CURSO

Conclusão

Esses são os passos iniciais para usar o Algolia com o Scout. Te aconselho a ler a documentação do Scout com calma e também a documentação do Algolia para saber quais as opções disponíveis no painel de controle dele e até outras utilidades como, por exemplo, realizar buscas em tempo real usando apenas o front-end da aplicação.

Deixe seu comentário

Desenvolvedor, autor e instrutor. Apaixonado por desenvolvimento de software e tudo ligado a área de tecnologia. É autor de cursos em diversos temas, como, desenvolvimento back-end, cloud computing e CMSs. Nas horas vagas adora estudar sobre o mercado financeiro, cozinhar e brincar com pequeno Daniel de 1 ano.