|
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
|
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 :
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.
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
|
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}
|
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
:
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) :
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 :
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
|
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
|
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
|
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>
|
|
Default.aspx.vb
|
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
|
|
Feuille de style utilisée
|
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 }
|
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
|
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
|
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
|