Recherche et EWS dans Exchange

Découvrez comment rechercher des éléments dans Exchange à l’aide de l’API managée EWS ou EWS.

Est présent familier ? Vous démarrez enfin le projet que vous avez mis en attente depuis des semaines et vous avez besoin d’informations sur le projet que votre responsable vous a envoyé par e-mail il y a des semaines. Votre boîte de réception contient des centaines, voire des milliers de messages. Que fais-tu? Faites-vous défiler votre e-mail en analysant chaque objet et expéditeur jusqu’à ce que vous le trouviez ? Ou utilisez-vous la fonctionnalité de recherche dans votre client de messagerie favori pour rapidement revenir à ce dont vous avez besoin ?

La recherche est sans doute une fonctionnalité indispensable pour tout client de messagerie. Mais la recherche peut être utilisée pour bien plus que simplement permettre aux utilisateurs de rechercher leur boîte aux lettres. Votre application doit-elle traiter les rendez-vous qui se trouvent dans des fenêtres de temps spécifiques ? Vous devrez peut-être créer un rapport sur tous les éléments de tâche avec un état spécifique ou déplacer tous les contacts avec un nom de société spécifique vers un autre dossier. La recherche peut vous aider à répondre à toutes ces exigences.

Principes de base de la recherche

L’API managée EWS et EWS offrent deux méthodes de base pour spécifier une recherche. Vous pouvez utiliser un filtre de recherche ou une chaîne de requête. La méthode que vous utilisez dépend de l’intention derrière votre recherche.

Tableau 1. Scénarios pour les filtres de recherche et les requêtes de recherche

Si vous voulez... Utiliser un... Remarques
Limiter votre recherche à une propriété spécifique ou à un ensemble de propriétés
Filtre de recherche
Les filtres de recherche fournissent le meilleur niveau de contrôle sur les propriétés recherchées. Bien que les chaînes de requête puissent cibler un ensemble limité de propriétés à l’aide de la syntaxe de requête avancée (AQS), les filtres de recherche peuvent cibler n’importe quelle propriété.
Créer des recherches avec plusieurs critères
Filtre de recherche
Avec les filtres de recherche, plusieurs critères de recherche peuvent être joints avec des AND logiques ou des OR, ce qui permet d’effectuer des recherches telles que « l’objet contient des notes de réunion et l’expéditeur est égal à « Sadie Daniels ». Bien que les chaînes de requête puissent également joindre plusieurs critères de recherche, elles sont limitées à l’ensemble des propriétés prises en charge par les chaînes de requête.
Rechercher des propriétés personnalisées
Filtre de recherche
Les filtres de recherche peuvent cibler des propriétés personnalisées. Les chaînes de requête ne recherchent pas les propriétés personnalisées.
Effectuer une recherche respectant la casse des propriétés de chaîne
Filtre de recherche
Les recherches de chaînes de requête ne respectent pas la casse.
Contrôler le mode d’autonomie lors de la recherche de propriétés de chaîne
Filtre de recherche
Les recherches de chaîne de requête sont toujours des recherches de sous-chaîne. Si vous avez besoin de rechercher des préfixes spécifiques ou si vous avez besoin de correspondances exactes, un filtre de recherche est le meilleur choix.
Rechercher des dossiers
Filtre de recherche
EWS ne prend pas en charge la recherche de dossiers avec une chaîne de requête.
Créer un dossier de recherche
Filtre de recherche
EWS ne prend pas en charge la création de dossiers de recherche avec une chaîne de requête.
Rechercher dans toutes les propriétés couramment utilisées
Chaîne de requête
Les chaînes de requête qui ne contiennent pas AQS effectuent une recherche dans toutes les propriétés couramment utilisées. Par exemple, une valeur de chaîne de requête « Mack Chaves » renvoie tous les messages envoyés par Mack Chaves, ainsi que tous les messages dont le corps ou l’objet a « Mack Chaves ».
Construire une recherche basée sur une entrée utilisateur simple
Chaîne de requête
Une chaîne de requête est un excellent choix pour permettre à un utilisateur final d’effectuer une recherche rapide en tapant une chaîne simple. Étant donné qu’une recherche de chaîne de requête inclut toutes les propriétés couramment utilisées, les résultats contiennent tous les éléments qui contiennent les termes de recherche de l’utilisateur.

Utilisation d’un filtre de recherche

Les filtres de recherche vous offrent un large éventail d’options de recherche et le plus grand degré de contrôle sur la façon dont la recherche est effectuée. Vous pouvez utiliser des filtres de recherche pour effectuer des recherches d’égalité et de comparaison de base, mais vous pouvez également effectuer des recherches dans le contenu des propriétés de chaîne ou effectuer des comparaisons de masque de bits.

Par exemple, vous pouvez rechercher le contenu de l’objet des éléments à l’aide de la classe SearchFilter.ContainsSubstring dans l’API managée EWS. Dans cet exemple, un filtre de recherche est créé pour rechercher dans l’objet la sous-chaîne « notes de réunion », en ignorant la casse.

SearchFilter.ContainsSubstring subjectFilter = new SearchFilter.ContainsSubstring(ItemSchema.Subject,
    "meeting notes", ContainmentMode.Substring, ComparisonMode.IgnoreCase);

Vous pouvez également effectuer une recherche sur des propriétés personnalisées. Dans cet exemple, la propriété personnalisée ItemIndex fait l’objet d’une recherche de valeurs supérieures à 3.

Guid MyAppGuid = new Guid("{AA3DF801-4FC7-401F-BBC1-7C93D6498C2E}");
ExtendedPropertyDefinition customPropDefinition =
    new ExtendedPropertyDefinition(MyAppGuid, "ItemIndex", MapiPropertyType.Integer);
SearchFilter.IsGreaterThan customPropFilter =
    new SearchFilter.IsGreaterThan(customPropDefinition, 3);

Vous pouvez également combiner plusieurs filtres de recherche pour créer des recherches plus complexes. Par exemple, vous pouvez combiner les deux filtres précédents avec un AND logique à l’aide de la classe SearchFilter.SearchFilterCollection .

SearchFilter.SearchFilterCollection compoundFilter =
    new SearchFilter.SearchFilterCollection(LogicalOperator.And, subjectFilter, customPropFilter);

Utilisation d’une chaîne de requête

Les chaînes de requête offrent une approche différente de la recherche. Vous avez moins de contrôle sur les champs recherchés et la façon dont la recherche est effectuée lorsque vous utilisez une recherche de chaîne de requête. Non pas que c’est une mauvaise chose! Dans certains cas, vous voudrez peut-être jeter un filet plus large, pour ainsi dire.

Par exemple, vous pouvez rechercher « notes de réunion » à l’aide de la méthode d’API managée EWS ExchangeService.FindItems .

FindItemsResults<Item> results = service.FindItems(folder, "meeting notes", view);

Si vous comparez les résultats de cette recherche aux résultats de l’exemple de recherche SearchFilter.ContainsSubstring précédemment, cette recherche contient davantage de résultats. La recherche par filtre de recherche renvoie uniquement les éléments qui ont des « notes de réunion » dans l’objet, tandis que cette recherche renvoie les éléments qui ont des « notes de réunion » dans l’objet, le corps et d’autres champs.

Voyons comment affiner la chaîne de requête pour vous rapprocher des résultats que vous voyez à partir du filtre de recherche. À l’aide d’AQS, vous pouvez limiter votre recherche au sujet.

FindItemsResults<Item> results = service.FindItems(folder, "subject:meeting notes", view);

C’est plus proche, mais les résultats ne sont toujours pas tout à fait les mêmes. Lorsque vous utilisez une chaîne de requête avec plusieurs mots, vous obtenez des correspondances même si les mots ne sont pas dans l’ordre que vous spécifiez, ou même s’ils ne sont pas adjacents les uns aux autres. Avec la chaîne de requête « subject:meeting notes », vous obtenez des correspondances pour « notes de réunion », « notes de la réunion », etc. Pour affiner davantage, vous pouvez encapsuler les termes de recherche entre guillemets doubles pour indiquer que vous voulez uniquement cette expression.

FindItemsResults<Item> results = service.FindItems(folder, "subject:\"meeting notes\"", view);

Demande de propriétés spécifiques dans les résultats de recherche

Par défaut, les résultats de la recherche contiennent toutes les propriétés sur les éléments qui correspondent à la recherche. Dans certains cas, il peut s’agir de ce que vous souhaitez, mais dans la plupart des cas, votre application nécessite uniquement un ensemble discret de propriétés. Dans ce cas, vous devez limiter l’ensemble des propriétés retournées uniquement aux propriétés dont votre application a besoin. Dans l’exemple suivant, la classe ItemView est utilisée pour limiter les propriétés retournées à l’objet, à la date/heure reçue et à l’ID des éléments.

ItemView view = new ItemView(10);
// Creating a new PropertySet with this constructor includes
// ItemSchema.Id.
view.PropertySet = new PropertySet(ItemSchema.Subject, ItemSchema.DateTimeReceived);

Contrôle de la profondeur de la recherche

La définition de la traversée sur la vue contrôle la profondeur et l’étendue de la recherche.

Tableau 2. Valeurs de parcours de recherche

Valeur de traversée S'applique à Description
Peu profonde
Éléments et dossiers
Les recherches superficielles sont limitées aux enfants directs du dossier recherché.
Profonde
Éléments (uniquement avec dossiers de recherche) et Dossiers
Les recherches approfondies effectuent des recherches récursives dans le dossier recherché et les sous-dossiers.
Associés
Éléments
Les recherches associées incluent uniquement les éléments associés du dossier recherché. Les éléments associés sont des éléments masqués dans le dossier.
Suppression réversible
Éléments et dossiers
Ce type de traversée est déconseillé. Les recherches supprimées de manière réversible incluent uniquement les éléments qui se trouvent dans la benne à ordures. La benne à ordures a été remplacée par le dossier Éléments récupérables dans Exchange Online, Exchange Online dans le cadre de Office 365 et les versions d’Exchange à compter d’Exchange 2010.

Gestion des résultats de la recherche

L’API managée EWS et EWS vous permettent également de modifier la façon dont vos résultats de recherche sont retournés. Vous pouvez utiliser des vues pour spécifier les propriétés incluses dans les résultats, trier les résultats et paginer vos résultats pour récupérer uniquement un nombre défini de résultats par réponse. Vous pouvez également regrouper les résultats par valeurs de champ spécifiques et contrôler la profondeur d’une recherche en spécifiant un type de traversée. Enfin, vous pouvez utiliser des dossiers de recherche pour créer des recherches persistantes qui sont mises à jour dynamiquement à mesure que de nouveaux éléments arrivent.

Tri

Vous pouvez faire en sorte que le serveur retourne des résultats triés, ce qui peut faciliter l’affichage ou le traitement des éléments dans l’ordre. Dans cet exemple, les résultats sont triés par date/heure de réception, les éléments les plus récents étant les premiers.

view.OrderBy.Add(ItemSchema.DateTimeReceived, SortDirection.Descending);

Pagination

Lorsque vous envoyez une demande de recherche à l’aide de l’API managée EWS ou EWS, vous spécifiez une taille d’affichage qui contrôle le nombre maximal d’éléments retournés. Toutefois, le nombre d’éléments sur le serveur qui correspondent à votre recherche peut être supérieur à la taille de l’affichage. Dans ce cas, le serveur indique que d’autres éléments sont disponibles. Vous pouvez utiliser la pagination pour répéter votre recherche et obtenir l’ensemble de résultats suivant.

Par exemple, vous pouvez envoyer une demande de recherche avec une taille d’affichage de 10. Il peut y avoir 15 éléments sur le serveur qui correspondent à votre recherche, mais vous ne récupérerez que les 10 premiers, ainsi qu’un indicateur (l’élément TItem> FindItemsResults<. Propriété MoreAvailable si vous utilisez l’API managée EWS) qu’il y a plus de résultats sur le serveur. Vous pouvez ensuite envoyer la même recherche avec un décalage de 10 pour demander les 10 éléments suivants qui correspondent à votre recherche. Le serveur retourne les cinq éléments restants.

Figure 1. Exemple de recherche paginée

Illustration présentant une recherche paginée. Une première requête est envoyée pour 10 éléments. Une seconde requête est envoyée pour les 10 éléments suivants.

Regroupement

Exchange vous permet de regrouper les résultats de la recherche en fonction d’un champ spécifique. Cela peut aider à décomposer les résultats de recherche en ensembles plus gérables. Par exemple, vous pouvez rechercher « notes de réunion » et regrouper les résultats par expéditeur. Comme illustré dans la figure suivante, les éléments retournés sont séparés en groupes, avec tous les éléments qui correspondent aux critères du même expéditeur dans un groupe, tous les éléments correspondants d’un autre expéditeur dans un autre groupe, etc.

Figure 2. Résultats de la recherche regroupés par expéditeur

Illustration présentant les résultats de recherche regroupés par expéditeur.

Dossiers de recherche

Avec une recherche régulière, la recherche est exécutée, les résultats sont retournés à votre application pour traitement et la recherche cesse d’exister. Les dossiers de recherche permettent de rendre une recherche persistante. Il s’agit d’une excellente option pour les recherches que vous savez que vous souhaitez exécuter plusieurs fois. Au lieu d’exécuter la même recherche à plusieurs reprises, ce qui amène le serveur à évaluer la recherche à partir de zéro à chaque fois, un dossier de recherche effectue une recherche toujours active, ce qui permet au serveur de mettre à jour le jeu de résultats existant à mesure que des éléments sont ajoutés ou supprimés de l’étendue de recherche. Les dossiers de recherche agissent comme des dossiers standard, en ce qu’ils apparaissent en tant que dossiers contenant des éléments. La différence est que les seuls éléments contenus dans le dossier sont ceux qui correspondent aux critères de recherche associés au dossier. Une fois qu’un dossier de recherche est créé, votre application peut obtenir des résultats à jour de la recherche simplement en vérifiant le contenu du dossier.

La création d’un dossier de recherche est simple lorsque vous maîtrisez la création de filtres de recherche. Dans l’exemple suivant, un dossier de recherche est créé pour afficher tous les messages électroniques dont l’objet contient des « notes de réunion ».

static void CreateSearchFolder(ExchangeService service)
{
    SearchFilter.ContainsSubstring subjectFilter = new SearchFilter.ContainsSubstring(ItemSchema.Subject,
        "meeting notes", ContainmentMode.Substring, ComparisonMode.IgnoreCase);
    SearchFolder searchFolder = new SearchFolder(service);
    searchFolder.DisplayName = "Meeting Notes";
    searchFolder.SearchParameters.RootFolderIds.Add(WellKnownFolderName.Inbox);
    searchFolder.SearchParameters.Traversal = SearchFolderTraversal.Deep;
    searchFolder.SearchParameters.SearchFilter = subjectFilter;
    searchFolder.Save(WellKnownFolderName.SearchFolders);
}

Dans cette section

Voir aussi