O documento apresenta uma introdução ao Elasticsearch, descrevendo suas principais características como base de dados NoSQL para conteúdos JSON, indexação rápida e distribuída. Explica a estrutura de clusters, índices, tipos e documentos, além de operações como pesquisa, atualização e remoção.
2. Elasticsearch
Base de dados NoSQL para conteúdos JSON
Muito rápida: documentos indexados em < 1s
Distribuída
Baseada no Lucene
Puramente REST
Suporte a grafos
Open source
Elasticsearch 2
3. Colecção de servidores (nós)
Um único mestre em cada instante
Descoberta automática ou explícita
Elasticsearch 3
Cluster
4. Os índices são distribuídos por shards – por
omissão 5 shards e 1 réplica por cluster
Forma de separar fisicamente conteúdos
Definidos aquando da criação do índice
Transparente
É possível fornecer o algoritmo de sharding
Elasticsearch 4
Shards
8. Campos
Os documentos contêm campos
Sempre presentes:
_id: chave primária (string)
_index: índice onde o documento existe (string)
_type: tipo onde o documento existe (string)
_uid: _id + _type
Opcionais:
_timestamp: data e hora de criação (date)
_all: todos os campos concatenados (string)
_source: JSON original (string)
_ttl: duração (date)
_meta: metadados (object)
_parent
_routing
Têm um tipo de dados associado
Elasticsearch 8
9. string
long, integer, short, byte,
double, float
date
boolean
binary
geo_point
geo_shape
object
nested
ip
completion
token_count
arrays (de qualquer tipo)
Outros (extensões)
Elasticsearch 9
Tipos de Dados
10. Id gerado automaticamente
POST /website/blog
{
"title" : “My Blog",
"url" : "http://my/blog",
"tags" : [ "development" ]
}
Id explícito
POST /website/blog/1
{
"title" : "My Blog",
"url" : "http://my/blog",
"tags" : [ " development " ]
}
Elasticsearch 10
Criar um Documento
11. Parcial
POST
/website/blog/1/_update
{
"doc" :
{
"tags" : [ "testing" ],
"views": 1
}
}
Total (substituir)
POST
/website/blog/1/_update
{
"title" : "My Blog",
"url" : "http://my/blog",
"tags" : [ "testing" ]
}
Elasticsearch 11
Actualizar um Documento
12. Actualizar um Documento por Script
Adicionar campos ou modificar campos existentes por meio de scripts
"scripted_upsert": true,
"script": {
"inline": "if (ctx._source.likes == null) { ctx._source.likes = 0 };
ctx._source.likes += count",
"params": {
"count": 1
}
}
Elasticsearch 12
14. Mapeamento
Criado ao nível do índice ou do tipo, implícita ou explicitamente
Não é possível modificar, apenas adicionar
Obrigatórios ou não
PUT website
{
"mappings": {
"blog": {
"dynamic" : "strict",
"properties": {
"title": {
"type": "string",
"analyzer": "standard"
}
}
}
}
}
Elasticsearch 14
19. Ordenação de documentos encontrados por
relevância
Campos:
Informação do cluster
Tempo que demorou
Encontrou ou não
_score: relevância
_source: documento
Elasticsearch 19
Resultados de Pesquisas
21. É possível fazer ordenação e incluir resultados
calculados (scripts)
"script": {
"inline": "_value.toUpperCase()"
}
Elasticsearch 21
Scripts
22. Percolator
Primeiro definir a pesquisa
Verificar, por documento, que pesquisas é que cumpre
PUT products/.percolator/high_ratings
{
"query" : {
"range": {
"ratings": {
"gte": 4
}
}
}
}
GET products/product/iPhone6s/_percolate
Elasticsearch 22
23. Relações
Não são possíveis JOINs, mas há algumas
alternativas
Relações pai/filho: has_child, has_parent
Objectos embebidos
Lookup de termos: terms com type e id
Elasticsearch 23
24. Relevância
Term Frequency (TF), Inverse Document
Frequency (IDF), Field Length Norm (FLN)
Possível fornecer funções de scoring
Possível pedir explicação sobre o processo
Elasticsearch 24
30. Aliases de Índices
Abstrair um ou mais índices, opcionalmente com um filtro
Útil para índices “móveis" (mês, ano, país, zona, etc)
Apenas útil para queries
POST /_aliases
{
"actions" : [ {
"add" : {
"indices" : [ "social-2015", "social-2016" ],
"alias" : "social-testing",
"filter" : {
"term" : {
"tag" : "testing"
}
}
}
} ]
} Elasticsearch 30
31. Modelos de Alias
Adiciona a um alias um tipo quando este for criado
POST /_template/social
{
"order": 0,
"template": "social-*",
"settings": {
"index": {
"refresh_interval": "5s"
}
},
"mappings": {},
"aliases": {
"social": {}
}
}
Elasticsearch 31