tdc2016poa | trilha php - desenvolvendo um buscador com php e elasticsearch

70
Desenvolvendo um buscador com PHP e Elasticsearch Fernando Silva @FernandoDebrand

Upload: tdc-globalcode

Post on 09-Apr-2017

167 views

Category:

Education


3 download

TRANSCRIPT

Page 1: TDC2016POA | Trilha PHP - Desenvolvendo um buscador com PHP e Elasticsearch

Desenvolvendo um buscador com PHP e Elasticsearch

Fernando Silva@FernandoDebrand

Page 2: TDC2016POA | Trilha PHP - Desenvolvendo um buscador com PHP e Elasticsearch

Sobre mim!

Eu sou Fernando SilvaAnalista de Desenvolvimento

Page 3: TDC2016POA | Trilha PHP - Desenvolvendo um buscador com PHP e Elasticsearch

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

Page 4: TDC2016POA | Trilha PHP - Desenvolvendo um buscador com PHP e Elasticsearch

Comunidade Elastic

Page 5: TDC2016POA | Trilha PHP - Desenvolvendo um buscador com PHP e Elasticsearch

Comunidade Elastic

https://www.elastic.co/community

Forums | Meetups | Canais IRC Freenode

Page 6: TDC2016POA | Trilha PHP - Desenvolvendo um buscador com PHP e Elasticsearch

Comunidade Elastic

Page 7: TDC2016POA | Trilha PHP - Desenvolvendo um buscador com PHP e Elasticsearch

Stack Open Source Elastic

Page 8: TDC2016POA | Trilha PHP - Desenvolvendo um buscador com PHP e Elasticsearch

Stack Open Source Elastic

Page 9: TDC2016POA | Trilha PHP - Desenvolvendo um buscador com PHP e Elasticsearch

Elasticsearch

Page 10: TDC2016POA | Trilha PHP - Desenvolvendo um buscador com PHP e 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.

Page 11: TDC2016POA | Trilha PHP - Desenvolvendo um buscador com PHP e Elasticsearch

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

Page 12: TDC2016POA | Trilha PHP - Desenvolvendo um buscador com PHP e Elasticsearch

Arquitetura Elasticsearch

Page 13: TDC2016POA | Trilha PHP - Desenvolvendo um buscador com PHP e 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

Page 14: TDC2016POA | Trilha PHP - Desenvolvendo um buscador com PHP e Elasticsearch

Conceitos Básicos

Page 15: TDC2016POA | Trilha PHP - Desenvolvendo um buscador com PHP e Elasticsearch

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

Page 16: TDC2016POA | Trilha PHP - Desenvolvendo um buscador com PHP e Elasticsearch

Elasticsearch é uma plataforma de busca em tempo real, podendo ter uma pequena latência(normalmente um segundo).

Near Realtime (NRT)

Page 17: TDC2016POA | Trilha PHP - Desenvolvendo um buscador com PHP e Elasticsearch

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

Page 18: TDC2016POA | Trilha PHP - Desenvolvendo um buscador com PHP e Elasticsearch

Node é um servidor único que é parte do seu cluster, armazena seus dados, e participa da indexação e pesquisa.

Node

Page 19: TDC2016POA | Trilha PHP - Desenvolvendo um buscador com PHP e Elasticsearch

Um índice é um conjunto de documentos. Por exemplo, pode se ter um índice para dados de cliente, outro para catálogo de produtos.

Index

Page 20: TDC2016POA | Trilha PHP - Desenvolvendo um buscador com PHP e Elasticsearch

Dentro de um índice, você pode definir um ou mais tipos. Um tipo é uma categoria/partição lógica do seu índice.

Type

Page 21: TDC2016POA | Trilha PHP - Desenvolvendo um buscador com PHP e Elasticsearch

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

Page 22: TDC2016POA | Trilha PHP - Desenvolvendo um buscador com PHP e Elasticsearch

Shards & Replicas

Page 23: TDC2016POA | Trilha PHP - Desenvolvendo um buscador com PHP e Elasticsearch

Orientado a documentos

Page 24: TDC2016POA | Trilha PHP - Desenvolvendo um buscador com PHP e Elasticsearch

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

Page 25: TDC2016POA | Trilha PHP - Desenvolvendo um buscador com PHP e Elasticsearch

{

"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

Page 26: TDC2016POA | Trilha PHP - Desenvolvendo um buscador com PHP e Elasticsearch

API RESTful / Clients

Page 27: TDC2016POA | Trilha PHP - Desenvolvendo um buscador com PHP e Elasticsearch

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.

Page 28: TDC2016POA | Trilha PHP - Desenvolvendo um buscador com PHP e Elasticsearch

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

Page 29: TDC2016POA | Trilha PHP - Desenvolvendo um buscador com PHP e Elasticsearch

Comparação de Terminologias

Page 30: TDC2016POA | Trilha PHP - Desenvolvendo um buscador com PHP e Elasticsearch

TerminologiasElasticsearch MySQL

Index Database

Type Table

Document Row

Field Column

Mapping Schema

Shard Partition

Page 31: TDC2016POA | Trilha PHP - Desenvolvendo um buscador com PHP e Elasticsearch

Quando usar Elasticsearch?

Page 32: TDC2016POA | Trilha PHP - Desenvolvendo um buscador com PHP e Elasticsearch

Grandes projetos que usam Elasticsearch

Page 33: TDC2016POA | Trilha PHP - Desenvolvendo um buscador com PHP e 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.

Page 34: TDC2016POA | Trilha PHP - Desenvolvendo um buscador com PHP e Elasticsearch

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

Page 35: TDC2016POA | Trilha PHP - Desenvolvendo um buscador com PHP e Elasticsearch

Instalando e Configurando

Page 36: TDC2016POA | Trilha PHP - Desenvolvendo um buscador com PHP e Elasticsearch

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

Page 37: TDC2016POA | Trilha PHP - Desenvolvendo um buscador com PHP e Elasticsearch

Testando com Postman

Page 38: TDC2016POA | Trilha PHP - Desenvolvendo um buscador com PHP e Elasticsearch

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/

Page 39: TDC2016POA | Trilha PHP - Desenvolvendo um buscador com PHP e Elasticsearch

E o PHP?

Page 40: TDC2016POA | Trilha PHP - Desenvolvendo um buscador com PHP e Elasticsearch

Como usar com PHP

Page 41: TDC2016POA | Trilha PHP - Desenvolvendo um buscador com PHP e Elasticsearch

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

Page 42: TDC2016POA | Trilha PHP - Desenvolvendo um buscador com PHP e Elasticsearch

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';

}

Page 43: TDC2016POA | Trilha PHP - Desenvolvendo um buscador com PHP e Elasticsearch

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'];

Page 44: TDC2016POA | Trilha PHP - Desenvolvendo um buscador com PHP e Elasticsearch

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'];

Page 45: TDC2016POA | Trilha PHP - Desenvolvendo um buscador com PHP e Elasticsearch

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'

],

],

],

];

Page 46: TDC2016POA | Trilha PHP - Desenvolvendo um buscador com PHP e Elasticsearch

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

Page 47: TDC2016POA | Trilha PHP - Desenvolvendo um buscador com PHP e Elasticsearch

Case uPlanAcademic.com

Page 48: TDC2016POA | Trilha PHP - Desenvolvendo um buscador com PHP e Elasticsearch

Objetivo

Page 49: TDC2016POA | Trilha PHP - Desenvolvendo um buscador com PHP e Elasticsearch

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.

Page 50: TDC2016POA | Trilha PHP - Desenvolvendo um buscador com PHP e Elasticsearch

Solução

Page 51: TDC2016POA | Trilha PHP - Desenvolvendo um buscador com PHP e Elasticsearch

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

Page 52: TDC2016POA | Trilha PHP - Desenvolvendo um buscador com PHP e Elasticsearch

Arquitetura

Page 53: TDC2016POA | Trilha PHP - Desenvolvendo um buscador com PHP e Elasticsearch

Arquitetura

Page 54: TDC2016POA | Trilha PHP - Desenvolvendo um buscador com PHP e Elasticsearch

Arquitetura

Page 55: TDC2016POA | Trilha PHP - Desenvolvendo um buscador com PHP e Elasticsearch

Web Crawler

Page 56: TDC2016POA | Trilha PHP - Desenvolvendo um buscador com PHP e Elasticsearch

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"

}

},

Page 57: TDC2016POA | Trilha PHP - Desenvolvendo um buscador com PHP e Elasticsearch

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"

}

}

Page 58: TDC2016POA | Trilha PHP - Desenvolvendo um buscador com PHP e Elasticsearch

Arquitetura

Page 59: TDC2016POA | Trilha PHP - Desenvolvendo um buscador com PHP e Elasticsearch

Arquitetura

Page 60: TDC2016POA | Trilha PHP - Desenvolvendo um buscador com PHP e Elasticsearch

Buscador

Page 61: TDC2016POA | Trilha PHP - Desenvolvendo um buscador com PHP e Elasticsearch

Home BuscadorPossibilidade de buscar por nome de curso ou

instituição.

Page 62: TDC2016POA | Trilha PHP - Desenvolvendo um buscador com PHP e Elasticsearch

Busca AvançadaPossibilidade de buscar por nome, grau e modalidade

de curso e nome, município e UF da instituição.

Page 63: TDC2016POA | Trilha PHP - Desenvolvendo um buscador com PHP e Elasticsearch
Page 64: TDC2016POA | Trilha PHP - Desenvolvendo um buscador com PHP e Elasticsearch

Tecnologias e Ferramentas

Page 65: TDC2016POA | Trilha PHP - Desenvolvendo um buscador com PHP e Elasticsearch

Tecnologias e Ferramentas

Page 66: TDC2016POA | Trilha PHP - Desenvolvendo um buscador com PHP e Elasticsearch

Hospedagem Elasticsearch

Page 67: TDC2016POA | Trilha PHP - Desenvolvendo um buscador com PHP e Elasticsearch

Hospedagem Elasticsearch

Page 68: TDC2016POA | Trilha PHP - Desenvolvendo um buscador com PHP e 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)

Page 69: TDC2016POA | Trilha PHP - Desenvolvendo um buscador com PHP e Elasticsearch

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

Page 70: TDC2016POA | Trilha PHP - Desenvolvendo um buscador com PHP e Elasticsearch

PHPinga Pós TDC

A partir das 19hs

Malvadeza PubTv. do Carmo, 76 - Cidade Baixa,

Porto Alegre - RS