Suche und EWS in Exchange

Erfahren Sie, wie Sie mithilfe der verwalteten EWS-API oder EWS nach Elementen in Exchange suchen.

Kommt diese bekannt? Sie beginnen endlich mit dem Projekt, das Sie seit Wochen zurückgestellt haben, und Sie benötigen Informationen zu dem Projekt, das Ihnen Ihr Vorgesetzter vor Wochen per E-Mail gesendet hat. Ihr Posteingang enthält Hunderte oder vielleicht Tausende von Nachrichten. Was machst du? Scrollen Sie durch Ihre E-Mail, um jeden Betreff und Absender zu überprüfen, bis Sie sie gefunden haben? Oder verwenden Sie die Suchfunktion in Ihrem bevorzugten E-Mail-Client, um schnell auf das zu verzichten, was Sie benötigen?

Die Suche ist wohl ein Muss für jeden E-Mail-Client. Die Suche kann jedoch für viel mehr verwendet werden, als nur benutzern das Durchsuchen ihres Postfachs zu ermöglichen. Muss Ihre App Termine verarbeiten, die innerhalb bestimmter Zeitfenster liegen? Möglicherweise müssen Sie alle Aufgabenelemente mit einem bestimmten Status melden oder alle Kontakte mit einem bestimmten Firmennamen in einen anderen Ordner verschieben. Die Suche kann bei all diesen Anforderungen hilfreich sein.

Grundlagen der Suche

Die verwaltete EWS-API und EWS bieten zwei grundlegende Methoden zum Angeben einer Suche. Sie können einen Suchfilter oder eine Abfragezeichenfolge verwenden. Die methode, die Sie verwenden, hängt von der Absicht ab, die hinter Ihrer Suche steckt.

Tabelle 1. Szenarien für Suchfilter und Suchabfragen

Aktion Verwenden Sie ein... Hinweise
Beschränken Sie Ihre Suche auf eine bestimmte Eigenschaft oder einen Bestimmten Satz von Eigenschaften.
Suchfilter
Suchfilter bieten die beste Kontrolle darüber, welche Eigenschaften durchsucht werden. Obwohl Abfragezeichenfolgen mithilfe der erweiterten Abfragesyntax (Advanced Query Syntax, AQS) auf einen begrenzten Satz von Eigenschaften abzielen können, können Suchfilter auf eine beliebige Eigenschaft abzielen.
Erstellen von Suchvorgängen mit mehreren Kriterien
Suchfilter
Mit Suchfiltern können mehrere Suchkriterien mit logischen ANDs oder ORs verknüpft werden, sodass Suchvorgänge wie "Betreff enthält 'Besprechungsnotizen' UND Absender gleich 'Sadie Daniels'" möglich sind. Obwohl Abfragezeichenfolgen auch mehrere Suchkriterien verbinden können, sind sie auf den Satz von Eigenschaften beschränkt, die von Abfragezeichenfolgen unterstützt werden.
Benutzerdefinierte Eigenschaften suchen
Suchfilter
Suchfilter können auf benutzerdefinierte Eigenschaften abzielen. Abfragezeichenfolgen durchsuchen keine benutzerdefinierten Eigenschaften.
Durchführen einer Suche nach Groß-/Kleinschreibung bei Zeichenfolgeneigenschaften
Suchfilter
Bei Abfragezeichenfolgensuchen wird die Groß-/Kleinschreibung nicht beachtet.
Steuern des Einschlussmodus beim Durchsuchen von Zeichenfolgeneigenschaften
Suchfilter
Abfragezeichenfolgensuchen sind immer Teilzeichenfolgensuchen. Wenn Sie nach bestimmten Präfixen suchen oder genaue Übereinstimmungen benötigen, ist ein Suchfilter die beste Wahl.
Suchen nach Ordnern
Suchfilter
EWS unterstützt die Suche nach Ordnern mit einer Abfragezeichenfolge nicht.
Erstellen eines Suchordners
Suchfilter
EWS unterstützt das Erstellen von Suchordnern mit einer Abfragezeichenfolge nicht.
Durchsuchen aller häufig verwendeten Eigenschaften
Abfragezeichenfolge
Abfragezeichenfolgen, die keine AQS enthalten, durchsuchen alle häufig verwendeten Eigenschaften. Beispielsweise gibt der Abfragezeichenfolgenwert "Mack Chaves" alle von Mack Chaves gesendeten Nachrichten sowie alle Nachrichten zurück, die "Mack Chaves" im Text oder Betreff enthalten.
Erstellen einer Suche basierend auf einer einfachen Benutzereingabe
Abfragezeichenfolge
Eine Abfragezeichenfolge ist eine gute Wahl, um endbenutzern eine schnelle Suche durch Eingabe einer einfachen Zeichenfolge zu ermöglichen. Da eine Abfragezeichenfolgensuche alle häufig verwendeten Eigenschaften enthält, enthalten die Ergebnisse alle Elemente, die die Suchbegriffe des Benutzers enthalten.

Verwenden eines Suchfilters

Suchfilter bieten Ihnen eine breite Palette von Suchoptionen und das größte Maß an Kontrolle über die Durchführung der Suche. Sie können Suchfilter verwenden, um grundlegende Gleichheits- und Vergleichssuchen durchzuführen, aber Sie können auch innerhalb des Inhalts von Zeichenfolgeneigenschaften suchen oder Bitmaskenvergleiche durchführen.

Beispielsweise können Sie den Inhalt des Betreffs von Elementen mithilfe der SearchFilter.ContainsSubstring-Klasse in der verwalteten EWS-API durchsuchen. In diesem Beispiel wird ein Suchfilter erstellt, um den Betreff nach der Teilzeichenfolge "Besprechungsnotizen" zu durchsuchen, wobei die Groß-/Kleinschreibung ignoriert wird.

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

Sie können auch nach benutzerdefinierten Eigenschaften suchen. In diesem Beispiel wird die benutzerdefinierte Eigenschaft ItemIndex nach Werten gesucht, die größer als 3 sind.

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

Sie können auch mehrere Suchfilter kombinieren, um komplexere Suchvorgänge zu erstellen. Sie können beispielsweise die beiden vorherigen Filter mit einem logischen AND kombinieren, indem Sie die SearchFilter.SearchFilterCollection-Klasse verwenden.

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

Verwenden einer Abfragezeichenfolge

Abfragezeichenfolgen bieten einen anderen Suchansatz. Sie haben weniger Kontrolle über die felder, die durchsucht werden und wie die Suche ausgeführt wird, wenn Sie eine Abfragezeichenfolgensuche verwenden. Nicht, dass das eine schlechte Sache ist! In einigen Fällen kann es sinnvoll sein, ein breiteres Netz sozusagen zu werfen.

Beispielsweise können Sie mithilfe der ExchangeService.FindItems EWS Managed API-Methode nach "Besprechungsnotizen" suchen.

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

Wenn Sie die Ergebnisse dieser Suche mit den Ergebnissen des Suchbeispiels SearchFilter.ContainsSubstring weiter oben vergleichen, enthält diese Suche weitere Ergebnisse. Die Suchfiltersuche gibt nur Elemente zurück, die "Besprechungsnotizen" im Betreff enthalten, während diese Suche Elemente zurückgibt, die "Besprechungsnotizen" im Betreff, textkörper und in anderen Feldern enthalten.

Sehen wir uns an, wie Sie die Abfragezeichenfolge verfeinern können, um den Ergebnissen des Suchfilters näher zu kommen. Mit AQS können Sie Ihre Suche auf den Betreff beschränken.

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

Dies ist näher, aber die Ergebnisse sind immer noch nicht ganz die gleichen. Wenn Sie eine Abfragezeichenfolge mit mehreren Wörtern verwenden, erhalten Sie Übereinstimmungen, auch wenn sich die Wörter nicht in der von Ihnen angegebenen Reihenfolge befinden oder sich nicht aneinander angrenzen. Mit der Abfragezeichenfolge "betreff:Besprechungsnotizen" erhalten Sie Übereinstimmungen für "Besprechungsnotizen", "Notizen aus der Besprechung" usw. Zur weiteren Verfeinerung können Sie die Suchbegriffe in doppelte Anführungszeichen umschließen, um anzugeben, dass Sie nur diesen Ausdruck verwenden möchten.

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

Anfordern bestimmter Eigenschaften in Suchergebnissen

Standardmäßig enthalten Suchergebnisse alle Eigenschaften der Elemente, die der Suche entsprechen. In einigen Fällen ist dies möglicherweise das, was Sie möchten, aber in den meisten Fällen erfordert Ihre Anwendung nur einen diskreten Satz von Eigenschaften. In diesem Fall sollten Sie den Satz von Eigenschaften, die zurückgegeben werden, auf die Eigenschaften beschränken, die Ihre Anwendung benötigt. Im folgenden Beispiel wird die ItemView-Klasse verwendet, um die zurückgegebenen Eigenschaften auf den Betreff, das Empfangene Datum/Die Uhrzeit und die ID der Elemente zu beschränken.

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

Steuern der Suchtiefe

Das Festlegen des Durchlaufs für die Ansicht steuert die Tiefe und den Umfang der Suche.

Tabelle 2. Suchdurchlaufwerte

Traversalwert Gilt für Beschreibung
Flachen
Elemente und Ordner
Flache Suchvorgänge sind auf direkte untergeordnete Elemente des durchsuchten Ordners beschränkt.
Tief
Elemente (nur mit Suchordnern) und Ordner
Bei tiefen Suchvorgängen wird rekursiv der durchsuchte Ordner und Unterordner durchsucht.
Zugeordneten
Elemente
Zugeordnete Suchvorgänge enthalten nur zugeordnete Elemente aus dem durchsuchten Ordner. Zugeordnete Elemente sind ausgeblendete Elemente innerhalb des Ordners.
SoftDeleted
Elemente und Ordner
Dieser Durchlauftyp ist veraltet. SoftDeleted-Suchvorgänge enthalten nur Elemente, die sich im Dumpster befinden. Der Dumpster wurde durch den Ordner "Wiederherstellbare Elemente" in Exchange Online, Exchange Online als Teil von Office 365 und Versionen von Exchange ab Exchange 2010 ersetzt.

Verwalten von Suchergebnissen

Mit der verwalteten EWS-API und EWS können Sie auch ändern, wie Ihre Suchergebnisse zurückgegeben werden. Mithilfe von Ansichten können Sie angeben, welche Eigenschaften in den Ergebnissen enthalten sind, die Ergebnisse sortieren und Ihre Ergebnisse ausblättern, um nur eine festgelegte Anzahl von Ergebnissen pro Antwort abzurufen. Sie können ergebnisse auch nach bestimmten Feldwerten gruppieren und die Tiefe einer Suche steuern, indem Sie einen Durchlauftyp angeben. Schließlich können Sie Suchordner verwenden, um persistente Suchvorgänge zu erstellen, die dynamisch aktualisiert werden, wenn neue Elemente eintreffen.

Die Sortierung

Sie können den Server dazu bringen, sortierte Ergebnisse zurückzugeben, was das Anzeigen oder Verarbeiten von Elementen in der richtigen Reihenfolge erleichtern kann. In diesem Beispiel werden die Ergebnisse nach dem Datum/der Uhrzeit des Empfangens sortiert, wobei die neuesten Elemente an erster Stelle stehen.

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

Paging

Wenn Sie eine Suchanforderung mithilfe der verwalteten EWS-API oder EWS senden, geben Sie eine Ansichtsgröße an, die die maximale Anzahl zurückgegebener Elemente steuert. Die Anzahl der Elemente auf dem Server, die Ihrer Suche entsprechen, kann jedoch größer als die Ansichtsgröße sein. In diesem Fall gibt der Server an, dass weitere Elemente verfügbar sind. Sie können paging verwenden, um Ihre Suche zu wiederholen und den nächsten Satz von Ergebnissen abzurufen.

Sie können beispielsweise eine Suchanforderung mit einer Ansichtsgröße von 10 senden. Es gibt möglicherweise 15 Elemente auf dem Server, die Ihrer Suche entsprechen, aber Sie erhalten nur die ersten 10 zusammen mit einem Indikator ( findItemsResults<TItem>. MoreAvailable-Eigenschaft , wenn Sie die verwaltete EWS-API verwenden), dass mehr Ergebnisse auf dem Server vorhanden sind. Sie können dann dieselbe Suche mit einem Offset von 10 senden, um nach den nächsten 10 Elementen zu fragen, die Ihrer Suche entsprechen. Der Server gibt die verbleibenden fünf Elemente zurück.

Abbildung 1: Beispiel für die ausgelagerte Suche

Eine Abbildung einer Seitensuche. Es wird eine erste Anforderung für 10 Elemente gesendet. Eine zweite Anforderung wird für die nächsten 10 Elemente gesendet.

Gruppieren

Mit Exchange können Sie Suchergebnisse nach einem bestimmten Feld gruppieren. Dies kann dazu beitragen, Suchergebnisse in besser verwaltbare Gruppen aufzuteilen. Beispielsweise können Sie nach "Besprechungsnotizen" suchen und die Ergebnisse nach Absender gruppiert. Wie in der folgenden Abbildung dargestellt, werden die zurückgegebenen Elemente in Gruppen unterteilt, wobei alle Elemente, die den Kriterien desselben Absenders in einer Gruppe entsprechen, alle übereinstimmenden Elemente eines anderen Absenders in einer anderen Gruppe usw.

Abbildung 2: Nach Absender gruppierte Suchergebnisse

Eine Abbildung, in der Suchergebnisse nach Absender gruppiert sind

Suchordner

Bei einer regulären Suche wird die Suche ausgeführt, die Ergebnisse werden zur Verarbeitung an Ihre Anwendung zurückgegeben, und die Suche endet. Suchordner bieten eine Möglichkeit, eine Suche dauerhaft zu gestalten. Dies ist eine hervorragende Option für Suchvorgänge, von denen Sie wissen, dass Sie sie mehrmals ausführen möchten. Anstatt die gleiche Suche wiederholt auszuführen, wodurch der Server die Suche jedes Mal von Grund auf auswertet, macht ein Suchordner eine Suche immer aktiviert, sodass der Server das vorhandene Resultset aktualisieren kann, wenn Elemente dem Suchbereich hinzugefügt oder daraus entfernt werden. Suchordner verhalten sich wie normale Ordner, da sie als Ordner mit Elementen angezeigt werden. Der Unterschied besteht darin, dass die einzigen Elemente, die im Ordner enthalten sind, diejenigen sind, die den Suchkriterien entsprechen, die dem Ordner zugeordnet sind. Nachdem ein Suchordner erstellt wurde, kann Ihre Anwendung aktuelle Ergebnisse der Suche abrufen, indem sie den Inhalt des Ordners überprüft.

Das Erstellen eines Suchordners ist einfach, wenn Sie das Erstellen von Suchfiltern beherrschen. Im folgenden Beispiel wird ein Suchordner erstellt, um alle E-Mails mit einem Betreff anzuzeigen, der "Besprechungsnotizen" enthält.

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

Inhalt dieses Abschnitts

Siehe auch