Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Desenvolvendo um buscador com PHP e Elasticsearch

Desenvolvendo um buscador com PHP e Elasticsearch

Elasticsearch é uma ferramenta de busca e análise de dados em tempo real, de código aberto. Nesta apresentação será demostrada soluções utilizadas para desenvolver um buscador, focado em disponibilizar uma ferramenta que possibilite realizar busca por cursos de graduação aprovados pelo MEC. Para isso será abordado conceitos como Web Crawler, armazenamento de dados em banco não relacional utilizando Elasticsearch, e como tudo isso pode ser desenvolvido utilizando PHP.

Fernando Silva

July 19, 2017
Tweet

More Decks by Fernando Silva

Other Decks in Programming

Transcript

  1. 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
  2. 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.
  3. 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
  4. 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
  5. 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
  6. Elasticsearch é uma plataforma de busca em tempo real, podendo

    ter uma pequena latência(normalmente um segundo). Near Realtime (NRT)
  7. 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
  8. Node é um servidor único que é parte do seu

    cluster, armazena seus dados, e participa da indexação e pesquisa. Node
  9. Um índice é um conjunto de documentos. Por exemplo, pode

    se ter um índice para dados de cliente, outro para catálogo de produtos. Index
  10. Dentro de um índice, você pode definir um ou mais

    tipos. Um tipo é uma categoria/partição lógica do seu índice. Type
  11. 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
  12. 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
  13. { "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
  14. 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.
  15. 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
  16. 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.
  17. 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
  18. 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
  19. 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
  20. 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
  21. 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'; }
  22. 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'];
  23. Obtendo dados do Elasticsearch Já 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'];
  24. Pesquisando em Elasticsearch <?php require 'vendor/autoload.php'; $client = Elasticsearch\ClientBuilder::create()->build(); $params

    = [ 'index' => 'meu_indice', 'type' => 'meu_tipo', 'body' => [ 'query' => [ 'match' => [ 'primeiro_campo' => 'meu primeiro campo' ], ], ], ];
  25. 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'] . "<br>"; } https://medium.com/@FernandoDebrand/utilizando-elasticsearch-com-php-8aba29d8d024
  26. 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.
  27. Web Crawler Web Crawler, é um robô que navega sistematicamente

    por páginas web com o motivo de fazer indexação.
  28. 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" } },
  29. 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" } }
  30. Busca Avançada Possibilidade de buscar por nome, grau e modalidade

    de curso e nome, município e UF da instituição.
  31. 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)