Partager via


Effectuer une recherche AQS à l’aide d’EWS dans Exchange

Découvrez comment effectuer une recherche avec des chaînes de requête et AQS dans votre API managée EWS ou votre application EWS.

Les chaînes de requête offrent une alternative aux filtres de recherche pour exprimer les critères de recherche. Le plus grand avantage de l’utilisation de chaînes de requête est que vous n’êtes pas obligé de spécifier une seule propriété à rechercher. Vous pouvez simplement fournir une valeur, et la recherche s’appliquera à tous les champs couramment utilisés sur les éléments. Vous pouvez également affiner votre recherche à l’aide de la syntaxe de requête avancée (AQS) au lieu d’une valeur simple. Toutefois, les chaînes de requête présentent les limitations suivantes que vous devez connaître avant de les ajouter à votre boîte à outils :

  • Possibilité limitée de rechercher des propriétés spécifiques. Lorsque vous effectuez une recherche avec une valeur simple dans une chaîne de requête, la recherche est effectuée sur toutes les propriétés indexées. Vous pouvez affiner votre recherche à des propriétés spécifiques, mais les propriétés disponibles dans une chaîne AQS sont limitées. Si la propriété à rechercher ne fait pas partie des propriétés disponibles pour AQS, envisagez d’utiliser un filtre de recherche.

  • Les propriétés personnalisées ne font pas l’objet d’une recherche. Les recherches de chaîne de requête sont effectuées sur un index, et les propriétés personnalisées ne sont pas incluses dans cet index. Si vous avez besoin de rechercher des propriétés personnalisées, utilisez un filtre de recherche à la place.

  • Contrôle limité pour les recherches de chaînes. Les recherches de chaînes de requête ignorent toujours la casse et sont toujours des recherches de sous-chaîne. Si vous souhaitez effectuer des recherches de correspondance exacte, de préfixe ou de respect de la casse, utilisez un filtre de recherche.

  • Non disponible pour les dossiers ou les dossiers de recherche. Les opérations EWS pour la recherche de dossiers ne prennent pas en charge l’utilisation d’une chaîne de requête. En outre, les dossiers de recherche ne prennent pas en charge les chaînes de requête. Dans les deux cas, un filtre de recherche est votre seule option.

Création d’une chaîne de requête

Les chaînes de requête dans l’API managée EWS et EWS sont interprétées comme un sous-ensemble de la syntaxe AQS. Les chaînes AQS sont composées de valeurs ou de paires mot clé/valeur, séparées par deux-points (:).

keyword:value

Lorsqu’une valeur est spécifiée sans mot clé, toutes les propriétés indexées sont recherchées pour la valeur. Si un mot clé est associé à une valeur, le mot clé spécifie une propriété pour rechercher la valeur correspondante.

Tableau 1. Mots clés AQS pris en charge

Mot clé Type de valeur Exemple
subject
String
subject:project
body
String
body:sales figures
pièce jointe
String
attachment:report
au
String
to:"Sadie Daniels »
de
String
from:hope
cc
String
cc:"Ronnie Sturgis »
bcc
String
bcc:mack
participants
String
participants:sadie
category
String
category:project
importance
String
importance:high
type
Type d’élément
kind:meetings
envoyé
Date
envoyé :10/12/2013
reçu
Date
reçu:hier
hasattachment
Boolean
A attachment:true
isflagged
Boolean
isflagged:true
isread
Boolean
isread:false
size
Nombre
taille :>5000

Examinons le fonctionnement des différents types de valeurs.

Utilisation d’un type valeur de chaîne

Les types valeur de chaîne sont par défaut recherchés en tant que recherches de sous-chaîne de préfixe qui ne respectent pas la casse. Cela signifie que la recherche de subject:project correspond à l’un des sujets suivants :

  • Notes de réunion du projet

  • Avez-vous des plans de projet ?

  • Projections des ventes de décembre

Vous pouvez modifier la recherche pour exiger le mot entier plutôt que les préfixes correspondants en plaçant la chaîne entre guillemets. La recherche de subject:"project » éliminerait la valeur « December sales projections » de la liste des correspondances. Notez que la valeur ne respecte toujours pas la casse.

Si vous utilisez plusieurs mots dans une chaîne de requête, une correspondance nécessite que les deux mots apparaissent dans les champs recherchés. Par exemple, la recherche de subject:project plan correspond à l’un des sujets suivants :

  • Plan de projet

  • Avez-vous des plans de projet ?

  • Envoyez-moi le plan de notre projet

  • Planification des jalons du projet

Si vous placez plusieurs mots entre guillemets, ils sont traités comme une seule expression. La recherche de l’objet : « plan de projet » correspondrait uniquement au sujet « Plan de projet » de la liste précédente.

Utilisation d’un type valeur de type d’élément

Vous pouvez utiliser les valeurs de type d’élément suivantes avec le mot clé kind pour limiter vos résultats de recherche à un type spécifique d’élément, tel que les e-mails ou les demandes de réunion :

  • contacts
  • docs
  • email
  • faxes
  • im (correspond aux messages instantanés)
  • journals
  • réunions (correspond aux rendez-vous et aux demandes de réunion)
  • notes
  • posts
  • rssfeeds
  • tasks
  • voicemail

Utilisation d’un type de valeur de date

Vous pouvez rechercher des types de valeur de date de différentes façons. Le plus simple consiste à rechercher une date spécifique. La recherche avec received:12/11/2013 renvoie tous les articles reçus le 11 décembre 2013. Toutefois, vous pouvez également être moins spécifique. La recherche avec received:12/11 renvoie tous les articles reçus le 11 décembre de l’année en cours.

Une autre option consiste à utiliser les noms de mois. Vous pouvez effectuer une recherche avec reçu : 11 décembre 2013 ou 11 décembre pour obtenir les mêmes résultats que reçu :11/12/2013 et received:12/11, respectivement. Vous pouvez également effectuer une recherche avec received:December pour obtenir tous les éléments reçus au cours du mois de décembre, dans l’année en cours.

L’utilisation des noms des jours de la semaine est également une option. La recherche avec received:Tuesday renvoie tous les éléments reçus le mardi de la semaine en cours.

Les types valeur de date prennent également en charge un ensemble de mots clés pour les recherches par rapport à l’heure actuelle. Les mots clés suivants sont pris en charge :

  • aujourd’hui
  • demain
  • yesterday
  • this week
  • La semaine dernière
  • mois suivant
  • mois précédent
  • année à venir

Les types valeur de date peuvent également être comparés avec des opérateurs relationnels comme supérieur ou inférieur à, ou spécifiés sous la forme d’une plage avec l’opérateur de plage ... Par exemple, received:>11/30/2013, sent:>=yesterday et received:12/1/2013..today sont toutes des chaînes de requête valides.

Utilisation d’un type valeur booléen

Les types valeur booléenne peuvent être « true » ou « false ». Les valeurs ne respectant pas la casse, isread:false produit les mêmes résultats que isread:FALSE.

Utilisation d’un type valeur numérique

Les types valeur numérique peuvent être recherchés en tant que correspondances exactes, mais ils peuvent également être recherchés à l’aide d’opérateurs relationnels tels que supérieur à ou inférieur à. Par exemple, size:10000 retourne uniquement les éléments dont la taille est exactement 10000 octets, mais size:>=10000 renvoie les éléments dont la taille est supérieure ou égale à 10 000 octets. Vous pouvez également spécifier une plage à l’aide de l’opérateur de plage ( ..). Par exemple, size:7000..8000 retourne les éléments dont la taille est comprise entre 7 000 et 8 000.

Utilisation d’opérateurs logiques

Les chaînes de requête prennent en charge les opérateurs logiques suivants.

Tableau 2. Opérateurs logiques pris en charge

Opérateur Exemples
AND
projet AND de:"Sadie Daniels »
subject:(project AND plan)
OR
subject:meeting OR from:"Hope Gross »
from:(« Sadie Daniels » OR « Hope Gross »)
NOT
PAS de:"Ronnie Sturgis »
reçu :NOT aujourd’hui

Notez que vous pouvez utiliser ces opérateurs pour joindre plusieurs critères ensemble ou pour joindre plusieurs valeurs dans une seule paire mot clé/valeur. Toutefois, lorsque vous joignez plusieurs valeurs dans une seule paire mot clé/valeur, vous devez utiliser des parenthèses pour placer les valeurs multiples. Pour comprendre pourquoi, envisagez de rechercher avec :"Sadie Daniels » OU « Hope Gross ». Cette recherche est interprétée comme les critères suivants :

  • L’article est de Sadie Daniels, OR

  • L’élément a l’expression « Hope Gross » dans l’une de ses propriétés indexées.

En revanche, from:(« Sadie Daniels » OR « Hope Gross ») est interprété comme suit :

  • L’article est de Sadie Daniels, OR

  • L’article est de Hope Gross

L’opérateur par défaut lorsque plusieurs critères sont spécifiés mais qu’aucun opérateur logique n’est inclus est AND. Par exemple, has attachment:true subject:project équivaut à has:attachment:true AND subject:project.

Exemple : Rechercher des éléments à l’aide d’une chaîne de requête et de l’API managée EWS

Dans cet exemple, une méthode appelée SearchWithQueryString est définie. Il prend un objet ExchangeService , un objet WellKnownFolderName et un objet string qui représente la chaîne de requête en tant que paramètres. Cet exemple suppose que l’objet ExchangeService a été initialisé avec des valeurs valides dans les propriétés Identifiants et Url.

using Microsoft.Exchange.WebServices.Data;
static void SearchWithQueryString(ExchangeService service, WellKnownFolderName folder, string queryString)
{
    // Limit the result set to 10 items.
    ItemView view = new ItemView(10);
    view.PropertySet = new PropertySet(ItemSchema.Subject,
                                       ItemSchema.DateTimeReceived,
                                       ItemSchema.Size,
                                       ItemSchema.Importance,
                                       EmailMessageSchema.IsRead);
    // Item searches do not support Deep traversal.
    view.Traversal = ItemTraversal.Shallow;
    // Sorting
    view.OrderBy.Add(ItemSchema.DateTimeReceived, SortDirection.Descending);
    try
    {
        // Execute the search based on the query string.
        // Example: "subject:project plan"
        FindItemsResults<Item> results = service.FindItems(folder, queryString, view);
        foreach (Item item in results.Items)
        {
            Console.WriteLine("Subject: {0}", item.Subject);
            Console.WriteLine("Received: {0}", item.DateTimeReceived.ToString());
            Console.WriteLine("Size: {0}", item.Size.ToString());
            Console.WriteLine("Importance: {0}", item.Importance.ToString());
            if (item is EmailMessage)
            {
                EmailMessage message = item as EmailMessage;
                Console.WriteLine("Read: {0}", message.IsRead.ToString());
            }
        }
    }
    catch (Exception ex)
    {
        Console.WriteLine("Exception while enumerating results: {0}", ex.Message);
    }
}

Vous pouvez utiliser cette méthode pour rechercher tous les éléments avec l’expression « plan de projet » dans l’objet, comme illustré dans cet exemple.

string queryString = "subject:\"project plan\"";
SearchWithQueryString(service, WellKnownFolderName.Inbox, queryString);

Exemple : Rechercher des éléments à l’aide d’une chaîne de requête et d’EWS

Dans cet exemple, une requête SOAP FindItem recherche tous les éléments de la boîte de réception avec l’expression « plan de projet » dans l’objet.

<?xml version="1.0" encoding="utf-8"?>
<soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xmlns:m="http://schemas.microsoft.com/exchange/services/2006/messages" 
    xmlns:t="http://schemas.microsoft.com/exchange/services/2006/types" 
    xmlns:soap="https://schemas.xmlsoap.org/soap/envelope/">
  <soap:Header>
    <t:RequestServerVersion Version="Exchange2013" />
  </soap:Header>
  <soap:Body>
    <m:FindItem Traversal="Shallow">
      <m:ItemShape>
        <t:BaseShape>IdOnly</t:BaseShape>
        <t:AdditionalProperties>
          <t:FieldURI FieldURI="item:Subject" />
          <t:FieldURI FieldURI="item:DateTimeReceived" />
          <t:FieldURI FieldURI="item:Size" />
          <t:FieldURI FieldURI="item:Importance" />
          <t:FieldURI FieldURI="message:IsRead" />
        </t:AdditionalProperties>
      </m:ItemShape>
      <m:IndexedPageItemView MaxEntriesReturned="10" Offset="0" BasePoint="Beginning" />
      <m:SortOrder>
        <t:FieldOrder Order="Descending">
          <t:FieldURI FieldURI="item:DateTimeReceived" />
        </t:FieldOrder>
      </m:SortOrder>
      <m:ParentFolderIds>
        <t:DistinguishedFolderId Id="inbox" />
      </m:ParentFolderIds>
      <m:QueryString>subject:"project plan"</m:QueryString>
    </m:FindItem>
  </soap:Body>
</soap:Envelope>

L’exemple suivant montre la réponse du serveur avec les résultats de la recherche.

<?xml version="1.0" encoding="utf-8"?>
<s:Envelope xmlns:s="https://schemas.xmlsoap.org/soap/envelope/">
  <s:Header>
    <h:ServerVersionInfo MajorVersion="15" MinorVersion="0" MajorBuildNumber="712" MinorBuildNumber="22" Version="V2_3" 
        xmlns:h="http://schemas.microsoft.com/exchange/services/2006/types" 
        xmlns="http://schemas.microsoft.com/exchange/services/2006/types" 
        xmlns:xsd="http://www.w3.org/2001/XMLSchema" 
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" />
  </s:Header>
  <s:Body xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
    <m:FindItemResponse xmlns:m="http://schemas.microsoft.com/exchange/services/2006/messages" xmlns:t="http://schemas.microsoft.com/exchange/services/2006/types">
      <m:ResponseMessages>
        <m:FindItemResponseMessage ResponseClass="Success">
          <m:ResponseCode>NoError</m:ResponseCode>
          <m:RootFolder IndexedPagingOffset="1" TotalItemsInView="1" IncludesLastItemInRange="true">
            <t:Items>
              <t:Message>
                <t:ItemId Id="AAMkAGM2..." ChangeKey="CQAAABYA..." />
                <t:Subject>project plan</t:Subject>
                <t:DateTimeReceived>2013-12-11T15:42:02Z</t:DateTimeReceived>
                <t:Size>7406</t:Size>
                <t:Importance>Normal</t:Importance>
                <t:IsRead>false</t:IsRead>
              </t:Message>
            </t:Items>
          </m:RootFolder>
        </m:FindItemResponseMessage>
      </m:ResponseMessages>
    </m:FindItemResponse>
  </s:Body>
</s:Envelope>

Voir aussi