Desenvolvimento

18 nov, 2015

ElasticSearch: como criar seu servidor de busca e ter um site até 278 vezes mais rápido

Publicidade

Já pensou se o seu site ficasse 278 vezes mais rápido? E usando uma única ferramenta – e o melhor: 100% gratuita! É como ter o Google em seu próprio site. Parece impossível? Calma… se segura aí, que eu vou te contar um pouco mais sobre isso tudo. Estou falando do ElasticSearch. Fiz alguns testes com ele e realmente consegui até 278 vezes mais desempenho em uma aplicação simples de busca.

Vou apresentar aqui um pouco sobre o ElasticSearch e como mostrar como ele pode deixar seu site rápido como foguete.

O Mundo Se Move Rápido. Seu Site Deveria Fazer o Mesmo
O Mundo Se Move Rápido. Seu Site Deveria Fazer o Mesmo

Por quê?

Antes de tomarmos novos rumos, novas decisões, é sempre bom perguntarmos por que faremos isso. Qual é nosso objetivo aqui e por que queremos alcançá-lo? Simples, nosso objetivo é ter o melhor desempenho possível em nosso site. O motivo parece óbvio: site rápido deixa nossos visitantes super felizes, claro. Mas não para por aí…

Uma pesquisa feita pela Akamai e pela Gomez.com aponta que, para cada segundo a mais que o usuário espera pelo carregamento de uma página, a satisfação dele com o site decai em 16%. Segundo eles, os usuários esperam que os sites carreguem em 2 segundos ou menos, sendo que eles abandonariam páginas que levassem mais de 3 segundos para carregar.

Há diversas outras conclusões impressionantes, que demonstram como desempenho é importante. Mas não vou entrar em maiores detalhes, pois o foco aqui é mostrar como obter esses resultados.

O fato é que seu site precisa ser rápido. Isso significa mais visitantes, mais possíveis clientes, mais conversões e mais lucro pra você. Por isso, o tempo de carregamento das páginas é extremamente importante. Pode ser uma das chaves para seu negócio dar certo de verdade e atrair clientes. E essa parece uma ótima razão para investir em melhorias de desempenho, não?!

Como?

Ok, já sabemos por que precisamos de mais desempenho. Agora como conseguir isso? Há diversas técnicas que podem trazer ganhos de desempenho, como otimização de consultas SQL. Mas eu vou abordar aqui o uso de uma ferramenta que pode proporcionar até 278 vezes mais velocidade ao seu site! Estou falando do ElasticSearch.

O que é o ElasticSearch

O ElasticSearch é um servidor de buscas baseado no Lucene, um software em Java especializado em indexação e buscas ultra rápidas. A ideia geral é ter uma “cópia” do seu banco de dados dentro do ElasticSearch, de forma otimizada para buscas. Digo “cópia” entre aspas, pois não é bem uma réplica das tabelas. Você tem que pensar em um tabela desnormalizada, de forma a não utilizar JOINs. Assim o desempenho será máximo.

Fique tranquilo. Você vai entender tudo isso logo, logo.

Baixando e instalando o ElasticSearch

Você deve baixar o ElasticSearch no site oficial (versões novas são liberadas com bastante frequência). Uma vez baixado, basta descompactar o pacote e colocar essa pasta onde você preferir.

O ElasticSearch não precisa de “instalação”. Ele é um servidor e, para que funcione, basta ser iniciado. Por isso não importa o local onde ele é extraído.

Iniciando o ElasticSearch

Dentro da pasta gerada pela extração, você verá uma estrutura parecida com esta:

├── LICENSE.txt
├── NOTICE.txt
├── README.textile
├── bin
├── config
├── data
├── lib
└── logs

O que interessa para nós, agora, é a pasta bin. Lá você verá o seguinte:

├── elasticsearch
├── elasticsearch-service-mgr.exe
├── elasticsearch-service-x64.exe
├── elasticsearch-service-x86.exe
├── elasticsearch.bat
├── elasticsearch.in.bat
├── elasticsearch.in.sh
├── plugin
├── plugin.bat
└── service.bat

Para iniciar o servidor do ElasticSearch, execute o script elasticsearch, no caso de usar Linux ou Mac; ou o elasticsearch.bat, se usar Windows.

Para isso, abra o terminal/prompt, entre no diretório bin e digite:

./elasticsearch

ou, no caso de você usar Windows:

elasticsearch.bat

Você deve ver uma tela parecida com esta:

Saída da Inicialização do ElasticSearch
Saída da inicialização do ElasticSearch

Pronto! O ElasticSearch já está iniciado e pronto pra funcionar. Ele é um servidor que roda, por padrão, na porta 9200. O cursor vai ficar piscando no final da tela, indicando que o processo está em execução.

Se quiser encerrá-lo, digite CTRL + C. Os demais comandos devem ser executados em uma nova aba ou janela do terminal/prompt, para não interromper a execução do Elastic Search.

Executando comandos no ElasticSearch

O ElasticSearch é um servidor. Logo, podemos interagir com ele por meio de sua API RESTful. Para isso, podemos usar qualquer cliente que faça requisições HTTP. Isso inclui o comando curl ou qualquer plugin ou extensão para navegadores.

Para facilitar a execução e a leitura das saídas, em vez de usar o comando curl no terminal, vou usar a extensão Advanced REST Client, para o Google Chrome.

Tela inicial do Advanced REST Client
Tela inicial do Advanced REST Client

Verificando a execução do ElasticSearch

O primeiro comando que vamos rodar é o mais básico de todos, apenas para ver se o ElasticSearch está rodando corretamente. Vamos fazer uma simples requisição GET para a URL http://localhost:9200.

Você verá a seguinte saída:

{
  "status" : 200,
  "name" : "Rocket Racer",
  "cluster_name" : "elasticsearch",
  "version" : {
    "number" : "1.7.3",
    "build_hash" : "05d4530971ef0ea46d0f4fa6ee64dbc8df659682",
    "build_timestamp" : "2015-10-15T09:14:17Z",
    "build_snapshot" : false,
    "lucene_version" : "4.10.4"
  },
  "tagline" : "You Know, for Search"
}

Os dados que nos importam agora são status com o valor 200,que significa execução bem sucedida, e number, dentro de version, que indica a versão do ElasticSearch.

Isso significa que já está tudo funcionando e podemos começar a brincar de inserir e buscar dados.

A estrutura dos dados

Os dados dentro do ElasticSearch não ficam exatamente em tabelas, como em um banco de dados relacional. Eles são salvos em estruturas JSON. Se você já trabalhou com NoSQL, como MongoDB, deve estar familiarizado com essa estrutura. A ideia é salvar os dados utilizados na sua view, de forma a trazer todos de uma única vez, sem precisar fazer JOIN. Isso otimiza bastante as consultas.

Como há algumas diferenças de nomenclatura, segue abaixo uma tabela associando os elementos do ElasticSearch com seus correspondentes em um banco de dados relacional.

MYSQL ELASTICSEARCH
Banco de Dados Index (índice)
Tabela Type (tipo)
Linha/Registro Document (documento)
Coluna Field (campo)
Schema Mapping (mapeamento)
Partition Shard

Como inserir dados

Para inserir documentos, faremos requisições PUT para uma URL seguindo o padrão a seguir, passando um JSON com as informações do documento: http://localhost:9200/nome_do_indice/nome_do_tipo/id_do_documento.

Para exemplificar, vamos criar um índice de produtos. Começaremos adicionando um documento do tipo notebook. Para isso, vamos fazer uma requisição PUT para a URL http://localhost:9200/produtos/notebooks/1, passando este JSON:

{
    "marca": "Dell",
    "modelo": "Notebook Dell Inspiron 14 I14 3443 B30 Intel Core - i5 4GB 1TB Windows 8.1 LED 14 HDMI",
    "tags": [
        "notebook",
        "Série 3000",
        "preto"
    ],
    "valor": 1800.00
}

Se você também estiver usando o Advanced REST Client, sua tela deve se parecer com esta:

Inserindo documento no ElasticSearch
Inserindo documento no ElasticSearch

Ao enviar a requisição, a resposta será a seguinte:

{
    _index: "produtos"
    _type: "notebooks"
    _id: "1"
    _version: 1
    created: true
}

Veja que o campo created está com o valor true. Isso indica que o documento foi criado com sucesso.

O nome do índice e do tipo também são retornados.

O índice _version indica a versão do documento. Como ele acabou de ser inserido, sua versão é 1. Quando for atualizado, sua versão passará a ser 2 e assim sucessivamente…

Se você executar a mesma requisição, apenas mudando, por exemplo, o modelo, verá a seguinte saída:

{
    _index: "produtos"
    _type: "notebooks"
    _id: "1"
    _version: 2
    created: false
}

Veja que _version passou a ser 2. E created passou a ser false, pois o documento de ID 1 já existia e foi apenas atualizado.

Como buscar dados

Agora vamos buscar o documento que acabamos de inserir. Para isso, vamos fazer uma requisição GET para a URL http://localhost:9200/produtos/notebooks/1.

Você verá o seguinte retorno:

{
    "_index": "produtos",
    "_type": "notebooks",
    "_id": "1",
    "_version": 2,
    "found": true,
    "_source": {
        "marca": "Dell",
        "modelo": "[Editado] Notebook Dell Inspiron 14 I14 3443 B30 Intel Core - i5 4GB 1TB Windows 8.1 LED 14 HDMI",
        "tags": [
            "notebook",
            "Série 3000",
            "preto"
        ],
        "valor": 1800.00
    }
}

Se quiséssemos buscar todos os documentos, bastaria fazer uma requisição GET para a URL http://localhost:9200/produtos/notebooks/_search.

Teremos esta saída:

{
    took: 30
    timed_out: false
    _shards: {
        total: 5
        successful: 5
        failed: 0
    }
    hits: {
        total: 1
        max_score: 1
        hits: [1] [
            0:  {
                _index: "produtos"
                _type: "notebooks"
                _id: "1"
                _score: 1
                _source: {
                    marca: "Dell"
                    modelo: "[Editado] Notebook Dell Inspiron 14 I14 3443 B30 Intel Core - i5 4GB 1TB Windows 8.1 LED 14 HDMI"
                    tags: [3] [
                        0:  "notebook"
                        1:  "Série 3000"
                        2:  "preto"
                    ]
                    valor: 1800
                }
            }
        ]
    }
}

O que nos interessa neste momento são os dados dentro de hits.

Você pode ver que o valor de total é 1. Isso significa que foi encontrado um documento. Dentro de hits há outro array hits, onde fica todos os resultados encontrados (neste caso, apenas um).

O valor score é a “pontuação” (seria mais correto traduzir como “peso”), que define a relevância do resultado conforme os filtros usados na busca. Como não usamos filtro algum, o score será 1.

Além das informações como nome do índice, tipo e ID, temos o objeto _source. Nele são armazenadas as informações do documento.

Podemos buscar pela palavra “preto”, usando a seguinte URL: http://localhost:9200/produtos/notebooks/_search?q=preto

O resultado será praticamente o mesmo. Mas você verá que o score mudou. Isso devido à relevância que o ElasticSearch deu a essa palavra dentro do documento.

Conclusão

O ElasticSearch é uma ferramenta incrivelmente poderosa. A ideia geral é simples, mas exitem inúmeros recursos e configurações mais detalhadas para otimizar as buscas.

Ele é uma ótima alternativa para acelerar o carregamento de suas páginas.

Para onde ir agora?

O que eu mostrei aqui é o básico do ElasticSearch. É possível ir muito além: otimizar as consultas, fazer filtros mais detalhados e muito mais.

Neste vídeo eu mostro como eu obtive 278 vezes mais desempenho em uma simples aplicação de busca. Eu não apenas mostro o que consegui, mostro como consegui esse incrível resultado.

Vou te dar a receita exata para você testar em casa. Você pode facilmente conseguir resultados semelhantes aos meus.

Então, não deixe pra depois!

Clique aqui agora e assista ao vídeo onde mostro como obter esses resultados.

Você vai se surpreender ao ver como é simples deixar seu site rápido como um foguete!

banner artigo