Поделиться через


Поиск и EWS в Exchange

Узнайте, как искать элементы в Exchange с помощью управляемого API EWS или EWS.

Не похоже на этом? Вы, наконец, начинаете этот проект, который вы откладывали в течение нескольких недель, и вам нужна информация о проекте, который ваш менеджер отправил вам по электронной почте несколько недель назад. В папке "Входящие" есть сотни или, возможно, тысячи сообщений. Чем занимаешься? Прокрутите ли вы сообщение электронной почты, сканируя каждую тему и отправителя, пока не найдете его? Или вы используете функцию поиска в вашем любимом почтовом клиенте, чтобы быстро свести к нулю то, что вам нужно?

Поиск, возможно, является обязательной функцией для любого почтового клиента. Но поиск можно использовать для гораздо большего, чем просто предоставить пользователям возможность выполнять поиск в своих почтовых ящиках. Нужно ли приложению обрабатывать встречи, которые попадают в определенные периоды времени? Может быть, вам нужно сообщить обо всех элементах задач с определенным состоянием или переместить все контакты с определенным названием компании в другую папку. Поиск может помочь в удовлетворении всех этих требований.

Основные сведения о поиске

Управляемый API EWS и EWS предлагают два основных метода для указания поиска. Можно использовать фильтр поиска или строку запроса. Используемый метод зависит от намерения поиска.

Таблица 1. Сценарии для фильтров поиска и поисковых запросов

Задача Используйте... Примечания.
Ограничьте поиск определенным свойством или набором свойств.
Фильтр поиска
Фильтры поиска обеспечивают наилучший уровень управления свойствами, в которых выполняется поиск. Хотя строки запроса могут ориентироваться на ограниченный набор свойств с помощью расширенного синтаксиса запросов (AQS), фильтры поиска могут ориентироваться на любое свойство.
Создание поисковых запросов с несколькими критериями
Фильтр поиска
С помощью фильтров поиска можно объединить несколько условий поиска с логическими AND или OR, что позволяет выполнять такие запросы, как "тема содержит "Заметки о собрании", а отправитель равен "Сэди Дэниелс". Хотя строки запроса также могут объединять несколько условий поиска, они ограничены набором свойств, поддерживаемых строками запроса.
Поиск настраиваемых свойств
Фильтр поиска
Фильтры поиска могут ориентироваться на пользовательские свойства. Строки запроса не выполняют поиск в пользовательских свойствах.
Поиск строковых свойств с учетом регистра
Фильтр поиска
Поиск по строкам запроса не учитывает регистр.
Управление режимом сдерживания при поиске свойств строки
Фильтр поиска
Поиск по строкам запроса всегда является подстроковым поиском. Если вам нужно выполнить поиск определенных префиксов или требуются точные совпадения, лучшим вариантом будет фильтр поиска.
Поиск папок
Фильтр поиска
EWS не поддерживает поиск папок со строкой запроса.
Создание папки поиска
Фильтр поиска
EWS не поддерживает создание папок поиска со строкой запроса.
Поиск по всем часто используемым свойствам
Строка запроса
Строки запроса, не содержащие AQS, будут выполнять поиск по всем часто используемым свойствам. Например, строковое значение запроса "Mack Chaves" вернет все сообщения, отправленные Mack Chaves, а также все сообщения с "Mack Chaves" в тексте или теме.
Создание поиска на основе простого пользовательского ввода
Строка запроса
Строка запроса — это отличный выбор, позволяющий конечному пользователю выполнять быстрый поиск путем ввода в простой строке. Так как поиск по строке запроса включает все часто используемые свойства, результаты будут содержать все элементы, содержащие условия поиска пользователя.

Использование фильтра поиска

Фильтры поиска предоставляют широкий спектр вариантов поиска и наибольшую степень контроля над тем, как выполняется поиск. Фильтры поиска можно использовать для выполнения базовых поисков на равенство и сравнение, но вы также можете выполнять поиск в содержимом свойств строки или выполнять сравнение битовых масок.

Например, можно выполнить поиск содержимого темы элементов с помощью класса SearchFilter.ContainsSubstring в управляемом API EWS. В этом примере создается фильтр поиска для поиска темы по подстроке "заметки собрания", игнорируя регистр.

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

Вы также можете выполнить поиск по пользовательским свойствам. В этом примере в пользовательском свойстве ItemIndex выполняется поиск значений больше 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);

Вы также можете объединить несколько фильтров поиска для создания более сложных поисковых запросов. Например, можно объединить предыдущие два фильтра с логическим И с помощью класса SearchFilter.SearchFilterCollection .

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

Использование строки запроса

Строки запроса предоставляют другой подход к поиску. Вы имеете меньше контроля над полями, в которых выполняется поиск, и тем, как выполняется поиск при использовании поиска по строке запроса. Не то, что это плохо! В некоторых случаях может потребоваться более широкая сетка, так сказать.

Например, можно выполнить поиск "заметки о собрании" с помощью метода Управляемого API ExchangeService.FindItems EWS.

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

Если сравнить результаты этого поиска с результатами приведенного выше примера поиска SearchFilter.ContainsSubstring , этот поиск будет содержать больше результатов. Поиск фильтра поиска будет возвращать только те элементы, которые имеют "заметки о собрании" в теме, в то время как этот поиск возвращает элементы с "заметками о собрании" в теме, тексте и других полях.

Давайте посмотрим, как можно уточнить строку запроса, чтобы приблизиться к результатам, которые отображаются в фильтре поиска. С помощью AQS можно ограничить поиск только темой.

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

Это ближе, но результаты все еще не совсем совпадают. При использовании строки запроса с несколькими словами вы получите совпадения, даже если слова не находятся в указанном порядке или даже если они не соседствуют друг с другом. При использовании строки запроса "subject:meeting notes" вы получите совпадения для "заметок собрания", "заметок из собрания" и т. д. Для дальнейшего уточнения можно завернуть поисковые термины в двойные кавычки, чтобы указать, что требуется только эта фраза.

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

Запрос определенных свойств в результатах поиска

По умолчанию результаты поиска будут содержать все свойства элементов, соответствующих поиску. В некоторых случаях это может быть то, что вам нужно, но в большинстве случаев приложению требуется только дискретный набор свойств. В этом случае следует ограничить набор возвращаемых свойств только свойствами, которые нужны приложению. В следующем примере класс ItemView используется для ограничения возвращаемых свойств субъектом, полученной датой и временем и идентификатором элементов.

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

Управление глубиной поиска

Настройка обхода в представлении определяет глубину и область поиска.

Табл. 2. Значения обхода поиска

Значение обхода Относится к Описание
Мелкой
Элементы и папки
Неглубокий поиск ограничен прямыми дочерними элементами папки, в которой выполняется поиск.
Глубоко
Элементы (только с папками поиска) и папки
Глубокий поиск рекурсивно выполняет поиск в папке и вложенных папках.
Связанные
Элементы
Связанные поисковые запросы включают только связанные элементы из папки, в которой выполняется поиск. Связанные элементы являются скрытыми элементами в папке.
SoftDeleted
Элементы и папки
Этот тип обхода не рекомендуется. Поиск SoftDeleted включает только элементы, которые находятся в контейнере. Контейнер был заменен папкой "Элементы с возможностью восстановления" в Exchange Online, Exchange Online в составе Office 365 и версий Exchange, начиная с Exchange 2010.

Управление результатами поиска

Управляемый API EWS и EWS также позволяют изменить способ возврата результатов поиска. С помощью представлений можно указать, какие свойства включены в результаты, сортировать результаты и выстраивать результаты, чтобы получить только заданное количество результатов на ответ. Вы также можете группировать результаты по определенным значениям полей и управлять глубиной поиска, указав тип обхода. Наконец, можно использовать папки поиска для создания постоянных поисковых запросов, которые динамически обновляются по мере поступления новых элементов.

сортировке;

Вы можете заставить сервер возвращать отсортированные результаты, что упрощает отображение или обработку элементов по порядку. В этом примере результаты будут отсортированы по полученной дате и времени, а новые элементы будут первыми.

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

Разбиение на страницы

При отправке поискового запроса с помощью управляемого API EWS или EWS вы указываете размер представления, который определяет максимальное количество возвращаемых элементов. Однако количество элементов на сервере, которые соответствуют вашему поиску, может быть больше, чем размер представления. В этом случае сервер указывает, что доступно больше элементов. Вы можете использовать разбиение по страницам, чтобы повторить поиск и получить следующий набор результатов.

Например, можно отправить поисковый запрос с размером представления 10. На сервере может быть 15 элементов, которые соответствуют поиску, но вы получите только первые 10 элементов вместе с индикатором ( FindItemsResults<TItem>. Свойство MoreAvailable , если вы используете управляемый API EWS), что на сервере есть дополнительные результаты. Затем можно отправить тот же поиск со смещением в 10, чтобы запросить следующие 10 элементов, которые соответствуют вашему поиску. Сервер вернет оставшиеся пять элементов.

Рис. 1. Пример страничного поиска

Изображение постраничного поиска. Изначально отправляется запрос на 10 элементов, а затем — запрос на следующие 10 элементов.

Группирование

Exchange позволяет группировать результаты поиска по определенному полю. Это может помочь разбить результаты поиска на более управляемые наборы. Например, можно выполнить поиск по запросу "заметки о собрании" и сгруппировать результаты по отправителю. Как показано на следующем рисунке, возвращенные элементы будут разделены на группы со всеми элементами, которые соответствуют критериям одного отправителя в одной группе, все соответствующие элементы от другого отправителя в другой группе и т. д.

Рис. 2. Результаты поиска, сгруппированные по отправителю

Изображение результатов поиска, сгруппированных по отправителям.

Папки поиска

При обычном поиске выполняется поиск, результаты возвращаются в приложение для обработки, и поиск перестает существовать. Папки поиска позволяют сделать поиск постоянным. Это отличный вариант для поиска, который, как вы знаете, вы захотите выполнить несколько раз. Вместо того, чтобы выполнять один и тот же поиск повторно, заставляя сервер каждый раз оценивать поиск с нуля, папка поиска всегда включена, что позволяет серверу обновлять существующий результирующий набор по мере добавления элементов в область поиска или удаления из нее. Папки поиска действуют как обычные папки, так как они отображаются как папки с элементами в них. Разница заключается в том, что в папке содержатся только те элементы, которые соответствуют условиям поиска, связанным с папкой. После создания папки поиска приложение может получить актуальные результаты поиска, просто проверив содержимое папки.

Создать папку поиска очень просто, если вы освоили создание фильтров поиска. В следующем примере создается папка поиска для отображения всех сообщений электронной почты с темой, содержащей "заметки о собрании".

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

В этом разделе:

См. также