O Elasticsearch fornece um conjunto poderoso de opções para consulta de documentos em diversos cenários, portanto, é importante saber qual consulta aplicar em cada caso específico. Neste artigo, demonstro de forma simples as principais operações de leitura do Elasticsearch, utilizando o .NET e o package NEST.
Mais informações sobre Elasticsearch você encontra aqui e aqui.
Pré-requisitos
- Visual Studio 2022 (.NET 6.0)
- Docker
- Nuget package NEST
Configurando a API
O primeiro passo é configurar o docker compose na API com as imagens do Elasticsearch e Kibana:
Em seguida, é preciso configurar a connection string no arquivo appsettings.json:
"ElasticsearchSettings": {
"uri": "http://localhost:9200",
"defaultIndex": "indexactors",
"username": "elastic",
"password": "MagicWord"
}
E registrar a injeção de dependência na classe program.cs para realizar a conexão com o banco Elasticserach:
Abaixo são apresentados os principais tipos de consultas do Elasticsearch.
Term
- Retorna documentos que contêm um termo exato em um campo fornecido.
- Utilizado para localizar documentos com base em um valor numérico ou ID de um registro.
- Evite utilizar o term em consulta para campos de texto, pois o Elasticsearch altera os valores dos campos de texto como parte da análise. Utilize o match nestas situações.
- https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-term-query.html
Match
- Retorna os documentos que correspondem à um texto, número, data ou valor booleano fornecido.
- O padrão é procurar cada termo com operador or, e é possível alterar informando .Operator(Operator.And) no QueryContainerDescriptor.
- https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-match-query.html
Multi Match
- Utilizado em consultas que pesquisam o mesmo valor em várias propriedade do documento.
- https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-multi-match-query.html
Match Phrase
- Tentará corresponder à frase exata, na mesma ordem.
- A frase é considerada a partir do primeiro termo encontrado.
- https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-match-query-phrase.html
Match Phrase Prefix
- Tentará corresponder à frase exata em ordem, mas o último termo não precisa estar completo.
- A frase é considerada a partir do primeiro termo encontrado.
- https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-match-query-phrase-prefix.html
Wildcard
- Retorna documentos através de wildcard patterns.
- Utilizado com semelhança ao LIKE ‘%texto%’ do SQL Server.
- Não considera relevância.
- Evitar uso devido ao alto custo de processamento.
- https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-wildcard-query.html
Fuzzy
- Retorna documentos mesmo com termos informados incorretamente (ex: erro de digitação).
- A distância tolerada é de 1 caractere, podendo ser:
- Alterando um caractere: box -> fox
- Removendo um caractere: black -> lack
- Inserindo um caractere: sic -> sick
- Transposição entre dois caracteres adjacentes: act -> cat
- https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-fuzzy-query.html
Range
- Utilizada para retornar documentos em um intervalo de data, hora ou número.
- Para maior relevância em datas, é necessário informar o timezone.
- https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-range-query.html
Multiples Conditions
- Utilizado em consultas com várias condições
- Possível de utilizar o “&&” para condições AND e “||” para condições OR.
Testando as consultas
Para realizar os testes é preciso executar o comando docker compose na pasta raiz do projeto:
docker-compose up
Em seguida, execute o projeto WebApi, onde é possível realizar as principais operações de consulta com o banco Elasticsearch. (É necessário chamar o endpoint /api/actors/sample para preencher a base com dados de exemplo)
Finalizando
Neste artigo aprendemos a configurar e utilizar o Elasticsearch em .NET com o package NEST e os principais tipos de consultas. Existem muitas outras opções disponíveis, assim como configurações de filtros, analyzer e tokenizer, que serão abordados nos próximos artigos.
Os detalhes completos deste exemplo você encontra no meu GitHub: https://github.com/hgmauri/elasticsearch-with-nest