O documento discute como criar analisadores personalizados no Elasticsearch para melhorar as buscas de texto completo. Ele explica os conceitos básicos de arrumação, quebra e normalização de tokens e como aplicar filtros como remoção de stopwords e stemming. Também aborda problemas comuns como ordenação, agregação e otimização para mecanismos de busca e fornece um exemplo completo de mapeamento de campo com subcampos.
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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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
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. 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. 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. 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