Conceitos avançados de
Elasticsearch
Luiz Henrique Zambom Santana
24 de Fevereiro de 2015
Agenda
• Busca filtered
• Multifields
• Mapeamento
• Busca
• Buscas avançadas
• Fields
• Agregações
• Highlight
• Boost vs. Sort
• Cliente PHP
• Problemas comuns
Buscas - Filtered
POST /indice/post/_search
{
"query": {
"filtered": {
"query": {
"match": {
"relator": "ANTONIO"
}
},
"filter": {
"range": {
“data": {
“lte": "now - 1d / d"
}
}
}
}
}
}
Multifields - Mapeamento
POST /indice/post/_mapping
{
"processo": {
"properties": {
…
"descricao": {
"type": "string",
"fields": {
"raw": {
"type": "string",
"index": "not_analyzed"
}
}
},
…
}
}
Multifields - Busca
POST /indice/post/_search
{
"query": {
"match": {
"assunto.raw": "CONTRATO/REGISTRO"
}
}
}
Buscas
• Fields
• Fuziness
• Ordenação
• Paginação
• Boost
• Agregações
• Suggestions
POST /indice/post/_search
{
"fields" : "descricao",
"from" : 0, "size" : 10,
"sort" : [
"_score",
“data",
“relator"
],
"query": {
"filtered": {
"query": {
"match": {
Fields
• Forma de diminuir a quantidade de dados na rede
POST /indice/post/_search
{
"fields" : "descricao, relator",
Agregações
• Agregações são comparáveis ao GROUP BY do SQL
• Exemplo, agregar por relator:
"query": {
"match": {
"descricao": "carro"
}
},
"aggregations": {
"descricao_agg": {
"terms": {
"field": "descricao.raw"
}
}
}
Highlight
POST /indice/post/_search
{
"query": {
…
},
"aggregations": {
…
},
"highlight" : {
"fields" : {
"descricao" : {"force_source" : true}
}
}
}
Paginação
POST /indice/post/_search
{
"fields" : "descricao",
"from" : 0, "size" : 10,
"sort" : [
Sort
POST /indice/post/_search
{
"fields" : "descricao",
"from" : 0, "size" : 10,
"sort" : [
"_score",
“data",
“relator"
],
Boost
"must": [
{
"prefix": {
"relator": "ANTONIO",
"boost": "500"
}
}
],
Suggestions
…
"suggest": {
"my-suggestion": {
"text": "carro",
"term": {
"field": "descricao"
}
}
}
Fuzziness
…
"query": {
"match": {
"descricao": "caro",
"fuzziness": "1"
}
},
Cliente PHP
• Não use um cliente HTTP padrão com o Guzzle!
• Use o cliente oficial
• https://www.elastic.co/guide/en/elasticsearch/client/php-
api/current/index.html
• Vide
• http://www.devmedia.com.br/elasticsearch-desenvolvendo-big-data-com-
php/31609
Processamento de logs
• Logstash e Kibana
• Plugins do Elasticsearch, formam juntos o ELK
• Vide:
• http://pt.slideshare.net/LuizHenriqueZambomSa/elasticsearch-como-gerenciar-seus-
logs-com-logstash-e-kibana
• Usa o GROK para unificar a visão sobre logs
• Envia os dados para o Elasticsearch
• Visualiza no Kibana
Problemas comuns
• Rede e instalação
• Modificar o nome do cluster, o padrão é “elasticsearch”
• Não deixar o mesmo nome em produção, QA e desenvolvimento, pois os clusters podem
se “fundir”:
• Developer liga a máquina
• Nó local se une ao cluster
• Migração de shards
• Developer desliga a máquina
• Cluste em red state, com dados perdidos
Problemas comuns
• Pouca relevância de resultados
• Revisar boost
• Modificar analisadores
• Usar inquisitor!!!
• Colocar os filtros no início
• Desempenho de indexação
• Diminuir número de réplicas
• Analisadores
• Evitar merging de segmentos ("indices.store.throttle.type" : "none“). Conforme os dados vão sendo alterados
no ES, novos segmentos vao sendo criados. Casa segmento consome memória e ciclos de CPU, mas unificá-los
é um processo caro. Depois do bulk chamar a otimização para forçar o merging.
• Usar Marvel
• Aumentar número de threads até EsRejectedExecutionException
• Desabilitar campo _all
• index.translog.flush_threshold_size para 1gb (o padrão é 200mb) para evitar escrita
Problemas comuns
• Desempenho de busca
• Cache (priorizar o uso de filters)
• Fields:
• Armazena valores de campos
• Usado principalmente para agregação e ordenação (menos importante para TA)
• Shard query (1.4.*):
• Armazena resultados de consultas por shard
• Filter (LRU):
• Mais importante! Armazena resultados de filtros
• indices.cache.filter.size (porcentagem do tamanho de memória)
• Aumentar número de réplicas e shards (múltiplo do número de nós)
• Analisadores (causam uso de CPU)
• Aumentar o refresh interval
• Slowlog (otimizar busca)
• Verificar EsRejectedExecutionException no log
• Aumentar threadpool.search.queue_size, default 1000
Problemas comuns
• Alta disponibilidade
• Cluster ativo/ativo
• Split-brain
• Número de réplicas
• Réplicas migram para outros servidores
• Status do cluster
• Green: todos shards e réplicas ativos
• Yellow: algumas réplicas não estão ativas
• Red: shard não ativo
Problemas comuns
• Configurações gerais
• Memória
• Metade do disponível da máquina
• Evitar swap (bootstrap.mlockall: true)
• Não utilizar multicast
Outros tópicos
• Dados geográficos
• Imagens
?

Treinamento Elasticsearch - Parte 2

  • 1.
    Conceitos avançados de Elasticsearch LuizHenrique Zambom Santana 24 de Fevereiro de 2015
  • 2.
    Agenda • Busca filtered •Multifields • Mapeamento • Busca • Buscas avançadas • Fields • Agregações • Highlight • Boost vs. Sort • Cliente PHP • Problemas comuns
  • 3.
    Buscas - Filtered POST/indice/post/_search { "query": { "filtered": { "query": { "match": { "relator": "ANTONIO" } }, "filter": { "range": { “data": { “lte": "now - 1d / d" } } } } } }
  • 4.
    Multifields - Mapeamento POST/indice/post/_mapping { "processo": { "properties": { … "descricao": { "type": "string", "fields": { "raw": { "type": "string", "index": "not_analyzed" } } }, … } }
  • 5.
    Multifields - Busca POST/indice/post/_search { "query": { "match": { "assunto.raw": "CONTRATO/REGISTRO" } } }
  • 6.
    Buscas • Fields • Fuziness •Ordenação • Paginação • Boost • Agregações • Suggestions POST /indice/post/_search { "fields" : "descricao", "from" : 0, "size" : 10, "sort" : [ "_score", “data", “relator" ], "query": { "filtered": { "query": { "match": {
  • 7.
    Fields • Forma dediminuir a quantidade de dados na rede POST /indice/post/_search { "fields" : "descricao, relator",
  • 8.
    Agregações • Agregações sãocomparáveis ao GROUP BY do SQL • Exemplo, agregar por relator: "query": { "match": { "descricao": "carro" } }, "aggregations": { "descricao_agg": { "terms": { "field": "descricao.raw" } } }
  • 9.
    Highlight POST /indice/post/_search { "query": { … }, "aggregations":{ … }, "highlight" : { "fields" : { "descricao" : {"force_source" : true} } } }
  • 10.
    Paginação POST /indice/post/_search { "fields" :"descricao", "from" : 0, "size" : 10, "sort" : [
  • 11.
    Sort POST /indice/post/_search { "fields" :"descricao", "from" : 0, "size" : 10, "sort" : [ "_score", “data", “relator" ],
  • 12.
    Boost "must": [ { "prefix": { "relator":"ANTONIO", "boost": "500" } } ],
  • 13.
    Suggestions … "suggest": { "my-suggestion": { "text":"carro", "term": { "field": "descricao" } } }
  • 14.
  • 15.
    Cliente PHP • Nãouse um cliente HTTP padrão com o Guzzle! • Use o cliente oficial • https://www.elastic.co/guide/en/elasticsearch/client/php- api/current/index.html • Vide • http://www.devmedia.com.br/elasticsearch-desenvolvendo-big-data-com- php/31609
  • 16.
    Processamento de logs •Logstash e Kibana • Plugins do Elasticsearch, formam juntos o ELK • Vide: • http://pt.slideshare.net/LuizHenriqueZambomSa/elasticsearch-como-gerenciar-seus- logs-com-logstash-e-kibana • Usa o GROK para unificar a visão sobre logs • Envia os dados para o Elasticsearch • Visualiza no Kibana
  • 17.
    Problemas comuns • Redee instalação • Modificar o nome do cluster, o padrão é “elasticsearch” • Não deixar o mesmo nome em produção, QA e desenvolvimento, pois os clusters podem se “fundir”: • Developer liga a máquina • Nó local se une ao cluster • Migração de shards • Developer desliga a máquina • Cluste em red state, com dados perdidos
  • 18.
    Problemas comuns • Poucarelevância de resultados • Revisar boost • Modificar analisadores • Usar inquisitor!!! • Colocar os filtros no início • Desempenho de indexação • Diminuir número de réplicas • Analisadores • Evitar merging de segmentos ("indices.store.throttle.type" : "none“). Conforme os dados vão sendo alterados no ES, novos segmentos vao sendo criados. Casa segmento consome memória e ciclos de CPU, mas unificá-los é um processo caro. Depois do bulk chamar a otimização para forçar o merging. • Usar Marvel • Aumentar número de threads até EsRejectedExecutionException • Desabilitar campo _all • index.translog.flush_threshold_size para 1gb (o padrão é 200mb) para evitar escrita
  • 19.
    Problemas comuns • Desempenhode busca • Cache (priorizar o uso de filters) • Fields: • Armazena valores de campos • Usado principalmente para agregação e ordenação (menos importante para TA) • Shard query (1.4.*): • Armazena resultados de consultas por shard • Filter (LRU): • Mais importante! Armazena resultados de filtros • indices.cache.filter.size (porcentagem do tamanho de memória) • Aumentar número de réplicas e shards (múltiplo do número de nós) • Analisadores (causam uso de CPU) • Aumentar o refresh interval • Slowlog (otimizar busca) • Verificar EsRejectedExecutionException no log • Aumentar threadpool.search.queue_size, default 1000
  • 20.
    Problemas comuns • Altadisponibilidade • Cluster ativo/ativo • Split-brain • Número de réplicas • Réplicas migram para outros servidores • Status do cluster • Green: todos shards e réplicas ativos • Yellow: algumas réplicas não estão ativas • Red: shard não ativo
  • 21.
    Problemas comuns • Configuraçõesgerais • Memória • Metade do disponível da máquina • Evitar swap (bootstrap.mlockall: true) • Não utilizar multicast
  • 22.
    Outros tópicos • Dadosgeográficos • Imagens ?