Durchführen einer AQS-Suche mithilfe von EWS in Exchange

Erfahren Sie, wie Sie mit Abfragezeichenfolgen und AQS in Ihrer verwalteten EWS-API oder EWS-Anwendung suchen.

Abfragezeichenfolgen bieten eine Alternative zu Suchfiltern zum Ausdrücken von Suchkriterien. Der größte Vorteil bei der Verwendung von Abfragezeichenfolgen besteht darin, dass Sie nicht eine einzelne Eigenschaft für die Suche angeben müssen. Sie können einfach einen Wert angeben, und die Suche gilt für alle häufig verwendeten Felder für die Elemente. Sie können Ihre Suche auch verfeinern, indem Sie die erweiterte Abfragesyntax (Advanced Query Syntax, AQS) anstelle eines einfachen Werts verwenden. Abfragezeichenfolgen weisen jedoch die folgenden Einschränkungen auf, die Sie beachten sollten, bevor Sie sie ihrer Toolbox hinzufügen:

  • Eingeschränkte Möglichkeit, bestimmte Eigenschaften zu durchsuchen. Wenn Sie mit einem einfachen Wert in einer Abfragezeichenfolge suchen, wird die Suche für alle indizierten Eigenschaften ausgeführt. Sie können Ihre Suche auf bestimmte Eigenschaften verfeinern, aber die eigenschaften, die in einer AQS-Zeichenfolge verwendet werden können, sind begrenzt. Wenn die Eigenschaft, die Sie durchsuchen möchten, nicht zu den Eigenschaften gehört, die für AQS verfügbar sind, sollten Sie die Verwendung eines Suchfilters in Betracht ziehen.

  • Benutzerdefinierte Eigenschaften werden nicht durchsucht. Abfragezeichenfolgensuchen werden für einen Index ausgeführt, und benutzerdefinierte Eigenschaften sind in diesem Index nicht enthalten. Wenn Sie benutzerdefinierte Eigenschaften durchsuchen müssen, verwenden Sie stattdessen einen Suchfilter.

  • Eingeschränkte Kontrolle für Zeichenfolgensuchen. Abfragezeichenfolgensuchen ignorieren immer die Groß-/Kleinschreibung und sind immer Teilzeichenfolgensuchen. Verwenden Sie einen Suchfilter, wenn Sie Die Groß-/Kleinschreibung, präfixe oder genaue Übereinstimmungssuchen durchführen möchten.

  • Für Ordner oder Suchordner nicht verfügbar. Die EWS-Vorgänge für die Suche nach Ordnern unterstützen die Verwendung einer Abfragezeichenfolge nicht. Darüber hinaus unterstützen Suchordner keine Abfragezeichenfolgen. In beiden Fällen ist ein Suchfilter ihre einzige Option.

Erstellen einer Abfragezeichenfolge

Abfragezeichenfolgen in der verwalteten EWS-API und EWS werden als Teilmenge der AQS-Syntax interpretiert. AQS-Zeichenfolgen bestehen entweder aus Werten oder Schlüsselwort-Wert-Paaren, die durch einen Doppelpunkt (:).

keyword:value

Wenn ein Wert ohne Schlüsselwort angegeben wird, werden alle indizierten Eigenschaften nach dem Wert durchsucht. Wenn ein Schlüsselwort mit einem Wert gekoppelt ist, gibt das Schlüsselwort eine Eigenschaft an, die nach dem entsprechenden Wert gesucht werden soll.

Tabelle 1. Unterstützte AQS-Schlüsselwörter

Schlüsselwort Werttyp Beispiel
subject
Zeichenfolge
subject:project
body
Zeichenfolge
body:Sales Figures
attachment
Zeichenfolge
attachment:report
in
Zeichenfolge
to:"Sadie Daniels"
von
Zeichenfolge
from:hope
cc
Zeichenfolge
cc:"Ronnie Sturgis"
bcc
Zeichenfolge
bcc:mack
participants
Zeichenfolge
Teilnehmer:sadie
category
String
category:project
Wichtigkeit
Zeichenfolge
Wichtigkeit:Hoch
kind
Elementtyp
kind:meetings
sent
Datum
sent:12/10/2013
received
Datum
received:yesterday
hasattachment
Boolesch
Hat anlage:true
isflagged
Boolesch
isflagged:true
isread
Boolesch
isread:false
size
Zahl
size:>5000

Sehen wir uns an, wie die verschiedenen Werttypen funktionieren.

Verwenden eines Zeichenfolgenwerttyps

Zeichenfolgenwerttypen werden standardmäßig als Präfix-Teilzeichenfolgensuchen durchsucht, bei denen die Groß-/Kleinschreibung nicht beachtet wird. Das bedeutet, dass die Suche nach subject:project mit einem der folgenden Themen übereinstimmt:

  • Projektbesprechungsnotizen

  • Haben Sie die Projektpläne?

  • Umsatzprognosen für Dezember

Sie können die Suche so ändern, dass das gesamte Wort anstelle übereinstimmender Präfixe erforderlich ist, indem Sie die Zeichenfolge in Anführungszeichen einschließen. Die Suche nach subject:"project" würde den Wert "Dezember-Umsatzprojektionen" aus der Liste der Übereinstimmungen entfernen. Beachten Sie, dass beim Wert immer noch keine Groß-/Kleinschreibung beachtet wird.

Wenn Sie mehrere Wörter in einer Abfragezeichenfolge verwenden, erfordert eine Übereinstimmung, dass beide Wörter in den durchsuchten Feldern angezeigt werden. Die Suche nach subject:project plan würde z. B. mit einem der folgenden Themen übereinstimmen:

  • Projektplan

  • Haben Sie die Projektpläne?

  • Bitte senden Sie mir den Plan für unser Projekt

  • Planen von Projektmeilensteinen

Wenn Sie mehrere Wörter in Anführungszeichen einschließen, werden diese als einzelner Ausdruck behandelt. Die Suche nach betreff:"projektplan" entspricht nur dem Betreff "Projektplan" aus der vorherigen Liste.

Verwenden eines Elementtypwerttyps

Sie können die folgenden Elementtypwerte mit dem Kind-Schlüsselwort verwenden, um Ihre Suchergebnisse nur auf einen bestimmten Typ von Element zu beschränken, z. B. E-Mail- oder Besprechungsanfragen:

  • contacts
  • docs
  • email
  • faxes
  • im (entspricht Chatnachrichten)
  • journals
  • Besprechungen (entspricht Terminen und Besprechungsanfragen)
  • notes
  • posts
  • rssfeeds
  • tasks
  • voicemail

Verwenden eines Datumswerttyps

Sie können Datumswerttypen auf verschiedene Arten durchsuchen. Am einfachsten ist die Suche nach einem bestimmten Datum. Bei der Suche mit received:11.12.2013 werden alle am 11. Dezember 2013 empfangenen Artikel zurückgegeben. Sie können jedoch auch weniger spezifisch sein. Bei der Suche mit received:12/11 werden alle Elemente zurückgegeben, die am 11. Dezember des aktuellen Jahres empfangen wurden.

Eine weitere Möglichkeit besteht darin, die Monatsnamen zu verwenden. Sie können mit received:Dezember 11, 2013 oder Dezember 11 suchen, um die gleichen Ergebnisse wie empfangen:12/11/2013 bzw. received:12/11 zu erhalten. Sie können auch mit received:Dezember suchen, um alle Elemente abzurufen, die im Monat Dezember im aktuellen Jahr empfangen wurden.

Die Verwendung der Namen der Wochentage ist ebenfalls eine Option. Suche mit empfangen: Dienstag gibt alle Elemente zurück, die am Dienstag der aktuellen Woche empfangen wurden.

Datumswerttypen unterstützen auch eine Reihe von Schlüsselwörtern für Suchvorgänge relativ zur aktuellen Uhrzeit. Die folgenden Schlüsselwörter werden unterstützt:

  • heute
  • morgen
  • yesterday
  • this week
  • Letzte Woche
  • nächster Monat
  • letzten Monat
  • nächstes Jahr

Datumswerttypen können auch mit relationalen Operatoren wie größer als oder kleiner als verglichen oder als Bereich mit dem Bereichsoperator angegeben werden. Beispielsweise sind received:>11/30/2013, sent:>=yesterday und received:12/1/2013..today alle gültigen Abfragezeichenfolgen.

Verwenden eines booleschen Werttyps

Boolesche Werttypen können "true" oder "false" sein. Bei den Werten wird die Groß-/Kleinschreibung nicht beachtet, sodass isread:false die gleichen Ergebnisse wie isread:FALSE liefert.

Verwenden eines Zahlenwerttyps

Zahlenwerttypen können als genaue Übereinstimmungen durchsucht werden, aber sie können auch mit relationalen Operatoren wie größer als oder kleiner als durchsucht werden. Beispielsweise gibt size:10000 nur Elemente zurück, die eine Größe von genau 10000 Bytes haben, aber size:>=10000 gibt Elemente zurück, die eine Größe größer oder gleich 10.000 Bytes haben. Sie können einen Bereich auch mithilfe des Bereichsoperators ( ..) angeben. Beispielsweise gibt size:7000..8000 Elemente zurück, die eine Größe zwischen 7000 und 8000 haben.

Verwenden logischer Operatoren

Abfragezeichenfolgen unterstützen die folgenden logischen Operatoren.

Tabelle 2. Unterstützte logische Operatoren

Operator Beispiele
UND
Projekt UND von:"Sadie Daniels"
Betreff:(Projekt UND Plan)
ODER
Subject:meeting OR from:"Hope Gross"
from:("Sadie Daniels" OR "Hope Gross")
NOT
NOT from:"Ronnie Sturgis"
received:NOT today

Beachten Sie, dass Sie diese Operatoren verwenden können, um mehrere Kriterien oder mehrere Werte in einem einzelnen Schlüsselwort-Wert-Paar zusammenzuschließen. Wenn Sie jedoch mehrere Werte in einem einzelnen Schlüsselwort-Wert-Paar verknüpfen, sollten Sie Klammern verwenden, um die mehrere Werte einzuschließen. Um zu verstehen, warum, suchen Sie mit: "Sadie Daniels" oder "Hope Gross". Diese Suche wird tatsächlich als die folgenden Kriterien interpretiert:

  • Das Element stammt von Sadie Daniels, OR

  • Das Element enthält den Ausdruck "Hope Gross" in einer seiner indizierten Eigenschaften.

Im Gegensatz dazu wird from:("Sadie Daniels" OR "Hope Gross") wie folgt interpretiert:

  • Das Element stammt von Sadie Daniels, OR

  • Der Artikel stammt von Hope Gross

Der Standardoperator, wenn mehrere Kriterien angegeben werden, aber kein logischer Operator enthalten ist, ist AND. Hat z. B. attachment:true subject:project entspricht has:attachment:true AND subject:project.

Beispiel: Suchen von Elementen mithilfe einer Abfragezeichenfolge und der verwalteten EWS-API

In diesem Beispiel wird eine Methode namens SearchWithQueryString definiert. Sie verwendet ein ExchangeService-Objekt , ein WellKnownFolderName-Objekt und ein Zeichenfolgenobjekt , das die Abfragezeichenfolge als Parameter darstellt. In diesem Beispiel wird davon ausgegangen, dass das ExchangeService-Objekt mit gültigen Werten in den Credentials- und Url-Eigenschaften initialisiert wurde.

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);
    }
}

Sie können diese Methode verwenden, um nach allen Elementen mit dem Ausdruck "Projektplan" im Betreff zu suchen, wie in diesem Beispiel gezeigt.

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

Beispiel: Suchen von Elementen mithilfe einer Abfragezeichenfolge und EWS

In diesem Beispiel sucht eine SOAP-FindItem-Anforderung alle Elemente im Posteingang mit dem Ausdruck "Projektplan" im Betreff.

<?xml version="1.0" encoding="utf-8"?>
<soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xmlns:m="https://schemas.microsoft.com/exchange/services/2006/messages" 
    xmlns:t="https://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>

Das folgende Beispiel zeigt die Antwort des Servers mit den Suchergebnissen.

<?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="https://schemas.microsoft.com/exchange/services/2006/types" 
        xmlns="https://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="https://schemas.microsoft.com/exchange/services/2006/messages" xmlns:t="https://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>

Siehe auch