Desenvolvendo um buscador com PHP e Elasticsearch
Fernando Silva@FernandoDebrand
Sobre mim!
Eu sou Fernando SilvaAnalista de Desenvolvimento
Visão Geral
◎ Comunidade◎ Stack Elastic◎ Elasticsearch
◉ Características◉ Arquitetura◉ Apache Lucene◉ Cluster e Índice◉ API RESTful / Clients
◎ Grandes projetos que usam◎ Instalando e configurando◎ Exemplos de utilização com PHP◎ Ferramentas e frameworks
Comunidade Elastic
Comunidade Elastic
https://www.elastic.co/community
Forums | Meetups | Canais IRC Freenode
Comunidade Elastic
Stack Open Source Elastic
Stack Open Source Elastic
Elasticsearch
Elasticsearch
Elasticsearch é uma ferramenta de busca e análise de dados em tempo real, de código aberto (open source), projetada para escalabilidade horizontal, confiável e de fácil gerenciamento. Combinando velocidade de pesquisa e poder de análise, através de uma linguagem sofisticada de consulta e amigável para o desenvolvedor.
Elasticsearch - Características
● Pesquisa e análise em tempo real
● Distribuída, escalável e alta disponibilidade
● Multitenancy - Múltiplos clientes
● Full-Text Search - Pesquisa de texto completo
● Orientado a documentos
● Schema-Free - Detecta automaticamente estrutura de dados
● API RESTful - Amigável para o desenvolvedor
● Segurança de dados, logs de transação
● Disponível sob Apache 2 Open Source License
● Construído em cima do Apache Lucene
Arquitetura Elasticsearch
O Apache Lucene, ou simplesmente Lucene, é um software de busca escrito em Java. É de código aberto (open source) da Apache Software Foundation, licenciado sob Apache 2 Open Source License.
● Escalável e de alto desempenho de indexação○ Mais de 150GB/hora
● Poderoso, preciso e eficiente algoritmos de pesquisa○ Classificação de pesquisa○ Múltiplos índices ○ Permite atualização e pesquisa simultânea
● Multi-plataforma
Conceitos Básicos
Existem alguns conceitos que são fundamentais para Elasticsearch. Entender esses conceitos desde o ínicio facilitará no processo de aprendizagem.
● Near Realtime (NRT)● Cluster ● Node● Index● Type● Document● Shards & Replicas
Conceitos Básicos
Elasticsearch é uma plataforma de busca em tempo real, podendo ter uma pequena latência(normalmente um segundo).
Near Realtime (NRT)
Cluster é uma coleção de um ou mais nós (servidores) que juntos detém os seus dados inteiros e fornece recursos de indexação e pesquisa.
Cluster
Node é um servidor único que é parte do seu cluster, armazena seus dados, e participa da indexação e pesquisa.
Node
Um índice é um conjunto de documentos. Por exemplo, pode se ter um índice para dados de cliente, outro para catálogo de produtos.
Index
Dentro de um índice, você pode definir um ou mais tipos. Um tipo é uma categoria/partição lógica do seu índice.
Type
Fragmentos são utilizados quando se tem uma grande quantidade de documentos, possibilitando subdividir o seu índice em pedaços.
Réplicas são importantes por duas principais razões:● Permite dividir horizontalmente o volume de
conteúdo● Permite distribuir e paralelizar as operações,
aumentando assim o desempenho
Shards & Replicas
Shards & Replicas
Orientado a documentos
Utiliza banco de dados não relacional (NoSQL), assim é armazenada entidades complexas no Elasticsearch, como documentos JSON estruturados. Todos os campos são indexados por padrão, e todos os índices podem ser usados em uma consulta, para retornar facilmente resultados complexos em uma velocidade incrível.
Orientado a documentos
{
"curso": {
"codigo": "69212",
"nome": "ANÁLISE E DESENVOLVIMENTO DE SISTEMAS",
"modalidade": "Educação Presencial",
"grau": "Tecnológico",
"enade": "3",
"cpc": "3",
"cc": "3",
"periodicidade_integralizacao": "Semestral (6.0)",
"carga_horaria_minima": "2232 horas",
"vagas_autorizadas": "300",
"coordenador": "GUILHERME BERTONI MACHADO",
"situacao_funcionamento": "Em atividade",
"endereco": "Rua Coronel Genuíno 130",
"cep": "90010-150",
"municipio": "Porto Alegre",
"uf": "RS"
}
}
Orientado a documentos
API RESTful / Clients
API RESTful
Elasticsearch disponibiliza uma API. Quase que qualquer ação pode ser executada usando API RESTful, usando JSON através de HTTP.
Bibliotecas Client estão disponíveis para várias linguagens de programação.
Clients● Java API
● Java REST Client
● JavaScript API
● Groovy API
● .NET API
● PHP API
● Perl API
● Python API
● Ruby API
● E mais clients desenvolvidos pela comunidade
Comparação de Terminologias
TerminologiasElasticsearch MySQL
Index Database
Type Table
Document Row
Field Column
Mapping Schema
Shard Partition
Quando usar Elasticsearch?
Grandes projetos que usam Elasticsearch
Message Analytics, armazena dados de todos os canais de
comunicação.
Cases
Busca de notícias, vídeos e fotos, com mais 180
consultas por segundo.
Servindo 4 milhões de vendedores, com garantia de escalabilidade.
https://www.elastic.co/use-cases
Indexação de mais de 8 milhões de repositórios.
24 mil pesquisas por segundos no MSN e utilizados em outros
produtos como, Listening Social e Azure Search.
Já utiliza a 3 anos, para mais de 40 ferramentas, com mais de 60
milhões de consultas por dia.
O que já vimos até aqui
◎ Comunidade◎ Stack Elastic◎ Elasticsearch
◉ Características◉ Arquitetura◉ Apache Lucene◉ Cluster e Índice◉ API RESTful / Clients
◎ Grandes projetos que usam◎ Instalando e configurando◎ Exemplos de utilização com PHP◎ Ferramentas e frameworks
Instalando e Configurando
InstalaçãoFaz o download em https://www.elastic.co/downloads/elasticsearch, descompacta o zip.
Execute bin/elasticsearch em Unix ou bin/elasticsearch.bat no Windows.
Teste executando:
$ curl -i -XGET 'localhost:9200/'
https://www.elastic.co/guide/en/elasticsearch/reference/current/_installation.html
Testando com Postman
Utilizando DockerBaixe a imagem e executa o container:
$ docker run -d -p 9200:9200 -p 9300:9300 elasticsearch
Testa se o Elasticsearch está executando:
$ curl -i -XGET 'localhost:9200/'
https://hub.docker.com/_/elasticsearch/
E o PHP?
Como usar com PHP
Instalando Pacote Elasticsearch para PHP
Crie um diretório “elastic_php”, cria um arquivo composer.json com o seguinte conteúdo.
{
"require": {
"elasticsearch/elasticsearch": "~2.0"
}
}
$ composer install
Conectando Elasticsearch com PHP
Crie um arquivo index.php dentro do diretório “elastic_php” e adicione o seguinte código.
<?php
require 'vendor/autoload.php';
$client = Elasticsearch\ClientBuilder::create()->build();
if ($client) {
echo 'conectado';
}
Indexação de dados no Elasticsearch
Já estamos conectados ao Elasticsearch. Vamos criar um índice com alguns dados.
<?php
require 'vendor/autoload.php';
$client = Elasticsearch\ClientBuilder::create()->build();
$params = [
'index' => 'meu_indice',
'type' => 'meu_tipo',
'id' => 'meu_id2',
'body' => [
'primeiro campo' => 'Adicionando meu primeiro campo no Elasticsearch'
],
];
$response = $client->index($params);
echo $response['created'];
Obtendo dados do ElasticsearchJá temos um índice criado, vamos obter os dados a partir dele.
<?php
require 'vendor/autoload.php';
$client = Elasticsearch\ClientBuilder::create()->build();
$params = [
'index' => 'meu_indice',
'type' => 'meu_tipo',
'id' => 'meu_id2',
];
$response = $client->get($params);
echo $response['_source']['primeiro campo'];
Pesquisando em Elasticsearch
<?php
require 'vendor/autoload.php';
$client = Elasticsearch\ClientBuilder::create()->build();
$params = [
'index' => 'meu_indice',
'type' => 'meu_indice',
'body' => [
'query' => [
'match' => [
'primeiro campo' => 'meu primeiro campo'
],
],
],
];
Pesquisando em Elasticsearch
$response = $client->search($params);
$hits = count($response['hits']['hits']);
$result = null;
$i = 0;
while ($i < $hits) {
$result[$i] = $response['hits']['hits'][$i]['_source'];
$i++;
}
foreach ($result as $key => $value) {
echo $value['primeiro campos'] . "<br>";
}
https://gist.github.com/fernandodebrando/030445cc05b862086ca706150f049e13
Case uPlanAcademic.com
Objetivo
Objetivos
Sistema web para possibilitar o planejamento acadêmico, através da centralização de informações sobre cursos, podendo assim auxiliar os futuros acadêmicos em suas escolhas.
Solução
Sistema de acesso público que facilite a busca de cursos e instituições registradas no MEC, podendo visualizar informações dos cursos e efetuar comparação.
Solução
Arquitetura
Arquitetura
Arquitetura
Web Crawler
JSON - Índice{
"instituicao": {
"codigo": "3804",
"nome": " FACULDADE SENAC PORTO ALEGRE - FSPOA - SENAC/RS",
"endereco": "Rua Coronel Genuíno",
"numero": "130",
"complemento": "",
"cep": "90010-150 ",
"bairro": "Centro",
"municipio": "Porto Alegre",
"uf": "RS",
"telefone": "(051) 3284 1900",
"fax": "(051) 3284 1902",
"organizacao_academica": "Faculdade",
"site": "www.senacrs.com.br",
"categoria_administrativa": "Privada sem fins lucrativos",
"email": "[email protected] ",
"ci_conceito_institucional": {
"valor": "3",
"ano": "2014"
},
"igc_indice_geral_cursos": {
"valor": "3",
"ano": "2014"
},
"igc_continuo": {
"valor": "2.6664",
"ano": "2014"
}
},
JSON - Índice"curso": {
"codigo": "69212",
"nome": "ANÁLISE E DESENVOLVIMENTO DE SISTEMAS",
"modalidade": "Educação Presencial",
"grau": "Tecnológico",
"enade": "3",
"cpc": "3",
"cc": "3",
"data_inicio_funcionamento": "05/04/2004",
"periodicidade_integralizacao": "Semestral (6.0)",
"carga_horaria_minima": "2232 horas",
"vagas_autorizadas": "300",
"coordenador": "GUILHERME BERTONI MACHADO",
"situacao_funcionamento": "Em atividade",
"endereco": "Rua Coronel Genuíno 130",
"cep": "90010-150",
"municipio": "Porto Alegre",
"uf": "RS"
}
}
Arquitetura
Arquitetura
Buscador
Home BuscadorPossibilidade de buscar por nome de curso ou
instituição.
Busca AvançadaPossibilidade de buscar por nome, grau e modalidade
de curso e nome, município e UF da instituição.
Tecnologias e Ferramentas
Tecnologias e Ferramentas
Hospedagem Elasticsearch
Hospedagem Elasticsearch
Referências◎ Client Elasticsearch-PHP
(https://www.elastic.co/guide/en/elasticsearch/client/php-api/current/index.html)
◎ Client Elasticsearch (https://www.elastic.co/guide/en/elasticsearch/client/index.html)
◎ Guia Elasticsearch (https://www.elastic.co/guide/en/elasticsearch/guide/current/index.html)
◎ Guia Elastic Stack (https://www.elastic.co/guide/index.html)
Obrigado!
Alguma pergunta?Você pode me encontrar em @FernandoDebrand.
Apresentação em: https://speakerdeck.com/fernandodebrando.
Participe da comunidade PHPRS.
phprs.com.br
rselephants
@phprs
phprs.slack.com
meetup.com/php-rs
PHPinga Pós TDC
A partir das 19hs
Malvadeza PubTv. do Carmo, 76 - Cidade Baixa,
Porto Alegre - RS