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

BUSCAS OTIMIZADAS E INTELIGENTES COM PHP E ELASTICSEARCH.

BUSCAS OTIMIZADAS E INTELIGENTES COM PHP E ELASTICSEARCH.

Uma abordagem de forma geral da arquitetura, estrutura e formas de busca referentes ao Elastic Search

BRUNO SOUZA

June 08, 2019
Tweet

More Decks by BRUNO SOUZA

Other Decks in Technology

Transcript

  1. 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
  2. • É 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
  3. • 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
  4. 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
  5. • elasticsearch.yml - configura o Elasticsearch • jvm.options - configuração

    da JVM do Elasticsearch • log4j2.properties - configuração dos logs do Elasticsearch
  6. CLUSTER • Coleção de um ou mais nós (nodes) •

    Identificados por um nome único (cluster.name)
  7. 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
  8. 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
  9. 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
  10. Document • Unidade única de informação indexada • Onde os

    dados são representados • Possui uma sintaxe JSON
  11. 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
  12. 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
  13. 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
  14. 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
  15. 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
  16. 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" }
  17. 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
  18. Criando Documentos PUT darkmira/_doc/1 { "user" : "bruno", "post_date" :

    "2019-06-08T14:12:12", "message" : "trying out Elasticsearch" }
  19. Alterando Documentos PUT darkmira/_doc/1 { "script" : { "source": "ctx._source.counter

    += params.count", "lang": "painless", "params" : { "tag" : "blue" } } }
  20. 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 }
  21. 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" } }
  22. 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
  23. Bool Query GET darkmira/_search { "query": { "bool": { "should":

    [ { "match": { "user":"bruno"}}, { "match": { "message": "Elasticsearch" }} ] } } }
  24. 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
  25. Fuzzy Search GET darkmira/_search { "query": { "match" : {

    "message" : { "query": "Raca Nega", "fuzziness":"2", "prefix_length": 0, "max_expansions": 100 } } } }
  26. 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" } } } }
  27. 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
  28. 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
  29. 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
  30. # 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}
  31. <?php namespace App\Controller; use App\Service\IndexService; use Elastica\Client; class IndexController extends

    Controller { private $objClient; public function __construct() { $this->objClient = new Client(); } }
  32. 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; }
  33. 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