
Iniciando com Elasticsearch
Elasticsearch é um mecanismo de busca open source, desenvolvido ‘em cima’ do Apache Lucene, uma engine de pesquisa full-text. Podemos dizer que o Elasticsearch abstrai a api do Lucene, que apresenta uma certa complexidade e curva de aprendizado alta. Mas o Elasticsearch não é somente uma engine de pesquisa full-text:
- disponibiliza dados em tempo real
- pode ser distribuído e configurado para apresentar alta disponibilidade
- é orientado a documentos
- disponibiliza uma api restFul
O Elasticsearch armazena dados em forma de documentos. Ele disponibiliza os documentos no formato JSON, que é suportado pela maioria das linguagens de programação modernas e também é o formato usado pelo movimento NoSQL.
Em Elasticsearch, um documento pertence a um Tipo e esses tipos estão localizados dentro de um Index. Podemos dizer, fazendo uma analogia com banco de dados relacionais, que os Indices são os banco de dados, os Tipos são as Tabelas, documentos são os registros das tabelas e os campos são as colunas das tabelas.
[code language=”ruby”]
{
“email”: “[email protected]”,
“first_name”: “John”,
“last_name”: “Smith”,
“info”: {
“bio”: “Eco-warrior and defender of the weak”,
“age”: 25,
“interests”: [ “dolphins”, “whales” ]
},
“join_date”: “2014/05/01”
}
[/code]
A palavra index pode ter diferentes significados dependendo do contexto. Indexes, ou Indices são como banco de dados, como explicado anteriormente. Indexar um documento é armazená-lo em um Index, para que ele possa ser consultado posteriormente. O Elasticsearch utiliza uma técnica chamada índice invertido que permite com que os usuários executem procuras rápidas por palavras-chave e localizem os documentos que correspondem a uma determinada consulta.
Existe também o conceito de node (nó) que é uma instância do Elasticsearch em execução. Um cluster é um grupo de nós com o mesmo cluster.name que trabalham juntos e compartilham dados para prover escalabilidade e alta disponibilidade.
Instalação
Para instalar o Elasticsearch é necessário a última versão do java estar instalada na máquina. Você pode instalar através do site www.java.com. E fazer download do Elasticserch em elasticsearch.org/download. Em produção você pode instalar usando os pacotes Debian ou RPM na página de download ou usar Puppet ou Chef.
Após baixar o pacote zipado e desempacotá-lo, você poderá executá-lo em um terminal:
[code]
./bin/elasticsearch
[/code]
Adicionando o parametro -d você poderá executálo em background.
Já sabemos que o Elasticsearch disponibiliza uma api restFul. Logo podemos fazer um teste executado o seguinte comando:
[code]
curl ‘http://localhost:9200/?pretty’
[/code]
Que deverá retornar:
[code]
{
“status”: 200,
“name”: “Shrunken Bones”,
“version”: {
“number”: “1.4.0”,
“lucene_version”: “4.10”
},
“tagline”: “You Know, for Search”
}
[/code]
Significa que seu cluster está em execução.
Tentando entender a bagaça
Vamos analisar um exemplo simples utilizando a modelagem do twitter:
- Indexar um documento por usuário que contem informações de um único usuário do twitter
- cada documento será do Tipo user
- esse tipo estará dentro de um Index twitter
- esse Index estará dentro de um cluster Elasticsearch
Primeiramente, iremos criar um usuário do twitter:
[code]
curl -XPUT ‘http://localhost:9200/twitter/user/tasafo’ -d ‘{ “name” : “TáSafo” }’
[/code]
O comando acima deverá retornar:
[code]
{“_index”:”twitter”,”_type”:”user”,”_id”:”tasafo”,”_version”:1,”created”:true}
[/code]
Para recuperar os dados salvos anteriormente, poderemos executar o seguinte comando:
[code]
curl ‘http://localhost:9200/twitter/user/tasafo’
[/code]
Lembrando:
- twitter é o index
- user é o tipo
- tasafo é o id que identifica o documento
Agora iremos criar um tipo tweet que faz referência a uma mensagem que o usuário twitou:
[code]
curl -XPUT ‘http://localhost:9200/twitter/tweet/1’ -d ‘
{
“user”: “tasafo”,
“postDate”: “Sat, 09 Aug 2014 19:50:57 -0300”,
“message”: “Testando Elasticsearch. Safo até agora!”
}’
[/code]
Vamos verificar os dados que foram adicionados:
[code]
curl -XGET ‘http://localhost:9200/twitter/tweet/1?pretty=true”>http://localhost:9200/twitter/tweet/1?pretty=true’
[/code]
Mais uma twitada:
[code]
curl -XPUT ‘http://localhost:9200/twitter/tweet/2’ -d ‘
{
“user”: “tasafo”,
“postDate”: “Sat, 09 Aug 2014 19:52:57 -0300”,
“message”: “Testando Elasticsearch. Essa parada é muito fácil!”
}’
[/code]
Agora vamos encontrar todos os twitts de tasafo:
[code]
curl -XGET ‘http://localhost:9200/twitter/tweet/_search?q=user:tasafo&pretty=true”>http://localhost:9200/twitter/tweet/_search?q=user:tasafo&pretty=true’
[/code]
O comando irá retornar o seguinte documento:
[code]
{
“took” : 3,
“timed_out” : false,
“_shards” : {
“total” : 5,
“successful” : 5,
“failed” : 0
},
“hits” : {
“total” : 2,
“max_score” : 0.30685282,
“hits” : [ {
“_index” : “twitter”,
“_type” : “tweet”,
“_id” : “2”,
“_score” : 0.30685282,
“_source”:{“user”:”tasafo”, “postDate”:”Sat, 09 Aug 2014 19:51:57 -0300 “, “message”:”Testando Elasticsearch. Essa parada é muito fácil!”}
}, {
“_index” : “twitter”,
“_type” : “tweet”,
“_id” : “1”,
“_score” : 0.30685282,
“_source”:{“user”:”tasafo”, “postDate”:”Sat, 09 Aug 2014 19:51:57 -0300 “, “message”:”Testando Elasticsearch. Safo até agora!”}
} ]
}
}
[/code]
Para queries mais complexas, podemos usar JSON ao invés de query string, utilizando a Query DSL:
[code]
curl -XGET ‘http://localhost:9200/twitter/tweet/_search?pretty=true’ -d ‘
{
“query” : {
“match” : { “user”: “tasafo” }
}
}’
[/code]
Agora vamos testar a pesquisa full-text. Para isso usaremos a query dsl com o campo message:
[code]
curl -XGET ‘http://localhost:9200/twitter/tweet/_search?pretty=true’ -d ‘
{
“query” : {
“match” : {
“message”: “testando safo”
}
}
}’
[/code]
Por padrão, o Elasticsearch ordena o resultado por sua relevância. O comando irá retornar todos os resultados que contenham a palavra testando e ou safo no campo message.
Conclusão
Esse foi um tutorial simples para se iniciar os estudos de Elasticsearch. É claro que ele possui inúmeras outras features, como sugestão, geolocalização, analytics e muitas outras. Nenhuma configuração hard é necessária para começar e já existem apis em várias linguagens. Em outros artigos podemos verificar o funcionamento dessas apis.
9 Comentários
Pingback:
Bruno Louvem
Ótimo post, eu abri essa pagina sem saber nada de elasticSearch e já entendi do que se trata, e como funciona, favoritei sem pensar.
Pingback:
Programador Livre (@berlottocdd)
Tchê. que baita post ! Muito obrigado !
Simples e direto, vou postar lá no ProgramadorLivre
http://facebook.com/ProgramadorLivre
Roberto Beraldo Chaiben
O ElasticSearch é fantástico. Eu consegui até 278 Vezes Mais Desempenho com ele! Expliquei tudo aqui http://rberaldo.com.br/elasticsearch-servidor-busca/
Bruno Borges
Straight to the point! Muito bom!
Lazaro Jr
Ótimo artigo, parabéns.
Tenho uma duvida: É comum usa-lo como unico banco de dados de um aplicação ou ele é usado para tarefas auxiliares?
Paulo Moura
Valew Lazaro. Respondendo a sua pergunta: sim, é possível usar o ES como banco de dados principal. No entanto, isso vai depender de sua aplicação. O ES, por exemplo não possui transações e não garante integridade, logo é necessário estudar as necessidades do projeto. Mas, o mais comum é usar o ES juntamente com outro banco de dados com suporte a ACID.
Helen
Muito legal o artigo, parabéns!!!
Estou buscando algum repositório de .conf. Você conhece algum?