How to use Elasticsearch Analyzers by EmergiNet

4.544 visualizações

Publicada em

Presentation ( em Português - Brasil) about how to use Elasticsearch analyzers to boost your searches. The content was exhibited in Elasticsearch Meetup in Rio de Janeiro and Porto Alegre by Pablo Musa from EmergiNet.

0 comentários
2 gostaram
Estatísticas
Notas
  • Seja o primeiro a comentar

Sem downloads
Visualizações
Visualizações totais
4.544
No SlideShare
0
A partir de incorporações
0
Número de incorporações
3.060
Ações
Compartilhamentos
0
Downloads
10
Comentários
0
Gostaram
2
Incorporações 0
Nenhuma incorporação

Nenhuma nota no slide

How to use Elasticsearch Analyzers by EmergiNet

  1. 1. Analyzers Pablo Musa EmergiNet 05 de Maio de 2014
  2. 2. Outline 1 Motiva¸c˜ao 2 Elasticsearch e EmergiNet 3 Conceitos B´asicos 4 Criando um Analisador 5 Problemas Comuns 6 Outros Trabalhos Pablo Musa (EmergiNet) Analyzers 05 de Maio de 2014 2 / 26
  3. 3. Motiva¸c˜ao Caso de Uso Site de compras “Full text search” em SQL ´e complexo e lento Necessidade de um sistema de busca: mais r´apido mais preciso mais simples de desenvolver Pablo Musa (EmergiNet) Analyzers 05 de Maio de 2014 3 / 26
  4. 4. Elasticsearch R´apido (em m´edia 100x) Resultados excelentes F´acil de consumir Instala¸c˜ao muito simples e escal´avel API RESTful simples utilizando JSON “Schema ´e autom´atico” Pablo Musa (EmergiNet) Analyzers 05 de Maio de 2014 4 / 26
  5. 5. Elasticsearch e EmergiNet Nem sempre o padr˜ao ´e o melhor Ningu´em conhece melhor seus dados do que vocˆe Mapping personalizado EmergiNet solu¸c˜ao de consultoria ou execu¸c˜ao de projetos Otimizar a aplica¸c˜ao e incluir funcionalidades 1 Ordena¸c˜ao 2 Aggregations 3 Auto-Complete, Suggester 4 Auxiliar no SEO (Search Engine Optimization) Pablo Musa (EmergiNet) Analyzers 05 de Maio de 2014 5 / 26
  6. 6. Elasticsearch Empty Index { "settings": { "analysis": { "filter": { }, "analyzer": { "my_analyzer": { "type": "", "char_filter": [], "tokenizer": "", "filter": [] } } } }, "mappings": { "my_type": { "properties": { "title": { "type": "", "index": "", "analyzer": "" } } } } } “Empty” analysis and mappings. Example of the structure to be fulfilled. Pablo Musa (EmergiNet) Analyzers 05 de Maio de 2014 6 / 26
  7. 7. Etapas de um analisador 1 Arrumar 2 Quebrar 3 Normalizar Elasticsearch oferece analisadores pr´e-definidos Por exemplo: standard, simple, whitespace, language Pablo Musa (EmergiNet) Analyzers 05 de Maio de 2014 7 / 26
  8. 8. Arrumar Character Filters “Pr´e-processamento” Limpeza da string Opcional Atualmente existem 3 tipos: mapping (ex: "ph" => "f") html strip (removes tags and maps entities, "á" => "´a") pattern replace (regular expression) Pablo Musa (EmergiNet) Analyzers 05 de Maio de 2014 8 / 26
  9. 9. Arrumar Analysis with Character Filters "analysis": { "filter": { }, "analyzer": { "my_analyzer": { "type": "custom", "char_filter": [ "html_strip" ], "tokenizer": "", "filter": [] } } } Analysis with character filter function only. Pablo Musa (EmergiNet) Analyzers 05 de Maio de 2014 9 / 26
  10. 10. Quebrar Tokenizers “Processamento” Quebra da string em termos individuais Obrigat´orio Atualmente existem 10 tipos: standard keyword whitespace ngram, edge ngram letter, lowercase (opt), pattern, uax email url, path hierarchy Pablo Musa (EmergiNet) Analyzers 05 de Maio de 2014 10 / 26
  11. 11. Quebrar Analysis with Character Filters and Tokenizers "analysis": { "filter": { }, "analyzer": { "my_analyzer": { "type": "custom", "char_filter": [ "html_strip" ], "tokenizer": "standard", "filter": [] } } } Analysis with character filter and tokenizer function. Pablo Musa (EmergiNet) Analyzers 05 de Maio de 2014 11 / 26
  12. 12. Normalizar Token Filters “P´os-processamento” Normalizar os tokens (alterar ou remover) Opcional Atualmente existem 33 tipos: ascii folding lowercase, uppercase stop stemmer ngram, edge ngram, length, snowball, synonym, ... Pablo Musa (EmergiNet) Analyzers 05 de Maio de 2014 12 / 26
  13. 13. Normalizar Analysis Complete "analysis": { "filter": { }, "analyzer": { "my_analyzer": { "type": "custom", "char_filter": [ "html_strip" ], "tokenizer": "standard", "filter": [ "lowercase", "asciifolding" ] } } } Analysis using all functions. Pablo Musa (EmergiNet) Analyzers 05 de Maio de 2014 13 / 26
  14. 14. Normalizar stop token filter Stop Words Remove palavras indesejadas ´E baseado em uma lista de palavras e deve ser criado manualmente "stop_noise": { "type": "stop", "stopwords_path": "sw.txt" } "stop_noise": { "type": "stop", "stopwords": ["o", "a", "no", "na","de","da", "as","os"] } Stop word token filter definition. ignore case and remove trailing are boolean settings. Pablo Musa (EmergiNet) Analyzers 05 de Maio de 2014 14 / 26
  15. 15. Normalizar Analysis Complete with stop words "analysis": { "filter": { "stop_noise": { "type": "stop", "stopwords_path": "sw.txt" } }, "analyzer": { "my_analyzer": { "type": "custom", "char_filter": [ "html_strip" ], "tokenizer": "standard", "filter": [ "lowercase", "stop_noise", "asciifolding" ] } } } Analysis using all functions and my own stop words filter. Pablo Musa (EmergiNet) Analyzers 05 de Maio de 2014 15 / 26
  16. 16. Normalizar stemmer token filter Stemmer (deriva¸c˜oes) “Trava” as palavras ("jogar"=>"joga" ou "jogar" =>"jog") ´E baseado em um conjunto j´a existente, mas deve ser criado manualmente "my_stemmer": { "type": "stemmer", "name": "light_portuguese" } Stemmer token filter definition. minimal portuguese and portuguese are other portuguese options. Pablo Musa (EmergiNet) Analyzers 05 de Maio de 2014 16 / 26
  17. 17. Normalizar Analysis Complete with stop words and stemmer "analysis": { "filter": { "stop_noise": { "type": "stop", "stopwords_path": "sw.txt" }, "light_pt": { "type": "stemmer", "name": "light_portuguese" }, }, "analyzer": { "my_analyzer": { "type": "custom", "char_filter": [ "html_strip" ], "tokenizer": "standard", "filter": [ "lowercase", "stop_noise", "asciifolding", "light_pt" ] } } } Analysis using all functions, with my own stop words and light portuguese stemmer filters. Pablo Musa (EmergiNet) Analyzers 05 de Maio de 2014 17 / 26
  18. 18. One Field Mapping "mappings": { "my_type": { "properties": { "title": { "type": "string", "index": "analyzed", "analyzer": "my_analyzer", } } } } Simple mapping with one string field using my analyzer. Pablo Musa (EmergiNet) Analyzers 05 de Maio de 2014 18 / 26
  19. 19. Problemas Ordenar Aggregation SEO (Search Engine Optimization) Pablo Musa (EmergiNet) Analyzers 05 de Maio de 2014 19 / 26
  20. 20. Problemas Ordena¸c˜ao Ordena¸c˜ao em campos indexados gera resultados aleat´orios "Telha" < "casa" Novo analisador "sort": { "type": "custom", "tokenizer": "keyword", "filter": [ "lowercase", "asciifolding" ] } Sort analyzer. Makes use of lowercase and asciifolding filters and the keyword tokenizer. Pablo Musa (EmergiNet) Analyzers 05 de Maio de 2014 20 / 26
  21. 21. Problemas Aggregation Como funciona: ”sao”, ”paulo”, ”rio” O que queremos: ”S˜ao Paulo” Ou seja, n˜ao queremos an´alise Pablo Musa (EmergiNet) Analyzers 05 de Maio de 2014 21 / 26
  22. 22. Problemas Search Engine Optimization Stemmer ´e ruim Novo analisador "url_analyzer": { "type": "custom", "char_filter": [ "html_strip" ], "tokenizer": "standard", "filter": [ "lowercase", "stop_noise", "asciifolding" ] } URL analyzer for SEO. It will not be used in mappings. Pablo Musa (EmergiNet) Analyzers 05 de Maio de 2014 22 / 26
  23. 23. Problemas Search Engine Optimization N˜ao precisamos mape´a-lo para um field analyze API curl -XPOST "http://localhost:9200/my_index/_analyze?analyzer=my_analyzer" -d ’{ "O Meetup Elasticsearch RJ ser´a no dia 05 de maio as 18h." }’ > meetup elasticsearch rj sera dia 05 maio 18h analyze API Example. Pablo Musa (EmergiNet) Analyzers 05 de Maio de 2014 23 / 26
  24. 24. Resultado { "settings": { "analysis": { "filter": { "stop_noise": { "type": "stop", "stopwords_path": "sw.txt" }, "light_pt": { "type": "stemmer", "name": "light_portuguese" } }, "analyzer": { "my_analyzer": { "type": "custom", "char_filter": [ "html_strip" ], "tokenizer": "standard", "filter": [ "lowercase", "stop_noise", "asciifolding", "light_pt" ] }, "sort": { "type": "custom", "tokenizer": "keyword", "filter": [ "lowercase", "asciifolding" ] }, "url_analyzer": { "type": "custom", "char_filter": [ "html_strip" ], "tokenizer": "standard", "filter": [ "lowercase", "stop_noise", "asciifolding" ] } } } }, "mappings": { "my_type": { "properties": { "title": { "type": "string", "index": "analyzed", "analyzer": "my_analyzer", "fields": { "sort": { "type": "string", "index": "analyzed", "analyzer": "sort" }, "raw": { "type": "string", "index": "not_analyzed" } } } } } } } Complete mapping for one field using sub-fields to text search, sort, and aggregation. Pablo Musa (EmergiNet) Analyzers 05 de Maio de 2014 24 / 26
  25. 25. Outros Trabalhos Boost Parent/Child Armazenamento de Logs (Logstash + Kibana) Consultoria de infra estrutura para ELK Pablo Musa (EmergiNet) Analyzers 05 de Maio de 2014 25 / 26
  26. 26. Obrigado www.emergi.net - pmusa@emergi.net “Keep it simple, but not simpler.”

×