Este documento discute o desenvolvimento de um buscador com PHP e Elasticsearch. Ele aborda a comunidade Elasticsearch, as características e arquitetura do Elasticsearch, exemplos de uso com PHP e ferramentas como o Docker. Além disso, apresenta um caso de uso para um sistema de planejamento acadêmico que indexa dados de cursos e instituições no Elasticsearch.
3. 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
10. 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.
11. 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
13. 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
15. 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
16. Elasticsearch é uma plataforma de busca em tempo
real, podendo ter uma pequena latência(normalmente
um segundo).
Near Realtime (NRT)
17. 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
18. Node é um servidor único que é parte do seu cluster,
armazena seus dados, e participa da indexação e
pesquisa.
Node
19. Um índice é um conjunto de documentos. Por
exemplo, pode se ter um índice para dados de cliente,
outro para catálogo de produtos.
Index
20. Dentro de um índice, você pode definir um ou mais
tipos. Um tipo é uma categoria/partição lógica do seu
índice.
Type
21. 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
24. 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
27. 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.
28. 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
33. 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.
34. 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
36. 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
38. 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
40. 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
41. 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 = ElasticsearchClientBuilder::create()->build();
if ($client) {
echo 'conectado';
}
42. Indexação de dados no
Elasticsearch
Já estamos conectados ao Elasticsearch. Vamos criar um índice com
alguns dados.
<?php
require 'vendor/autoload.php';
$client = ElasticsearchClientBuilder::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'];
43. Obtendo dados do Elasticsearch
Já temos um índice criado, vamos obter os dados a partir dele.
<?php
require 'vendor/autoload.php';
$client = ElasticsearchClientBuilder::create()->build();
$params = [
'index' => 'meu_indice',
'type' => 'meu_tipo',
'id' => 'meu_id2',
];
$response = $client->get($params);
echo $response['_source']['primeiro_campo'];
48. 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.