TDC2016POA | Trilha PHP - Desenvolvendo um buscador com PHP e Elasticsearch

Post on 09-Apr-2017

167 views 3 download

Transcript of TDC2016POA | Trilha PHP - Desenvolvendo um buscador com PHP e Elasticsearch

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": "ikaspary@senacrs.com.br ",

"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