Nessun risultato. Prova con un altro termine.
Guide
Notizie
Software
Tutorial

Ricerche con ASP.NET e Live Search

Lanciare ricerche di testi e immagini sul motore Live Search e gestire i risultati tramite web service. Anche per ricerche interne al sito
Lanciare ricerche di testi e immagini sul motore Live Search e gestire i risultati tramite web service. Anche per ricerche interne al sito
Link copiato negli appunti

Moltissimi service provider offrono le funzionalità dei propri servizi attraverso API specifiche, che ogni sviluppatore può utilizzare sfruttando il servizio nelle proprie applicazioni. Tale tendenza viene facilitata notevolmente dall'utilizzo dei Web Service, ma molto diffusi sono anche i download di vere e proprie librerie da poter utilizzare per applicazioni Web e Desktop.

Anche Microsoft offre un set di tool, servizi, API e documentazione che ci permettono di utilizzare una buona fetta dei servizi della famiglia Windows Live. È possibile scaricare gli SDK per l'utilizzo dei servizi come:

Servizi Microsoft utilizzabili grazie alle API
Windows Live ID Application-Based Storage Contacts
Photos Spaces Search
Virtual Earth Messenger Alerts
Agents Silverlight Streaming

In questo articolo, ci occuperemo del servizio di ricerca "Live Search" e di come integrarlo all'interno di un'applicazione ASP.NET.

Per quanto riguarda il servizio di ricerca, oltre alle API specifiche che vedremo, possiamo avvalerci di un componente pre-confezionato da inserire senza troppa fatica nelle nostre pagine Web.

Sulla pagina principale delle API Windows Live search troviamo l'opzione "get your Search Box now", sotto la voce Ajax Control. Seguendo il link ci viene chiesto di scegliere tra la casella di ricerca di base e quella avanzata.

Figura 1 - Casella di ricerca di Live Search
Casella di ricerca di Live Search

Effettuata la scelta, ci viene fornito il codice HTML da copiare e incollare nel nostro sito. L'unico accorgimento da prendere prima dell'utilizzo del box di ricerca, è quello di inserire il codice del set di caratteri, in un campo nascosto. Tale codice, può essere scelto da questa lista. Nell'esempio utilizziamo il codice 1250 (Central Europe).

Ricerca nel Web da Live Search

<form method="get"  action="http://search.live.com/results.aspx"> 
  <input type="hidden" name="cp"  value="1250"/> 
  <input type="hidden" name="FORM" value="FREEWS"/>
  <a href="http://search.live.com/">
    <img src="http://search.live.com/s/affillogoLive.gif" style="border:none" alt="Live Search"/>
  </a>
  <input type="text" name="q" size="30" />
  <input type="submit" value="Search Web"/>         
</form>

In questo modo, possiamo aggiungere delle funzionalità di ricerca al nostro sito in maniera rapida ed indolore. Oltre a questa funzionalità di base, il servizio di Live Search offre agli sviluppatori un vero e proprie Web Service, dotato di relativa documentazione, da poter invocare per le nostre ricerche.

Live Search Web Service

Si tratta di un Web Service SOAP, che ripropone le API esposte dal servizio di ricerca di casa Microsoft. Questo ci permette di lanciare le ricerche "da codice" (quindi dalle nostre applicazioni) e di manipolare i risultati ottenuti dal motore di Live Search.

Indirizzo del Web Service

http://soap.search.msn.com/webservices.asmx?wsdl

Il file WSDL che abbiamo raggiunto con questo indirizzo, definisce il formato dei messaggi che dovranno essere scambiati per ogni tentativo di ricerca, stabilisce quali tipi di dati dobbiamo utilizzare e quali sono le impostazioni di default per alcune proprietà.

Attualmente, le API del servizio di Live Search sono alla versione 1.1b; sono state infatti applicate delle migliorie al servizio in modo tale da potere estendere le ricerche a più fonti di informazione.

Risorse tra le quali è possibile cercare con Live Search Web Service
Libero utilizzo Pagine web Immagini
News Punti geografici Spelling
Utilizzo commerciale Video Instant answers
Phone book

Inoltre, è possibile ricercare informazioni filtrando sulla lingua desiderata, applicare il filtro sui contenuti vietati ai minori, evidenziare le parole ricercate all'interno dei risultati ottenuti, disabilitare la correzione automatica dei testi ricercati e tanto altro ancora.

Per trasformare il WSDL del servizio Web in classi proxy, aggiungiamo il riferimento al servizio Web nell'applicazione (Click destro sul nome del progetto e poi su "Aggiungi riferimento Web").

Figura 2. Inserire il riferimento Web
Inserire il riferimento Web

Fatto ciò, abbiamo a disposizione alcune classi per gestire le ricerche.

Classe Descrizione
MSNSearchService È la classe proxy del web service, che espone il metodo Search per lanciare eventuali ricerche
SourceRequest È la classe che rappresenta una singola sorgente di informazioni all'interno della quale ricercare
SearchRequest Rappresenta una singola richiesta di ricerca. Contiene le informazioni sulla chiave ricercata, l'array contenente le fonti all'interno delle quali ricercare, la lingua, etc. All'interno di un'istanza di questa classe, va specificato anche l'AppId (di cui parleremo a breve) per il corretto funzionamento delle ricerche
SearchResponse È la classe che rappresenta i risultati di ogni singola richiesta di ricerca
SourceResponse Rappresenta i risultati all'interno di una singola fonte di informazioni. Portandosi con se anche il totale dei risultati ottenuti
Result Classe che contiene tutte le informazioni che possono essere accedute riguardo un singolo risultato; quindi indirizzo, titolo della pagina, descrizione, sommario, etc.

Nota: per utilizzare il "Live Search Web Service", è necessario procurarsi un "Application Id" (AppId) per ogni applicazione. L'AppId è una stringa che identifica ogni richiesta di ricerca proveniente dalla vostra applicazione. Ciò permette a Microsoft di controllare che non vengano sforati i limiti di utilizzo gratuito del servizio Web. Tali limiti sono posti a 25.000 query al giorno con una pausa da una query e l'altra di almeno 8 secondi.
Possiamo ottenere un AppId dalla pagina Developer Center di Live Search. Clicchiamo su Get an AppId. Se ci viene richiesto ci autentichiamo con il LiveID.

Una volta creata la classe proxy per il web service di Live Search, prelevato il proprio AppId e presa confidenza con le classi generate da Visual Studio 2008, possiamo procedere con la nostra prima query.

Default.aspx

<asp:TextBox ID="txt" runat="server" />
<asp:Button ID="btnSearch" runat="server" Text="Search" onclick="Search" />
<br />

<asp:RadioButtonList ID="searchSrc" runat="server" RepeatDirection="Horizontal">
  <asp:ListItem Selected="True">Web</asp:ListItem>
  <asp:ListItem>html.it</asp:ListItem>
</asp:RadioButtonList>
<hr />

<asp:Repeater ID="results" runat="server">
  <ItemTemplate>
    <a href='<%# Eval("Url") %>'><%# Eval("Title") %></a><br />
    <%# Eval("Description") %><br />
    <span style="text-decoration: underline"><%# Eval("Url") %></span>
    <hr />
  </ItemTemplate>
</asp:Repeater>

Default.aspx.cs

protected void Search(object sender, EventArgs e)
{
  string key = (searchSrc.SelectedValue == "Web") ? txt.Text : String.Format("{0} site:html.it", txt.Text);
  
  // crea l'istanza del servizio di ricerca
  MSNSearchService service = new MSNSearchService();

  // definisce la sorgente in cui ricercare
  SourceRequest webSource = new SourceRequest();
  webSource.Source = SourceType.Web;

  // crea l'istanza della richiesta
  SearchRequest request = new SearchRequest();
  request.AppID = "...";       
  request.Requests = new SourceRequest[] { webSource };
  request.Query = key;

  // avvia la ricerca
  SearchResponse response = service.Search(request);

  if (response.Responses.Length > 0)
  {
    results.DataSource = response.Responses[0].Results;
    results.DataBind();
  }
}

Nell'esempio abbiamo effettuato una ricerca tra le pagine Web, utilizzando una singola istanza della classe SourceRequest e indicando il valore SourceType.Web alla proprietà Source. L'esempio consente anche di restringere la ricerca al nostro sito aggiungendo alla stringa key, che contiene le chiavi di ricerca, il testo site:, seguito dal nome a dominio del sito.

Per realizzare una ricerca su contenuti in sola lingua italiana, assegnamo l'identificativo it-IT alla proprietà CultureInfo della classe SearchRequest.

request.CultureInfo = "it-IT";

Possiamo consultare questa tabella per i nomi per le differenti culture.

Inoltre, abbiamo la possibilità di attivare il filtro per i minori

request.SafeSearch = SafeSearchOptions.Strict;

e di abilitare il meccanismo che evidenzia le parole ricercate:

request.Flags = SearchFlags.MarkQueryWords;

Infine, possiamo anche decidere di ampliare la ricerca su più fonti di informazioni, creando più istanze della classe SourceRequest, ognuna con un valore differente per la proprietà Source, e passarle all'interno di un array alla proprietà Requests della classe che rappresenta ogni singola ricerca (SearchRequest).

SourceRequest webSource = new SourceRequest();
webSource.Source = SourceType.Web;

SourceRequest newsSource = new SourceRequest();
newsSource.Source = SourceType.News;

SourceRequest spellSource = new SourceRequest();
spellSource.Source = SourceType.Spelling;

SearchRequest request = new SearchRequest();
request.AppID = "...";
request.Requests = new SourceRequest[] { webSource, newsSource, spellSource };

Ricerca di immagini

Come abbiamo accennato, possiamo effettuare le nostre ricerche anche sulle immagini. L'approccio è quello già visto, quello che cambia è la configurazione della nostra richiesta, in quanto specificheremo una sorgente (Source) differente.

protected void Search(object sender, EventArgs e)
{
  MSNSearchService service = new MSNSearchService();

  // definisce la sorgente di immagini e i campi
  SourceRequest imageSource = new SourceRequest();
  imageSource.Source = SourceType.Image;
  imageSource.ResultFields = ResultFieldMask.Image | ResultFieldMask.Url;

  SearchRequest request = new SearchRequest();
  request.AppID = "...";
  request.Requests = new SourceRequest[] { imageSource };
  request.Query = txt.Text;

  SearchResponse response = service.Search(request);
  
  if (response.Responses.Length > 0)
  {
    results.DataSource = response.Responses[0].Results;
    results.DataBind();
  }
}

Infine, dobbiamo formattare i risultati per fare in modo di stampare a video le immagini trovate.

SearchImages.aspx

<asp:TextBox ID="txt" runat="server" />
<asp:Button ID="btnSearch" runat="server" Text="Search" onclick="Search" />
<hr />
<asp:Repeater ID="results" runat="server">
  <ItemTemplate>
    <%# FormatResult(Eval("Url"), Eval("Title"), Eval("Image")) %>
    <%# Eval("Description") %><br />
    <span style="text-decoration: underline"><%# Eval("Url") %></span>
    <hr />
  </ItemTemplate>
</asp:Repeater>

SearchImages.aspx.cs

protected string FormatResult(object title, object url, object image)
{
  string address = (image == null) ? String.Format("{0}", url) : String.Format("{0}", title);
  
  StringBuilder html = new StringBuilder();
  
  html.AppendFormat("<a href='{0}' title='{1}'>", address, title);
  
  if (image != null)
    html.AppendFormat("<img src='{0}' alt='{1}' border='0' />", ((com.live.search.soap.Image)image).ImageURL, title);
  else
    html.AppendFormat("{0}", title);
  
  html.Append("</a><br />");

  return html.ToString();
}

Abbiamo aggiunto la funzionalità di ricerca di immagini alla nostra applicazione ASP.NET con uno sforzo veramente minimo. Chiaramente questo è un esempio e deve essere trattato come tale, in quanto, giusto per dirne una, potremmo creare delle thumbnail in automatico per migliorare l'aspetto dell'elenco dei risultati.

Conclusioni

Abbiamo visto come sfruttare le API messe a disposizione da Live Search per la ricerca da uno o più tipi di fonti, in accordo con le teorie attuali su cui si basano le architetture SOA. È importante notare con quanta facilità si possono ottenere ottimi risultati utilizzando il Web service di Live Search, per arricchire di ricerche efficaci le nostre applicazioni Web.

Giuseppe Marchi è consulente informatico in ambito Microsoft .NET e dottore in Comunicazione Digitale; co-autore del libro "Pocket C#", editore Apogeo, collabora con community on-line di sviluppatori fornendo articoli e materiale. Dal 2006 è certificato Microsoft su ASP.NET 2.0 e Microsoft Certified Technology Specialist su Windows Sharepoint Services 3.0. Il suo sito Web personale www.peppedotnet.it contiene ulteriori informazioni ed esempi di codice.

Ti consigliamo anche