Skip to content

Instantly share code, notes, and snippets.

@luizgpsantos
Last active November 25, 2022 23:27
Show Gist options
  • Star 13 You must be signed in to star a gist
  • Fork 5 You must be signed in to fork a gist
  • Save luizgpsantos/f9b2f57ea13e7515b48a to your computer and use it in GitHub Desktop.
Save luizgpsantos/f9b2f57ea13e7515b48a to your computer and use it in GitHub Desktop.
Analyzer para plural e acentos no elasticsearch
// Ao [criar o índice][0], especifique um [analyzer customizado][1] responsável por tratar palavras
// com caracteres especiais e o plural da lingua Portuguesa. Algumas palavras precisarão de uma
// sintonia fina, o que pode ser feito através de [stemmer overrides][2]. Além disso, ao criar um
// campo atribua o analyzer a ele.
PUT produtos
{
"settings": {
"analysis": {
"analyzer": {
"analyzer_plural_acentos": {
"tokenizer": "standard",
"filter": [
"lowercase",
"custom_stems",
"stemmer_plural_portugues",
"asciifolding"
]
}
},
"filter": {
"custom_stems": {
"type": "stemmer_override",
"rules": [
"televisoes => televisão"
]
},
"stemmer_plural_portugues": {
"type": "stemmer",
"name": "minimal_portuguese"
}
}
}
},
"mappings": {
"properties": {
"titulo": {
"type": "text",
"analyzer": "analyzer_plural_acentos"
}
}
}
}
// Indexe os documentos, que podem conter acentos, maiusculas, plural, etc...
PUT produtos/_doc/1
{
"titulo": "avelãs"
}
PUT produtos/_doc/2
{
"titulo": "televisão"
}
// Faça uma busca utilizando um termo sem acento ou no plural. O resultado deve conter os
// documentos com os termos acentuados e no singular.
POST produtos/_search
{
"query": {
"match": {
"titulo": "televisoes"
}
}
}
// Outro exemplo de query...
POST produtos/_search
{
"query": {
"match": {
"titulo": "AVELAS"
}
}
}
// Para entender como o analyzer customizado está gerando os tokens, podemos utilizar a [analyze API][3]:
GET produtos/_analyze
{
"text": ["televisões", "televisoes", "AVELAS"],
"analyzer": "analyzer_plural_acentos"
}
[0]: https://www.elastic.co/guide/en/elasticsearch/reference/current/indices-create-index.html
[1]: https://www.elastic.co/guide/en/elasticsearch/reference/current/analysis-custom-analyzer.html
[2]: https://www.elastic.co/guide/en/elasticsearch/reference/current/analysis-stemmer-override-tokenfilter.html
[3]: https://www.elastic.co/guide/en/elasticsearch/reference/current/indices-analyze.html
@alvesoaj
Copy link

alvesoaj commented Jul 6, 2015

O que é o "seu_tipo"?

@octamagalhaes
Copy link

Está ignorando palavras compostas, "buenos aires" por exemplo. Sabe por que?

@haagws
Copy link

haagws commented Jan 17, 2018

Ótimo.

@jeanpjm1
Copy link

jeanpjm1 commented Jun 7, 2020

só não funciona quando utiliza acento TIL no "Õ" em algumas palavras como por exemplo: mamões, televisões, limões etc... neste caso diferencia a palavra com acento de sem acento, não sei porque cargas d'água. Tirando isso funciona perfeitamente os acentos e plural.

@AdminPulsar
Copy link

AdminPulsar commented Feb 15, 2021

Olá, ao tentar rodar a primeira parte do "exemplo completo" ele me retorna esse erro:

"error": {
"root_cause": [
{
"type": "mapper_parsing_exception",
"reason": "Root mapping definition has unsupported parameters: [seu_tipo : {properties={titulo={analyzer=analyzer_customizado, type=string}}}]"
}
],
"type": "mapper_parsing_exception",
"reason": "Failed to parse mapping [_doc]: Root mapping definition has unsupported parameters: [seu_tipo : {properties={titulo={analyzer=analyzer_customizado, type=string}}}]",
"caused_by": {
"type": "mapper_parsing_exception",
"reason": "Root mapping definition has unsupported parameters: [seu_tipo : {properties={titulo={analyzer=analyzer_customizado, type=string}}}]"
}
},
"status": 400

Ah, e o que seria o no mapping o "seu_tipo"?

Alguém poderia me ajudar por favor, obrigado!

@luizgpsantos
Copy link
Author

[EDIT]: Atualizei o exemplo para ser compatível com a versão atual do Elasticsearch (7.11.0).

@AdminPulsar
Copy link

Olá @luizgpsantos, muito obrigado pela pronta resposta, funcionou perfeitamente para o que eu estava estudando!

Mais uma vez obrigado pela disponibilidade e pelo post que foi muito claro e objetivo, parabéns!

;-)

@nelsonjunior
Copy link

Parabéns pelo conteúdo compartilhado, ajudou bastante 👍

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment