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:
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:
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);
}
}
Curso Laravel - Desenvolvimento de APIs REST
Conhecer o cursoConclusã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.