Slide 1

Slide 1 text

Desenvolvendo um buscador com PHP e Elasticsearch Fernando Silva @FernandoDebrand

Slide 2

Slide 2 text

Sobre mim! Fernando Silva Analista de Desenvolvimento

Slide 3

Slide 3 text

Visão Geral ◎ Comunidade ◎ Stack Open Source 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

Slide 4

Slide 4 text

Comunidade Elastic

Slide 5

Slide 5 text

Comunidade Elastic https://www.elastic.co/community Forums | Meetups | Canais IRC Freenode

Slide 6

Slide 6 text

Comunidade Elastic

Slide 7

Slide 7 text

Stack Open Source Elastic

Slide 8

Slide 8 text

Stack Open Source Elastic

Slide 9

Slide 9 text

Elasticsearch

Slide 10

Slide 10 text

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.

Slide 11

Slide 11 text

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

Slide 12

Slide 12 text

Arquitetura Elasticsearch

Slide 13

Slide 13 text

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

Slide 14

Slide 14 text

Conceitos Básicos

Slide 15

Slide 15 text

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

Slide 16

Slide 16 text

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

Slide 17

Slide 17 text

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

Slide 18

Slide 18 text

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

Slide 19

Slide 19 text

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

Slide 20

Slide 20 text

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

Slide 21

Slide 21 text

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

Slide 22

Slide 22 text

Shards & Replicas

Slide 23

Slide 23 text

Orientado a documentos

Slide 24

Slide 24 text

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

Slide 25

Slide 25 text

{ "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

Slide 26

Slide 26 text

API RESTful / Clients

Slide 27

Slide 27 text

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.

Slide 28

Slide 28 text

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

Slide 29

Slide 29 text

Comparação de Terminologias

Slide 30

Slide 30 text

Terminologias Elasticsearch MySQL Index Database Type Table Document Row Field Column Mapping Schema Shard Partition

Slide 31

Slide 31 text

Quando usar Elasticsearch?

Slide 32

Slide 32 text

Grandes projetos que usam Elasticsearch

Slide 33

Slide 33 text

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.

Slide 34

Slide 34 text

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

Slide 35

Slide 35 text

Instalando e Configurando

Slide 36

Slide 36 text

Instalação Faz o download em https://www.elastic.co/downloads/elasticsearch, descompactar 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

Slide 37

Slide 37 text

Testando com Postman

Slide 38

Slide 38 text

Utilizando Docker Baixe 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://store.docker.com/images/elasticsearch

Slide 39

Slide 39 text

Como usar com PHP

Slide 40

Slide 40 text

Instalando Pacote Elasticsearch para PHP Crie um diretório “elastic_php”, cria um arquivo composer.json com o seguinte conteúdo. { "require": { "elasticsearch/elasticsearch": "~5.0" } } $ composer install

Slide 41

Slide 41 text

Conectando Elasticsearch com PHP Crie um arquivo index.php dentro do diretório “elastic_php” e adicione o seguinte código. build(); if ($client) { echo 'conectado'; }

Slide 42

Slide 42 text

Indexação de dados no Elasticsearch Já estamos conectados ao Elasticsearch. Vamos criar um índice com alguns dados. 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'];

Slide 43

Slide 43 text

Obtendo dados do Elasticsearch Já temos um índice criado, vamos obter os dados a partir dele. build(); $params = [ 'index' => 'meu_indice', 'type' => 'meu_tipo', 'id' => 'meu_id2', ]; $response = $client->get($params); echo $response['_source']['primeiro_campo'];

Slide 44

Slide 44 text

Pesquisando em Elasticsearch build(); $params = [ 'index' => 'meu_indice', 'type' => 'meu_tipo', 'body' => [ 'query' => [ 'match' => [ 'primeiro_campo' => 'meu primeiro campo' ], ], ], ];

Slide 45

Slide 45 text

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_campo'] . "
"; } https://medium.com/@FernandoDebrand/utilizando-elasticsearch-com-php-8aba29d8d024

Slide 46

Slide 46 text

Case uPlanAcademic.com

Slide 47

Slide 47 text

Objetivo

Slide 48

Slide 48 text

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.

Slide 49

Slide 49 text

Arquitetura

Slide 50

Slide 50 text

Arquitetura

Slide 51

Slide 51 text

Arquitetura

Slide 52

Slide 52 text

Web Crawler Web Crawler, é um robô que navega sistematicamente por páginas web com o motivo de fazer indexação.

Slide 53

Slide 53 text

Web Crawler

Slide 54

Slide 54 text

Web Crawler - CAPTCHA

Slide 55

Slide 55 text

CAPTCHA

Slide 56

Slide 56 text

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" } },

Slide 57

Slide 57 text

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" } }

Slide 58

Slide 58 text

Arquitetura

Slide 59

Slide 59 text

Arquitetura

Slide 60

Slide 60 text

Buscador

Slide 61

Slide 61 text

Home Buscador Possibilidade de buscar por nome de curso ou instituição.

Slide 62

Slide 62 text

Busca Avançada Possibilidade de buscar por nome, grau e modalidade de curso e nome, município e UF da instituição.

Slide 63

Slide 63 text

No content

Slide 64

Slide 64 text

Tecnologias e Ferramentas

Slide 65

Slide 65 text

Tecnologias e Ferramentas

Slide 66

Slide 66 text

Hospedagem Elasticsearch

Slide 67

Slide 67 text

Hospedagem Elasticsearch

Slide 68

Slide 68 text

Referências/Links ◎ 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) ◎ DomCrawler (https://symfony.com/doc/current/components/dom_crawler.html) ◎ Laravel and Elasticsearch (https://laravel-news.com/laravel-and-elasticsearch) ◎ Utilizando Elasticsearch com PHP (https://medium.com/@FernandoDebrand/utilizando-elasticsearch-com-php- 8aba29d8d024)

Slide 69

Slide 69 text

Obrigado! Perguntas? speakerdeck.com/fernandodebrando fernando.poa.br