Ricardo Peres
@rjperes75
http://netponto.org1ª Reunião Presencial em Aveiro - 7/5/2016
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
Colecção de servidores (nós)
Um único mestre em cada instante
Descoberta automática ou explícita
Elasticsearch 3
Cluster
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
Índices
Colecção de tipos
Possui um schema
Semelhante a uma base de dados no
mundo relacional
Elasticsearch 5
Tipo
Colecção de documentos
Possui um schema, herdado do índice
Semelhante a uma tabela no mundo
relacional
Elasticsearch 6
Documentos
JSON
Existem num tipo
Têm um identificador único
Versão (1, …)
Têm um schema
Podem ter expiração
Elasticsearch 7
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
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
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
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
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
Único
DELETE /website/blog/1
Índice
DELETE /website
Elasticsearch 13
Com base numa query
DELETE /website/blog/_query?q=tags:java
(Plugin delete by query)
Apagar um Documento
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
Modelos de Mapeamentos
Aplicar mapeamentos automaticamente a novos tipos
PUT website
{
"mappings": {
"post": {
"dynamic_templates": [ {
"timestamp": {
"match": "timestamp",
"match_mapping_type": "date",
"mapping": {
"type": "date",
"format" : "yyyy-MM-dd HH:mm"
}
}
} ]
}
}
}
Elasticsearch 15
Pesquisas: resultados ordenados por
relevância
Filtros: restringir o que aparece
Cache
Elasticsearch 16
Contexto de pesquisa ou filtragem
Search API
 URL
/<index>/<type>/_search?q=s
omething
/<index>/<type1>,<type2>/_se
arch?q=something
_search?q=something
_search?q:field:value
_search?q=+firstname(john
mary)&-surname:smith
Query DSL
 Pesquisas e filtros
 simple_query_string,
query_string, match, term,
terms, range, multi_match,
match_phrase, missing,
exists, regexp, fuzzy, prefix,
ids
 bool, dis_max
 more_like_this, script,
template
Elasticsearch 17
Pesquisas
Full-text search
 query_string,
simple_query_string,
match, multi_match,
match_phrase, term, terms
Inexacta
 regexp, fuzzy, prefix, wild-
card
Elasticsearch 18
Tipos de Pesquisas
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
Paginação, Ordem e Projecções
Paginação: size, from
Ordem: sort
Projecções: fields
POST website/post/_search
{
“size”: 10,
“from”: 0,
“sort”: {
“timestamp”: {
“order”: “desc”
}
},
“fields”: [ “title”, “_id” ]
}
Elasticsearch 20
É possível fazer ordenação e incluir resultados
calculados (scripts)
"script": {
"inline": "_value.toUpperCase()"
}
Elasticsearch 21
Scripts
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
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
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
Boost de campos:
"query": {
"multi_match": {
"query": "elasticsearch",
"fields": [
“title^5", "body"
]
}
}
 Should:
"bool": {
"should": [
{
"match": {
"body": {
"query": "elasticsearch",
"boost": 1
}
}
},
{
"match": {
"body": {
"query": "technology",
"boost": 0.5
}
}
}
]
} ,
"minimum_number_should_match": "50%"
Elasticsearch 25
Pesquisa por Relevância
 Máximo de disjuntas:
"dis_max": {
"queries": [
{
"term": {
"tags": {
"value": "technologies"
}
}
},
{
"term": {
"tags": {
"value": "others"
}
}
}
]
}
 Boosting:
"boosting": {
"positive": {
"term": {
"tags": "technologies"
}
},
"negative": {
"term": {
"tags": "books"
}
},
"negative_boost": 0.5
}
Elasticsearch 26
Pesquisa por Relevância
 Funções de scoring:
"functions": [
{
"field_value_factor": {
"field": "ratings",
"factor": 1.2
},
"gauss": {
"price": {
"origin": "0",
"scale": "100"
}
}
}
]
}
 Scripting:
"script_score": {
"script": "_score *
doc['person'].value.length() * 5"
}
Elasticsearch 27
Scoring
 Usando os tipos geo_point e geo_shape
"filter": {
"geo_distance": {
"distance": "200km",
"location": "40.2, -8.4166667"
}
}
"script_fields": {
"distance": {
"params": {
"lat": 40.2,
"lon": -8.4166667
},
"script": "doc['location'].distanceInKm(lat, lon)"
}
}
Elasticsearch 28
Pesquisas Geo Referenciadas
Indexação
Transformação em tokens
Stemming
Normalização
Um campo pode ser ou não analisado
Analisadores para cada língua
Possível definir os nossos
Pode dar resultados inesperados
Elasticsearch 29
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
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
Operações Bulk
 Executar várias operações (index, update, delete) de uma só
vez
POST bulk/data/_bulk
{ "index" : { "_id" : "1" } }
{ "field1" : "value1" }
{ "index" : { "_id" : "2" } }
{ "field1" : "value1" }
{ "index" : { "_id" : "3" } }
{ "field1" : "value1" }
{ "update" : { "_id" : "2" } }
{ "doc": { "field2": "value2" } }
{ "delete" : { "_id" : "3" } }
Elasticsearch 32
Análise
 Uma ou mais agregações
 Podem ser combinadas
 Podem usar scripts
GET /megacorp/employee/_search
{
"aggs": {
"all_interests": {
"terms": {
"field": “feature“
},
“aggs”: {
“average_price”: {
“field”: “price”
}
}
}
}
}
Elasticsearch 33
APIs
 REST (nativo)
 .NET
 JavaScript/Node.js
 Python
 Java
 Groovy
 PHP
 Perl
 Ruby
Elasticsearch 34
 Marvel
 Sense
 Watcher
 Graph
 Shield
 Hadoop
 Head
 Kopf
 Elasticsearch-SQL
 Delete by query
 Bigdesk
Elasticsearch 35
Plugins
Reporting
Dashboards
Elasticsearch 36
Kibana
 Recolher e transformar dados
 Input – Filters – Outputs
 Fontes e destinos:
 Elasticsearch
 File
 Syslog
 Windows Eventlog
 Redis
 RabbitMQ
 GitHub
 HTTP
 Beats
 Twitter
 WebSocket
 …
Elasticsearch 37
Logstash
https://www.elastic.co
https://www.gitbook.com/book/allen8807/elasti
csearch-definitive-guide-en/details
https://github.com/elastic/cookbook-
elasticsearch
https://github.com/elastic/elasticsearch-net
https://github.com/elastic/kibana
https://github.com/elastic/logstash
https://github.com/elastic/elasticsearch
http://joelabrahamsson.com/elasticsearch-101
Elasticsearch 38
Referências
Patrocinadores “Gold”
https://fusioncowork.com/
https://www.facebook.com/FUSIONCoWork/
https://twitter.com/fusioncowork
Patrocinadores “Silver”
Patrocinadores “Bronze”
Obrigado
Obrigado por participarem! 
@rjperes75
rjperes@hotmail.com
http://weblogs.asp.net/ricardoperes
Elasticsearch 42

Elasticsearch

Notas do Editor

  • #41 Telerik Ndepend Pluralsight syncfusion