Elasticsearch - Análise
Quando uma consulta é processada durante uma operação de pesquisa, o conteúdo de qualquer índice é analisado pelo módulo de análise. Este módulo consiste em analisador, tokenizer, tokenfilters e charfilters. Se nenhum analisador for definido, então, por padrão, os analisadores, token, filtros e tokenizers integrados são registrados com o módulo de análise.
No exemplo a seguir, usamos um analisador padrão que é usado quando nenhum outro analisador é especificado. Ele irá analisar a frase com base na gramática e produzir palavras usadas na frase.
POST _analyze
{
"analyzer": "standard",
"text": "Today's weather is beautiful"
}
Ao executar o código acima, obtemos a resposta conforme mostrado abaixo -
{
"tokens" : [
{
"token" : "today's",
"start_offset" : 0,
"end_offset" : 7,
"type" : "",
"position" : 0
},
{
"token" : "weather",
"start_offset" : 8,
"end_offset" : 15,
"type" : "",
"position" : 1
},
{
"token" : "is",
"start_offset" : 16,
"end_offset" : 18,
"type" : "",
"position" : 2
},
{
"token" : "beautiful",
"start_offset" : 19,
"end_offset" : 28,
"type" : "",
"position" : 3
}
]
}
Configurando o analisador padrão
Podemos configurar o analisador padrão com vários parâmetros para obter nossos requisitos personalizados.
No exemplo a seguir, configuramos o analisador padrão para ter um max_token_length de 5.
Para isso, primeiro criamos um índice com o analisador tendo o parâmetro max_length_token.
PUT index_4_analysis
{
"settings": {
"analysis": {
"analyzer": {
"my_english_analyzer": {
"type": "standard",
"max_token_length": 5,
"stopwords": "_english_"
}
}
}
}
}
Em seguida, aplicamos o analisador com um texto conforme mostrado abaixo. Observe como o token não aparece, pois tem dois espaços no início e dois espaços no final. Para a palavra “é”, há um espaço no início e um espaço no final. Tomando todas elas, torna-se 4 letras com espaços e isso não significa uma palavra. Deve haver um caractere sem espaço pelo menos no início ou no final, para torná-lo uma palavra a ser contada.
POST index_4_analysis/_analyze
{
"analyzer": "my_english_analyzer",
"text": "Today's weather is beautiful"
}
Ao executar o código acima, obtemos a resposta conforme mostrado abaixo -
{
"tokens" : [
{
"token" : "today",
"start_offset" : 0,
"end_offset" : 5,
"type" : "",
"position" : 0
},
{
"token" : "s",
"start_offset" : 6,
"end_offset" : 7,
"type" : "",
"position" : 1
},
{
"token" : "weath",
"start_offset" : 8,
"end_offset" : 13,
"type" : "",
"position" : 2
},
{
"token" : "er",
"start_offset" : 13,
"end_offset" : 15,
"type" : "",
"position" : 3
},
{
"token" : "beaut",
"start_offset" : 19,
"end_offset" : 24,
"type" : "",
"position" : 5
},
{
"token" : "iful",
"start_offset" : 24,
"end_offset" : 28,
"type" : "",
"position" : 6
}
]
}
A lista de vários analisadores e suas descrições são fornecidas na tabela mostrada abaixo -
S.Não | Analisador e descrição |
---|---|
1 |
Standard analyzer (standard) stopwords e configuração max_token_length podem ser definidas para este analisador. Por padrão, a lista de palavras de interrupção está vazia e max_token_length é 255. |
2 |
Simple analyzer (simple) Este analisador é composto de um tokenizador em minúsculas. |
3 |
Whitespace analyzer (whitespace) Este analisador é composto de tokenizer de espaço em branco. |
4 |
Stop analyzer (stop) stopwords e stopwords_path podem ser configurados. Por padrão, palavras irrelevantes inicializadas com palavras irrelevantes em inglês e stopwords_path contém o caminho para um arquivo de texto com palavras irrelevantes. |
Tokenizers
Tokenizers são usados para gerar tokens de um texto no Elasticsearch. O texto pode ser dividido em tokens levando em consideração o espaço em branco ou outras pontuações. Elasticsearch tem muitos tokenizers integrados, que podem ser usados em analisadores personalizados.
Um exemplo de tokenizer que divide o texto em termos sempre que encontra um caractere que não é uma letra, mas também em minúsculas todos os termos, é mostrado abaixo -
POST _analyze
{
"tokenizer": "lowercase",
"text": "It Was a Beautiful Weather 5 Days ago."
}
Ao executar o código acima, obtemos a resposta conforme mostrado abaixo -
{
"tokens" : [
{
"token" : "it",
"start_offset" : 0,
"end_offset" : 2,
"type" : "word",
"position" : 0
},
{
"token" : "was",
"start_offset" : 3,
"end_offset" : 6,
"type" : "word",
"position" : 1
},
{
"token" : "a",
"start_offset" : 7,
"end_offset" : 8,
"type" : "word",
"position" : 2
},
{
"token" : "beautiful",
"start_offset" : 9,
"end_offset" : 18,
"type" : "word",
"position" : 3
},
{
"token" : "weather",
"start_offset" : 19,
"end_offset" : 26,
"type" : "word",
"position" : 4
},
{
"token" : "days",
"start_offset" : 29,
"end_offset" : 33,
"type" : "word",
"position" : 5
},
{
"token" : "ago",
"start_offset" : 34,
"end_offset" : 37,
"type" : "word",
"position" : 6
}
]
}
Uma lista de Tokenizers e suas descrições são mostradas aqui na tabela abaixo -
S.Não | Tokenizer e descrição |
---|---|
1 |
Standard tokenizer (standard) Isso é construído em um tokenizer baseado em gramática e max_token_length pode ser configurado para este tokenizer. |
2 |
Edge NGram tokenizer (edgeNGram) Configurações como min_gram, max_gram, token_chars podem ser definidas para este tokenizer. |
3 |
Keyword tokenizer (keyword) Isso gera toda a entrada como uma saída e buffer_size pode ser definido para isso. |
4 |
Letter tokenizer (letter) Isso captura a palavra inteira até que uma não letra seja encontrada. |