Nosso último ponto antes de partirmos para as outras ferramentas da stack será totalmente teórico e irá abordar sobre uma das funcionalidades que tornam o Elasticsearch extremamente rápido na hora de fazer suas pesquisas, o inveterd index.
O inverted index ou índice invertido (high level fluent traduction), é uma estrutura que consiste em uma lista de todas as únicas palavras que aparecem em qualquer documento, e para cada palavra, uma lista de documentos em que ela aparece. Para facilitar o entendimento, vamos supor que possuímos dois documentos, cada um com um campo chamado "informacao", contendo os seguintes valores:
1° - O bulldog frances gosta de pular na grama
2° - Bulldog frances saltou na grama com gosto
Um índice invertido destes documentos seria criado da seguinte forma: Primeiro, o conteúdo do campo informacao é dividido em palavras separadas (o que o Elasticsearch denomina de "terms" ou "tokens"). Depois, criamos uma lista de todos os "termos" únicos e então, listamos em quais documentos cada termo aparece. O resultado seria como a tabela abaixo:
Termo | Documento_1 | Documento_2 |
---|---|---|
Bulldog | X | |
O | X | |
bulldog | X | |
de | X | |
frances | X | X |
na | X | X |
pular | X | |
saltou | X | |
gosto | X | |
grama | X | X |
gosta | X | |
com | X |
Se quisermos fazer uma pesquisa para encontrar "bulldog frances", precisamos apenas encontrar os documentos que cada termo aparece:
Termo | Documento_1 | Documento_2 |
---|---|---|
bulldog | X | |
frances | X | X |
TOTAL | 2 | 1 |
Os dois documentos coincidem com a pesquisa, porém o primeiro documento possui mais proximidade com a busca, ou seja, ele é mais relevante para a nossa pesquisa. Porém, existem alguns problemas com o nosso índice invertido:
1° - "Bulldog" e "bulldog" aparecem como termos separados, enquanto para nós usuários, eles deveriam aparecer como a mesma palavra.
2° - "pular" e "saltou", por mais que não sejam a mesma palavra, são sinônimos, ou seja, possuem o significado similar, independente do tempo verbal.
Seja por qualquer motivo, nosso usuário pode esperar que os dois documentos sejam encontrados como resultado da busca. Portanto, se normalizarmos os termos em um formato padronizado, podemos apresentar documentos que contenham termos que não são exatamente o mesmo que o usuário requisitou, mas que são similares o suficiente para manter a relevância. Por exemplo:
1° - "Bulldog" e "O" podem ser colocados em minúsculo.
2° - "pular" e "saltou", podem ser indexados como apenas "pular".
Agora o nosso índice ficou assim:
Termo | Documento_1 | Documento_2 |
---|---|---|
o | X | |
bulldog | X | X |
de | X | |
frances | X | X |
na | X | X |
pular | X | X |
gosto | X | |
grama | X | X |
gosta | X | |
com | X |
Agora nossos documentos estão mais """"encontráveis"""", certo ? Esse processo de normalização é chamado de "analysis" pelo Elasticsearch e é utilizado para facilitar a busca de documentos que possam indicar o mesmo significado, mesmo se o conteúdo não for exatamente o requisitado.
O Elasticsearch fornece diversos "analisadores" que você pode utilizar na hora de padronizar seus documentos. Como este tópico é apenas explicativo, não iremos realizar nenhuma alteração em nossos dados. De qualquer forma, saiba que este é um ponto muito importante e que deve ser avaliado com atenção em um ambiente real. Para mais informações, segue o bom e velho link da documentação da Elastic.
Próximo: Avançando na Stack