Espace perso
Ignorer les liens de navigationAccueil >> .Net >> ASP.Net >> L'API Live Search
Ignorer les liens de navigation
Accueil de mon site Accueil
Vous trouverez ici des tutoriels en relation avec le Framework .Net .Net .Net
 SQL Server SQL Server
 IIS IIS
 Tests Tests
 Livres Livres

API Live Search : Où comment chercher dans mon site perso sans effort ou presque

Publié le jeudi 27 septembre 2007, dernière modification le lundi 28 janvier 2008

Logo Windows Live

Live Search est le moteur de recherche Web de Microsoft . Comme je vous en parlais dans un de mes billets , les API Live sont accessibles aux développeurs. Nous allons donc voir comment utiliser l'API Live Search pour intégrer un moteur de recherche à notre site sans efforts où presque, et vous allez voir qu'il est possible d'en faire des choses.

1. Remarques générales

L'accès à ces API est gratuit . Cependant, il existe des restrictions sur Live Search , qui limitent le nombre de résultats disponibles (1000 au total selon la MSDN ) et le nombre de requêtes par jour (10 000 me semble-t-il).

Outre ces restrictions, il vous faudra un Application ID . Hé oui, c'est grâce à cet Application ID que vous serez limité :p

Pour obtenir gratuitement votre Application ID, rendez-vous sur le site de Microsoft . Je vous laisse suivre les procédures d'identification, elles sont relativement simples. N'oubliez surtout pas de sauvegarder votre ID.

2. Contrat WSDL

Les services Live sont basés sur des Services Web. La première chose à faire sera donc de rajouter une référence Web à notre projet. Nous y reviendrons plus tard, nous allons commencer par étudier l'API en elle-même.

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

Comme tout Service Web, le principe est l'envoie d'une requête vers le serveur, et on attend sa réponse. Voyons comment se déroulent ses deux étapes, surtout la définition de la requête et le traitement de résultat. La communication, c'est .Net qui gère tout seul comme un grand.

3. La Requête

Pour pouvoir effectuer une recherche via Live Search , il est nécessaire de configurer une requête.

C'est le type SearchRequest que nous allons utiliser pour configurer cette recherche :

SearchRequest
Le type SearchRequest

Outre le constructeur, ce type dispose seulement de propriétés.

  • AppID : C'est l'Application ID que vous devez avoir obtenu pour pouvoir utiliser les services Live.
  • CultureInfo : Vous pouvez spécifier la langue des éléments parmi lesquels Live Search doit chercher, par exemple fr-FR pour les pages en français. Vous trouverez une liste des cultures supportées sur la MSDN .
  • SafeSearch : Cette option vous permet de filtrer le contenu à caractère pornographique. L'option Off désactive ce filtre, Moderate supprime seulement les images (valeur par défaut) et Strict à la fois les images et le texte à caractère pornographique.
  • Location : Cette option vous permet de rechercher dans un périmètre bien précis. Le type de cette propriété est constitué d'une longitude, d'une latitude et d'un rayon de recherche.
  • Flags : Cette option permet de spécifier si les correspondances trouvées seront marquées. Nous verrons plus tard comment utiliser cet attribut.
  • Query : La recherche à proprement parler. Quand vous tapez dans Live Search " tutoriel Live Search ", c'est le texte qui est cherché. Vous trouverez la liste des options utilisables pour la recherche à cette URL , la liste est longue et est valable pour l'utilisation du Web Service.
  • Requests : C'est la que nous allons définir toutes les recherches que nous allons effectuer. Je vais tout de suite revenir en détail sur cette option.

3-1. SourceRequest

Live Search permet d'effectuer plusieurs recherches en simultanée. Pour être exacte, une recherche, mais sur plusieurs types de résultats en même temps.

SourceRequest
Le type SourceRequest

Idem que pour SearchRequest , le constructeur n'a pas grand intérêt.

Voici donc un détail de ces propriétés :

  • Count : Le nombre de résultats à retourner. Ce nombre doit être compris entre 0 et 50. Toute valeur supérieure sera ramenée à la valeur par défaut : 10.
  • FileType : Permet de spécifier un type de fichier spécifique à rechercher. La liste des types supportés est disponible sur la MSDN . Ce paramètre ne fonctionne que pour une recherche de type Web ou PhoneBook et son comportement est différent selon le cas.
  • Offset : Le résultat peur comporter jusqu'à 250 éléments exploitables avec notre compte gratuit. Mais comment faire si l'option count ne permet que l'affichage de 50 résultats. En spécifiant l'Offset. Bien entendu, la somme Offset + Count doit être inférieure à 250.
  • ResultFields : Les résultats sont récupérés sous forme de tableaux de type Result. Result comprend plusieurs champs, et cette option permet de spécifier les champs qui seront renseignés. Reportez-vous à la MSDN pour connaître tous les champs disponibles .
  • SearchTagFilters : Cette option est un peu complexe et j'avoue avoir du mal à la comprendre. La MSDN
  • Source : Cette propriété permet de spécifier le type de recherche que nous allons effectuer. Il peut s'agir d'une recherche Web, des contacts téléphoniques, tout comme pages-jaunes (PhoneBook). Pour plus de détails, reportez-vous à la MSDN . Certaines options sont réservées aux usages commerciaux ou ne sont pas implémentées.
  • SortBy : Cette option ne s'applique que pour une recherche de type PhoneBook. Elle permet de choisir l'ordre dans lequel seront affichés les résultats, en se basant sur la distance spécifiée par la propriété Location de la SearchRequest.

Passons maintenant à la construction d'une requête pour illustrer tout ce que nous venons de voir :

Préparation de la commande pour le Web Service Copier le code Copier le code
 1 ' Déclaration et instanciation du service
 2 Dim service As New MSNSearchService
 3 
 4 ' Nouvelle requête
 5 Dim request As New SearchRequest
 6 
 7 request.CultureInfo = "fr-FR" ' On cherche sur les pages en français
 8 request.Flags = SearchFlags.MarkQueryWords ' On marque les résultats
 9 request.AppID = "Votre Application ID ici" ' Tout est dans le texte
10 request.SafeSearch = SafeSearchOptions.Strict ' Pas de porno on sait jamais
11 request.Location = Nothing ' On s'en fiche dans ce cas
12 ' On cherche tout ce qui a trait à iis sur le domaine odelmotte.fr (site, blog, applis, ...)
13 request.Query = "iis site:odelmotte.fr" 
14 
15 ' Nouvelle source de recherche
16 Dim source As New SourceRequest()
17 source.Source = SourceType.Web ' On cherche des pages web
18 source.ResultFields = ResultFieldMask.All ' On veut récupérer toutes les infos possibles
19 source.Offset = 0 ' A partir du premier résultat
20 source.Count = 25 ' les 25 premiers éléménts
21 
22 ' On ajoute notre source à notre requête
23 request.Requests = New SourceRequest() {source}

Fermer

Voilà, rien de bien compliqué.

Passons à la réponse, nous verrons ensuite comment réaliser une recherche de A à Z.

4. La Réponse

La réponse du Web Service Live Search est de type SearchResponse :

SearchResponse
Le type SearchResponse

Comme vous le voyez, une SearchResponse ne contient qu'un tableau de SourceResponse . C'est cette dernière qui va nous être utile puisqu'elle contient les résultats à notre recherche (qui peut être multiple comme nous l'avons vu précédemment) :

SourceResponse
Le type SourceResponse

Ce type comporte 4 propriétés :

  • Offset : Correspond à l'Offset de la réponse dans l'ensemble du résultat de recherche. Il correspond, sur le principe, à l'attribut Offset de la SourceRequest.
  • Results : Ce sont les résultats à proprement parler. Cette propriété, ou plutôt ses éléments, méritent un peu d'attention, nous l'étudierons juste après.
  • Source : Le type de source, qui correspond à celui ou à ceux passés à la SearchRequest.
  • Total : Le nombre total de résultats trouvés. Ce nombre peut être supérieur au nombre de résultats retournés (250 dans notre cas). C'est le nombre réel de résultats.

Intéressons nous maintenant au résultat à proprement parler :

Result
Le type Result

Comme vous pouvez le constater, un résultat comporte un grand nombre de détails.

  • Address : Contient les informations relatives à une adresse, lors de la recherche dans l'annuaire.
  • CacheUrl : Live Search possède un cache pour les pages recherchées. Cette URL est celle de la version en cache sur Live Search.
  • DateTime : Date, sous forme explosée, d'une news.
  • Description : Retourne la description du résultat. En général, le texte contient une occurrence du texte recherché.
  • DisplayUrl : Je n'ai pas noté de différence avec la propriété URL qui renvoie la même valeur.
  • Image : Contient les informations relatives à une image ainsi qu'à son aperçu, notamment des informations de taille.
  • Location : Emplacement du résultat trouvé lors d'une recherche dans l'annuaire.
  • Phone : Numéro de téléphone trouvé.
  • ResultType : Type de résultat
  • SearchTags / SearchTagsArray : Je n'aborderais pas le sujet, pour les mêmes raisons que précédemment.
  • Source : Source de la news
  • Summary : Réservée à une utilisation commerciale.
  • Title : Titre de la page ou de la news retrouvée.
  • Url : URL de la page de résultat. Dans le cas d'une recherche d'image, c'est l'URL de la page de l'image.

Voyons maintenant comment récupérer le résultat de notre recherche :

Récupération de la réponse du Web Service Copier le code Copier le code
 1 ' On déclare l'objet qui accueillera la réponse du Web Service
 2 Dim searchResponse As SearchResponse
 3 Try
 4     ' On invoke la seule méthode du Web Service et le tour est joué.
 5     searchResponse = service.Search(request)
 6 Catch ex As Exception
 7     Return Nothing
 8 End Try
 9 
10 Return searchResponse.Responses

Fermer

5. Exploitation du résultat

Nous allons construire un petite page, assez rapidement, pour afficher les résultats de nos requêtes.

Pour ça, nous allons utiliser un site web tout neuf, en mode fichier ou IIS, comme bon vous semble, faire au plus simple, vous verrez qu'il n'y a rien de bien sorcier.

N'oubliez pas de rajouter la référence au WebService . Dans mon cas elle est appelée LiveSearch .

Default.aspx Copier le code Copier le code
 1 <%@ Page Language="VB" AutoEventWireup="true" CodeFile="Default.aspx.vb" Inherits="_Default"
 2     Theme="Default" %>
 3 
 4 <%@ Register Assembly="System.Web.Extensions, Version=3.5.0.0, Culture=neutral, 
 5     PublicKeyToken=31bf3856ad364e35" Namespace="System.Web.UI" TagPrefix="asp" %>
 6 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
 7 <html xmlns="http://www.w3.org/1999/xhtml">
 8 <head runat="server">
 9     <title>odelmotte.fr - Recherche</title>
10 </head>
11 <body>
12     <form id="form1" runat="server">
13         <pre>
14             <table>
15                 <tr>
16                     <td>
17             <asp:Label ID="Label1" runat="server" Text="Votre recherche :"></asp:Label></td>
18                     <td>
19                         <asp:TextBox
20                 ID="txtSearch" runat="server"></asp:TextBox></td>
21                     <td rowspan="3">
22             <asp:Button ID="btnSearch" runat="server" OnClick="btnSearch_Click" Text="Chercher" /></td>
23                 </tr>
24                 <tr>
25                     <td>
26             <asp:Label ID="Label2" runat="server" Text="Type de recherche :"></asp:Label></td>
27                     <td>
28                         <asp:RadioButtonList
29                 ID="RadioButtonList1" runat="server" RepeatDirection="Horizontal" RepeatLayout="Flow">
30                 <asp:ListItem Selected="True">Pages</asp:ListItem>
31                 <asp:ListItem>Images</asp:ListItem>
32             </asp:RadioButtonList></td>
33                 </tr>
34                 <tr>
35                     <td colspan="2">
36             <asp:CheckBox ID="chkOdelmottefrOnly" runat="server" Checked="True" 
37                 Text="Rechercher sur odelmotte.fr seulement" /></td>
38                 </tr>
39             </table>
40         </pre>
41         <br />
42         <asp:Literal ID="litResult" runat="server"></asp:Literal>
43     </form>
44 </body>
45 </html>

Fermer
Default.aspx.vb Copier le code Copier le code
  1 Imports LiveSearch
  2 
  3 Partial Class _Default
  4     Inherits System.Web.UI.Page
  5 
  6     Protected Sub btnSearch_Click(ByVal sender As Object, ByVal e As System.EventArgs) _
  7             Handles btnSearch.Click
  8         Dim res As SourceResponse() = SearchSample()
  9         Me.litResult.Text = ""
 10         If res IsNot Nothing Then
 11             For i As Integer = 0 To res.Length - 1
 12 
 13                 If res(i).Results.Length <> 0 Then
 14                     Dim resStart As Integer = res(i).Offset + 1
 15                     Dim resEnd As Integer = res(i).Offset + res(i).Results.Length
 16 
 17                     Me.litResult.Text &= "Résultats de " & resStart & " à " & resEnd & " sur " & _
 18                         res(i).Total
 19                 Else
 20                     Me.litResult.Text &= "Pas de résultat"
 21                 End If
 22 
 23                 For j As Integer = 0 To res(i).Results.Length - 1
 24                     Me.litResult.Text &= "<pre class=""resultitem"">"
 25                     Me.litResult.Text &= "<b>"
 26                     Me.litResult.Text &= HighlightSearchResult(res(i).Results(j).Title)
 27                     Me.litResult.Text &= "</b>"
 28                     Select Case Me.RadioButtonList1.SelectedIndex
 29                         Case 0
 30                             Me.litResult.Text &= RenderWebResult(res(i).Results(j))
 31                         Case 1
 32                             Me.litResult.Text &= RenderImageResult(res(i).Results(j))
 33                         Case Else
 34                             Me.litResult.Text &= RenderWebResult(res(i).Results(j))
 35                     End Select
 36                     Me.litResult.Text &= "</pre>"
 37                 Next
 38             Next
 39         Else
 40             Me.litResult.Text = "Erreur lors de la récupération des informations"
 41         End If
 42     End Sub
 43 
 44     Public Function SearchSample() As SourceResponse()
 45 
 46         ' Déclaration et instanciation du service
 47         Dim service As New MSNSearchService
 48 
 49         ' Nouvelle requête
 50         Dim request As New SearchRequest
 51 
 52         request.CultureInfo = "fr-FR" ' On cherche sur les pages en français
 53         request.Flags = SearchFlags.MarkQueryWords ' On marque les résultats
 54         request.AppID = "VOTRE APPLICATION ID ICI" ' Tout est dans le texte
 55         request.SafeSearch = SafeSearchOptions.Strict ' Pas de porno on sait jamais
 56         request.Location = Nothing ' On s'en fiche dans ce cas
 57 
 58         ' On crée la chaîne de requêtage, en s'appuyant sur les 
 59         ' fonctionnalités avancés comme je vous le signalais.
 60         Dim querystring As String = Me.txtSearch.Text.Trim
 61         If Me.chkOdelmottefrOnly.Checked Then
 62             querystring &= " AND site:odelmotte.fr"
 63         End If
 64         ' On cherche tout ce qui a trait à iis sur le domaine odelmotte.fr 
 65         ' (site, blog, applis, ...)
 66         request.Query = querystring 
 67 
 68         ' Nouvelle source de recherche
 69         Dim source As New SourceRequest()
 70 
 71         source.ResultFields = ResultFieldMask.All ' On veut récupérer toutes les infos possibles
 72 
 73         'On établi le type de recherche que l'on souhaite effectuer
 74         Select Case Me.RadioButtonList1.SelectedIndex
 75             Case 0
 76                 source.Source = SourceType.Web ' On cherche des pages web
 77             Case 1
 78                 source.Source = SourceType.Image ' On cherche des images
 79                 source.ResultFields = source.ResultFields Or ResultFieldMask.Image
 80             Case Else
 81                 source.Source = SourceType.Web ' On cherche des pages web
 82         End Select
 83 
 84         source.Offset = 0 ' A partir du premier résultat
 85         source.Count = 25 ' les 25 premiers éléménts
 86 
 87         ' On ajoute notre source à notre requête
 88         request.Requests = New SourceRequest() {source}
 89 
 90         ' On déclare l'objet qui accueillera la réponse du Web Service
 91         Dim searchResponse As SearchResponse
 92         Try
 93             ' On invoke la seule méthode du Web Service et le tour est joué.
 94             searchResponse = service.Search(request)
 95         Catch ex As Exception
 96             Return Nothing
 97         End Try
 98 
 99         ' On retourne les réponses
100         Return searchResponse.Responses
101 
102     End Function
103 
104     Private Function RenderWebResult(ByVal result As Result) As String
105         Dim res As New StringBuilder
106 
107         res.Append("<p>")
108         If Not String.IsNullOrEmpty(result.Description) Then
109             res.Append(HighlightSearchResult(result.Description))
110         Else
111             res.Append("Pas de description")
112         End If
113         res.Append("</p>")
114         res.Append("<a href=""")
115         res.Append(result.Url)
116         res.Append(""">")
117         res.Append(result.Url)
118         res.Append("</a>")
119 
120         Return res.ToString()
121     End Function
122 
123     Private Function RenderImageResult(ByVal result As Result) As String
124         Dim res As New StringBuilder
125         res.Append("<p>")
126         res.Append("<a href=""")
127         res.Append(result.Image.ImageURL)
128         res.Append(""">")
129         res.Append("<img src=""")
130         res.Append(result.Image.ThumbnailURL)
131         res.Append(""" alt=""Thumb"" />")
132         res.Append("</a>")
133         res.Append("</p>")
134         res.Append(String.Format("<p>Taille de l'image : {0}x{1}</p>", _
135             result.Image.ImageWidth, result.Image.ImageHeight))
136         res.Append("<a href=""")
137         res.Append(result.Url)
138         res.Append(""">")
139         res.Append(result.Url)
140         res.Append("</a>")
141 
142         Return res.ToString
143     End Function
144 
145     Private cs As Char = Char.ConvertFromUtf32(&HE000)
146     Private ce As Char = Char.ConvertFromUtf32(&HE001)
147     Private Function HighlightSearchResult(ByVal res As String) As String
148         If res.Contains(ce) Then
149             res = res.Replace(cs, "<span class=""highlight"">")
150             res = res.Replace(ce, "</span>")
151         End If
152         Return res
153     End Function
154 
155 End Class

Fermer
Feuille de style utilisée Copier le code Copier le code
 1 body 
 2 {
 3     font-family:Verdana;
 4     font-size:small;
 5 }
 6 
 7 span.highlight
 8 {
 9     background-color: #ccff99;
10     font-weight: bold;
11 }
12 
13 pre.resultitem
14 {
15     padding: 5px;
16     border: solid 1px #808080;
17     background-color: #ffffcc;
18     margin:5px;
19 }

Fermer

Pour la feuille de style, j'ai utilisé la bonne vieille technique du thème abordée dans ce tutoriel : http://www.odelmotte.fr/net/asp/theming/

Je vous ai fait dont dans cet exemple de la gestion d'erreurs, d'une grande mise en forme des résultats. Je vous laisse le soin d'améliorer à votre convenance.

J'essaierais quand même de publier les sources complètes du contrôle que je vais écrire pour mon site, j'y réfléchi encore :p

6. Petit retour sur MarkQueryWords

Comme je vous le disais, Live Search peut marquer les mots-clés si vous le souhaitez. Je vais vous expliquer comment exploiter cette possibilité.

  Copier le code Copier le code
1 Private cs As Char = Char.ConvertFromUtf32(&HE000)
2 Private ce As Char = Char.ConvertFromUtf32(&HE001)
3 Private Function HighlightSearchResult(ByVal res As String) As String
4     If res.Contains(ce) Then
5         res = res.Replace(cs, "<span class=""highlight"">")
6         res = res.Replace(ce, "</span>")
7     End If
8     Return res
9 End Function

Fermer

En fait, Live Search marque les mots-clés à l'aide de deux caractères. Un pour le début du marquage, un autre pour la fin.

On a juste à chercher les occurrences de ces deux caractères et de les remplacer par des balises HTML dans le cas d'un page Web pour marquer les résultats. Rien de complexe.

7. Conclusion

Comme vous pouvez le constater, l'API du Web Service Live Search est des plus simples à utiliser. Sinon, j'espère que ce petit tutoriel va vous aider. En tous cas, voici les bases pour élaborer un contrôle ou une page de recherche pour votre Site Web :p

Pour ceux qui sont allergiques à VB.Net, ils peuvent toujours convertir le code VB.Net ici présent avec le convertisseur en ligne

Copyright © 2010 - Olivier Delmotte
Ce site utilise des icône de la librairy Silk icon set 1.3

Valid XHTML 1.0 Transitional ASP.Net Valid CSS!