Pesquisa e Indexação de Documentos com Azure Search

16 ago

Fala Galera,

Hoje vou falar sobre indexação e pesquisas de documentos utilizando Azure Search. Azure Search é um serviço na nuvem para indexação e pesquisas para Web e Mobile. O Azure Search permite você crie facilmente uma pesquisa robusta usando API REST ou um seu próprio SDK. O Azure Search é baseado no engine de busca open source chamado Lucene

O Azure Search é mais um dos serviços de indexação oferecidos. Atualmente existem as plataformas de indexação e pesquisa como AWS Cloud Search, ElasticSearch, Solr entre outros.

Com o Azure Search podemos:

Criar Queries poderosas:  Você pode criar queries poderosas já que o Azure Search oferece operadores lógicos, operadores frase de pesquisa , operadores de sufixo , operadores de precedência. Além disso, a sintaxe de consulta Lucene você pode ativar pesquisa difusa , pesquisa por proximidade entre outros.

Sugestões: As sugestões de pesquisa pode ser habilitado para campos autocomplete e consultas antecipada em documentos reais em seu índice.

Facetas: Com facetas podemos agrupar os resultados de pesquisa. Essa técnica de facetas é muitos útil quando precisamos catalogar os resultados por filtros, por exemplo, podemos catalogar os itens de resultado em um site de e-commerce.

Highlight: Com os highlight podemos destacar trechos dentro de um resultado de busca, isso é muito útil em busca de palavras em um grande volume de textos

Filtros: Os filtros pode ser usado para incorporar em conjuntos com a técnica de facetas e assim melhorar a formulação de consultas e filtro com base em critérios baseado nas facetas. Pode-se criar filtros também utilizando a sintaxe OData.

Geo Localização: Podemos utilizar de forma inteligente a geo localizçaão para filtrar e exibir localizações geográficas. O Azure Search permite que possamos explorar os dados com base em latitude e longitude e plotar esses dados em uma mapa por exemplo.

Como se usar o Serviço do Azure Search

Para se usar o serviço do Azure Search precisamos criar o serviço dentro do painel de administração do Azure, conforme figura abaixo.

AzureSearch1

Coloque o qual será endereço de busca, qual assinatura irá usar e a camada de preço conforme figura abaixo

AzureSearch2

Nosso serviço está criado, porém precisamos configurar o seu Índice. Podemos dizer que o índice é o paralelo da database ou schema em um banco de dados e é aonde criaremos nossos objetos de pesquisas, os objetos de pesquisas é como se fosse as tabelas em um banco de dados.

Os objetos que armazenamos em um índice devemos especificar os campos e o seus tipos assim o Azure Search conseguirá analisar de forma eficiente os seus tipos e assim criar pesquisas muitos rápidas. Clique em Adicionar um índice chamado product conforme figura abaixo.

AzureSearch3

Estamos com nosso índice criado, agora precisamos adicionar os dados no nossa índice.

Indexando Documentos

Para que possamos pesquisar, precisamos primeiramente indexar os documentos. Indexar documentos significa disponibilizar este dado na nuvem para acessar rápido a buscas. Internamente o Azure Search, analisa o documento, quais seus tipos e aloca esses documentos por afinidade de grupos de palavras para rápida consulta.

Para fazer isso, criei um projeto ASP.NET MVC para que possamos testar nossas funcionalidades no Azure Search.

Vamos criar uma classe chamada Product essa classe irá ter as mesmas propriedades do nosso índice. Crie a classe Product e adicione o código abaixo.

[SerializePropertyNamesAsCamelCase]
public class Product
{
   public String Id { get; set; } = Guid.NewGuid().ToString();
   public String Name { get; set; }
   public List<String> Categoria { get; set; } = new List<string>(); 
   public Double Preco { get; set; }
   public String Descricao { get; set; }
}

Vamos adicionar a SDK do Azure Search assim ficará muito mais fácil a indexação e as consultas ao Azure Search. A SDK se encontra no NuGet, execute o comando abaixo no Package Manager Console.

Install-Package Microsoft.Azure.Search

Com o pacote instalado,  criei uma rota que servirá para indexar nosso documento na nuvem adicione o código abaixo no seu Controller MVC

[HttpPost]
public ActionResult SaveDocument(Product model)
{
    string searchServiceName = "demo-search";
    string apiKey = "<api-key>";

   SearchServiceClient serviceClient = new SearchServiceClient(searchServiceName, new SearchCredentials(apiKey));
   SearchIndexClient indexClient = serviceClient.Indexes.GetClient("product");

   //Criando o documento a ser indexado
   var document = IndexBatch.Upload(new Product[] { model });

   //Atualizado o indice com o novo documento
   indexClient.Documents.Index(document);

   return View("Index");

}

 

Pesquisando Documentos

Com a indexação dos documentos prontas, precisamos realizar as buscas no serviço do Azure Search. A SDK do Azure Search contém todos os métodos necessários para que possamos realizar buscas de forma simples e rápida.

Neste nosso exemplo, crie uma nova Action para que possamos realizar as buscas. Adicione o código abaixo no seu Controller MVC.

[HttpPost]
public ActionResult Search(string searchText, string filter = null)
{
    string searchServiceName = "demo-search";
    string apiKey = "<API-KEY>";

    SearchServiceClient serviceClient = new SearchServiceClient(searchServiceName, new SearchCredentials(apiKey));

    SearchIndexClient indexClient = serviceClient.Indexes.GetClient("product");

    var sp = new SearchParameters();

    if (!String.IsNullOrEmpty(filter))
        sp.Filter = filter;

   DocumentSearchResult<Product> response = indexClient.Documents.Search<Product>(searchText, sp);

   return View("Search", response.Results.Select(x => x.Document).ToList());

}

 

Usando Sugestões

No Azure Search temos a opção de criar Sugestões. Sugestões são utilizadas em campos auto-complete para facilitar a busca de documentos. Temos diversos sites que utilizam esta técnica para melhorar a experiencia dos usuário para pesquisas de documentos.

Adicione este código abaixo para que possamos realizar as sugestões

[HttpPost]
public ActionResult Suggest(string term)
{

   string searchServiceName = "demo-search";
   string apiKey = "<API-KEY>";
   string suggestName = "namesuggestion";

   SearchServiceClient serviceClient = new SearchServiceClient(searchServiceName, new SearchCredentials(apiKey));
   SearchIndexClient indexClient = serviceClient.Indexes.GetClient("product");

   DocumentSuggestResult suggestion = indexClient.Documents.Suggest(term, suggestName);

   return Json(new
   {
      Result = suggestion.Results.Select(x => x.Text).ToArray()
   }, JsonRequestBehavior.AllowGet);

}

Com o rota criar podemos utilizar a biblioteca de autocomplete como JQuery UI por exemplo e assim melhorar a experiencia do usuário

Neste exemplo estou o JQuery UI adicione este código abaixo para o funcionamento do auto-complete.

<script>
      $(function () {

          $("#searchText").autocomplete({
              minLength: 2,
              source: function (request, response) {
                  $.getJSON("http://localhost:11567/Home/Suggest", {
                      term: request.term
                  }, function (data) {
                      response(data.Result);
                  });
              },
          });

      })
  </script>

 

Com o Azure Search, podemos fazer muitas coisas legais, ele é uma ferramenta poderosa quando precisamos criar pesquisas rápidas, consultáveis e filtráveis com Agrupamentos, Sugestões e etc. Grandes projetos contém algum tipo de indexação de documento para buscas rápidas de textos, itens e etc. Todos os grandes e-commerce do brasil contém alguma ferramenta de busca indexada para a busca no seus catálogos e um exemplo deste é a Amazon que na sua própria loja utiliza o Cloud Search para a busca de seus produtos.

O Código deste post se encontra no meu GitHub através deste link

Aprenda mais sobre o Azure Search aqui

Abs e até a próxima

Deixe uma resposta

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *

Esse site utiliza o Akismet para reduzir spam. Aprenda como seus dados de comentários são processados.