PHP

Full Text Search com Laravel, Scout e Algolia

Aprenda como realizar buscas textuais rápidas e eficientes independentemente da quantidade de registros, campos ou tamanhos de textos.

há 7 anos 1 mês

Formação Desenvolvedor PHP
Conheça a formação em detalhes

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 disponibiliza uma API para se comunicar com o seu software, como é o caso do Algolia e searchly.

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:

planos do algolia

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:

tela de chaves do algolia

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:

tela do painel de indice do algolia

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.

tela de opções de indice do algolia

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 Laravel - Desenvolvimento de APIs REST
Conhecer 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.

Autor(a) do artigo

Elton Fonseca
Elton Fonseca

Professor e desenvolvedor. Formado em análise e desenvolvimento de sistema, pós graduado em engenharia e arquitetura de software. É 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. @eltonfonsecadev

Todos os artigos

Artigos relacionados Ver todos