Slide 1

Slide 1 text

Elasticsearch

Slide 2

Slide 2 text

Hello! Eu sou Bruno Souza! ➔ Analista de Sistemas - MRE pela empresa Datainfo ➔ Graduado em Análise e Desenvolvimento de Sistemas - UNIP ➔ Pós-graduando em Big Data e Ciência de Dados - PUC Minas ➔ ZCPE ➔ Microsoft Specialist - HTML5, CSS e JS @Bruno_HSouza brunohsouza

Slide 3

Slide 3 text

O que é o Elasticsearch?

Slide 4

Slide 4 text

● É uma search engine (mecanismo de busca) distribuída e indexada ● Desenvolvido utilizando o Apache Lucene ● Permite armazenar, buscar e analisar grandes volumes de dados rapidamente ● Performance próxima à tempo (near real-time) ● Arquitetura escalonável e distribuída em clusters e nós ● Open-Source ● Schema Free

Slide 5

Slide 5 text

Vantagens ao se usar o Elasticsearch

Slide 6

Slide 6 text

● Estrutura de alta disponibilidade ● Backup de forma fácil ● Tratamento de redundâncias ● Detecção de anomalias ● Camada de seguraça ● A.I. e Machine Learning ● Balanceamento de carga ● Busca textual e fonética com suporte à vários idiomas

Slide 7

Slide 7 text

Elastic Stack É um conjunto de ferramentas que fazem parte da Elastic e possibilitam maiores funcionalidades das mais diversas atividades, oferecendo um maior suporte para a utilização do ElasticSearch. ELASTICSEARCH LOGSTASH KIBANA BEATS

Slide 8

Slide 8 text

No content

Slide 9

Slide 9 text

Configurações

Slide 10

Slide 10 text

● elasticsearch.yml - configura o Elasticsearch ● jvm.options - configuração da JVM do Elasticsearch ● log4j2.properties - configuração dos logs do Elasticsearch

Slide 11

Slide 11 text

Ecossistema

Slide 12

Slide 12 text

CLUSTER ● Coleção de um ou mais nós (nodes) ● Identificados por um nome único (cluster.name)

Slide 13

Slide 13 text

Nodes ● Instância do servidor que faz parte do cluster ● Faz parte do Cluster ● Identificado com um hash UUID assinado quando inicializado ● Possuem roles ○ Master Node - Responsável pelas configurações e alterações de um cluster ○ Data Node - Responsável pelas operações relacionadas a dados ○ Ingest Node - Responsável pelo pré-processamentos dos dados

Slide 14

Slide 14 text

Index ● Namespace que aponta para um ou mais shards ● Utilizado para a maioria das operações ● Identificado com um nome dado pelo usuário quando inicializado

Slide 15

Slide 15 text

Type ● Partição lógica do index que permite armazenar diferentes tipos de documentos ● Utilizado para a maioria das operações de CRUD ● Identificado com um nome dado pelo usuário quando inicializado ● Depreciado na versão 7

Slide 16

Slide 16 text

Document ● Unidade única de informação indexada ● Onde os dados são representados ● Possui uma sintaxe JSON

Slide 17

Slide 17 text

Shard ● Instância única do Apache Lucene ● Acessíveis apenas pelo index ● Gerenciados automaticamente pelo Elasticsearch ● Podem ser: ○ Primários - fragmentos de um index ○ Replicas - cópias exatas dos shards ● Possibilita escalonar horizontalmente o volume ● Possibilita distribuir e paralelizar operações, melhorando a performance e throughput

Slide 18

Slide 18 text

Replica ● Cópia exata do shard ● Provê uma arquitetura de alta disponibilidade ● Permite o escalonamento horizontal do volume ● Possibilita paralelizar operações, melhorando a performance e throughput

Slide 19

Slide 19 text

SHARD 0 REPLICA 1 SHARD 1 REPLICA 0 CLUSTER NODE 1 NODE 2

Slide 20

Slide 20 text

Como Funciona?

Slide 21

Slide 21 text

Mapping ● Processo que define como um documento e seus campos são armazenados e indexados ● Após criado não pode ser alterado ● Permite definir se o campo será full-text ● Possibilita definir os tipos dos dados ● Possibilita definir o formato dos dados ● Possibilita especificar regras de controle dinâmicas

Slide 22

Slide 22 text

Analyzers ● Processo de conversão de texto em tokens ou termos ● Fazem um tratamento de dados ● Os termos e tokens são adicionados aos índices reversos ● Executado no momento de inserção e busca de dados ● Possui 3 blocos de construção: ○ Character Filters ○ Tokenizer ○ Token Filters

Slide 23

Slide 23 text

Index Reverso Term Document Locations doc1 doc3 doc5 doc34 doc56 doc753 doc63 doc5 doc436 doc3 doc54 Word Split Normalize Clean Up arnim crystal dormammu drax goliath lukecage madripoor rocketraccoon steverogers x-factor wolverine 222 12 148 52 982 15 563 51 48 78 916

Slide 24

Slide 24 text

Fazendo Operações

Slide 25

Slide 25 text

Acessando o servidor do Elasticsearch ● Acessando a url inicial do Elasticsearch é apresentado: { "name" : "7a2247c0ed43", "cluster_name" : "docker-cluster", "cluster_uuid" : "fl1Q6qP7SYW5kppXafOBrA", "version" : { "number" : "7.1.1", "build_flavor" : "default", "build_type" : "docker", "build_hash" : "7a013de", "build_date" : "2019-05-23T14:04:00.380842Z", "build_snapshot" : false, "lucene_version" : "8.0.0", "minimum_wire_compatibility_version" : "6.8.0", "minimum_index_compatibility_version" : "6.0.0-beta1" }, "tagline" : "You Know, for Search" }

Slide 26

Slide 26 text

Cluster Health ● GET /_cat/health?v ○ Verde - tudo ok ○ Amarelo - todos os dados disponíveis mas, alguma réplica não está alocada ○ Vermelho - algum dado indisponível

Slide 27

Slide 27 text

Criando Índices PUT darkmira/15 { "settings" : { "number_of_shards" : 3, "number_of_replicas" : 2 } }

Slide 28

Slide 28 text

Criando Documentos PUT darkmira/_doc/1 { "user" : "bruno", "post_date" : "2019-06-08T14:12:12", "message" : "trying out Elasticsearch" }

Slide 29

Slide 29 text

Alterando Documentos PUT darkmira/_doc/1 { "script" : { "source": "ctx._source.counter += params.count", "lang": "painless", "params" : { "tag" : "blue" } } }

Slide 30

Slide 30 text

Deletando Documentos DELETE darkmira/_doc/1 { "_index" : "darkmira", "_type" : "_doc", "_id" : "1", "_version" : 3, "result" : "deleted", "_shards" : { "total" : 3, "successful" : 1, "failed" : 0 }, "_seq_no" : 2, "_primary_term" : 1 }

Slide 31

Slide 31 text

Recuperando Documentos GET darkmira/_doc/1 Response: { "_index" : "darkmira", "_type" : "_doc", "_id" : "1", "_version" : 1, "_seq_no" : 10, "_primary_term" : 1, "found": true, "_source" : { "user" : "bruno", "date" : "2019-06-T14:12:12", "likes": 0, "message" : "trying out Elasticsearch" } }

Slide 32

Slide 32 text

Recuperando Todos os Documentos GET darkmira/_search/ { "query": { "match_all": {} } }

Slide 33

Slide 33 text

Bool Query ● Uma terminologia que encontra documentos por meio de combinações booleanas ● Possui alguns tipos como: ○ must - O termo deve aparecer obrigatoriamente no resultado e contribuir para o score ○ filter - O termo deve aparecer obrigatoriamente no resultado, mas não contribui com o score ○ should - O termo deve aparecer não obrigatoriamente no resultado ○ must_not - O termo não deve aparecer no resultado

Slide 34

Slide 34 text

Bool Query GET darkmira/_search { "query": { "bool": { "should": [ { "match": { "user":"bruno"}}, { "match": { "message": "Elasticsearch" }} ] } } }

Slide 35

Slide 35 text

Fuzzy Search ● Usa similaridade baseada na distância de Levenshtein ● Gera termos correspondentes que estão dentro do padrão especificado em fuziness ● Utiliza o parâmetro transportations para buscar por palavras com letras fora da ordem. Ex.: Buscar por PPH, quando na verdade gostaria de buscar PHP ● Podem ser de váriso tipos: ○ match query + fuzziness ○ fuzzy query ○ suggesters

Slide 36

Slide 36 text

Fuzzy Search GET darkmira/_search { "query": { "match" : { "message" : { "query": "Raca Nega", "fuzziness":"2", "prefix_length": 0, "max_expansions": 100 } } } }

Slide 37

Slide 37 text

Otimizando Buscas

Slide 38

Slide 38 text

Busque a menor quantidade de parâmetros possível PUT movies { "mappings": { "properties": { "name_and_plot": { "type": "text" }, "name": { "type": "text", "copy_to": "name_and_plot" }, "plot": { "type": "text", "copy_to": "name_and_plot" } } } }

Slide 39

Slide 39 text

PUT index { "mappings": { "properties": { "price_range": { "type": "keyword" } } } } PUT index/_doc/1 { "designation": "colher", "price": 13, "price_range": "10-100" } GET index/_search { "aggs": { "price_ranges": { "terms": { "field": "price_range" } } } } Pré-indexando dados

Slide 40

Slide 40 text

● Considere mapear identificadores como keywords ● Ordene os índices na medida do possível

Slide 41

Slide 41 text

E o PHP?

Slide 42

Slide 42 text

Elastica ● Lib Open-source que fornece um client para trabalhar com o Elasticsearch ● Oferece uma API de fácil implementação ● Oferece boa documentação com alguns exemplos de uso ● Dados do Git Hub: 1.877 642 240

Slide 43

Slide 43 text

elasticsearch-php ● Lib oficial do Elasticsearch para PHP ● Oferece uma API REST de fácil implementação ● Oferece boa documentação no site oficial da Elastic ● Oferece uma grande quantidade de funcionalidades ● Dados do Git Hub: 3.241 683 102

Slide 44

Slide 44 text

Exemplo de implementação https://github.com/brunohsouza/elastica-example

Slide 45

Slide 45 text

# Read the documentation: https://github.com/FriendsOfSymfony/FOSElasticaBundle/blob/master/Resourc es/doc/setup.md fos_elastica: clients: default: { host: localhost, port: 9200 } serializer: serializer: jms_serializer indexes: darkmira: client: default types: _doc: properties: user: ~ message: { boost: 10, analyzer: elastica-analyzer}

Slide 46

Slide 46 text

objClient = new Client(); } }

Slide 47

Slide 47 text

private $index; /** * Creates an index * @param string $indexName * @return Index */ public function createIndex(string $indexName) :Index { $this->index = $this->client->getIndex($indexName); if (!$this->index->exists()) { $this->index->create(); } return $this->index; }

Slide 48

Slide 48 text

Conclusão

Slide 49

Slide 49 text

O Elasticsearch é uma ferramenta muito poderosa que oferece além da otimização de buscas: ● melhora de performance da aplicação ● melhora a experiência de usuário ao tratar buscas de uma forma mais amigável ● suporta grandes volumes de dados sem perder performance ● fácil integração independente de linguagem e S.O. através de sua API ● fácil monitoração de suas atividades através de sua stack

Slide 50

Slide 50 text

Obrigado!

Slide 51

Slide 51 text

Avalie no Joind.in