Introducción

Hace algún tiempo hice un artículo de cómo podemos utilizar el API de Live Search en nuestras aplicaciones de Silverlight.  Este es únicamente una actualización a ese artículo pero ahora utilizando el API de Bing.

bing

Ahora que Bing ha sido liberado al público en general uno de los puntos muy importantes a destacar es la actualización que Microsoft ha hecho del API de búsqueda que podemos incorporar en nuestras aplicaciones.  Aunque la experiencia en el desarrollo con esta nueva API es bastante similar a lo que teníamos con anterioridad en Live Search, es destacable el hecho de que ahora podemos hacer búsquedas en Encarta Instant Answers (Respuestas Instantáneas de Encarta), lo cual nos permite no solamente buscar una cadena en páginas Web, sino también en esta importante y enorme enciclopedia en línea.  Esto lo logramos usando InstantAnswers como parte de la propiedad SourceType[] cuando creamos un Request.

Otro punto novedoso del API es el SourceType de tipo RelatedSearch el cual nos permite hacer búsquedas relacionadas con la búsqueda actual.  Para ver todas las novedades del API de Bing lo puedes hacer en esta página.

InstantAnswers de Encarta con Silverlight

Paso 1

Lo primero que tenemos que hacer al igual que en la versión del API de Live Search es registrarnos en el portal de desarrolladores para obtener un AppID.  El AppID es la puerta que nos permite hacer búsquedas en el motor ya que está ligado a nuestra cuenta de MSN.  Para obtener tu AppID lo puedes hacer aquí.

Paso 2

Ahora que ya tienes tu AppID disponible el siguiente paso será decidir la manera de como nos vamos a comunicar al servicio de búsqueda: a través de JSON, XML o SOAP.  En el caso de este artículo haré la demostración con SOAP debido a que Visual Studio .NET nos ayuda a crear la clase proxy ya que el servicio es autodescriptible, es decir, expone un WSDL que podemos usar para identificar su funcionamiento.

Paso 3

El paso siguiente es crear una nueva aplicación de Silverlight por medio de la plantilla de Visual Studio .NET.  Posteriormente agregamos la referencia al servicio localizado en: http://api.search.live.net/search.wsdl?AppID=TUAPPID (es el mismo Url que el API de Live Search).

Para hacer una búsqueda en Encarta Instant Answers tenemos que especificar el tipo de SourceType en la propiedad Sources cuando creamos el Request.  El siguiente fragmento código muestra un ejemplo de la construcción del Request:

SearchRequest CreateRequest(string query)
{
    SearchRequest request = new SearchRequest();
    request.AppId = "TUAPPID";
    request.Market = "es-MX";
    request.Query = query;
    request.Sources = new SourceType[] { SourceType.InstantAnswer };
 
    return request;
}

Noten cómo en este ejemplo estoy estableciendo la propiedad Market a “es-MX”.  Al especificar esto estoy indicando el idioma y país para la búsqueda.  Si no hacemos esto la búsqueda automáticamente tratará de detectar mi localización geográfica e idioma adecuado basándose en mi dirección de IP y otros parámetros.

Asimismo esto es importante mencionar ya que algunas preguntas abiertas no podrán ser contestadas en esta demostración ya que en su mayoría responde únicamente a preguntas en idioma Inglés.

Finalmente un punto muy importante al obtener las respuestas de Encarta Instant Answers es el hecho de que la propiedad InstantAnswerSpecificData es de tipo string pero está expresada como un documento XML, así que la interpretación de dicha cadena es necesaria.  A continuación se muestra un código de ejemplo de cómo podemos interpretar dicha propiedad para sacar la información necesaria:

void ProcessResponse(InstantAnswerResponse response)
{
    popup.IsOpen = false;
    if (response != null)
    {
        var qry = from r in response.Results
                  where r.InstantAnswerSpecificData != null
                  && r.ContentType.Equals("Encarta.Facts")
                  select new Result() { Title = r.Title, 
                      Url = r.Url, 
                      Data = GetSpecificData(r.InstantAnswerSpecificData),
                      Attribution = r.Attribution,
                      ClickThroughUrl = r.ClickThroughUrl
                  };
 
        Results.DataContext = qry.ToList();
    }
    
}
 
string GetSpecificData(string specificData)
{
    XDocument document = XDocument.Parse(specificData);
    
    string result = document.Descendants(
        XName.Get(
        "{http://schemas.microsoft.com/LiveSearch/2008/04/XML/encarta}Value")).First().Value;
    return result;
}

Bing con Silverlight

Para ver la aplicación en acción lo puedes hacer en esta página (el plugin de Silverlight 3 es requerido):

http://silverlight.services.live.com/invoke/76819/Silverlight%20-%20Bing%20Instant%20Answers/iframe.html