Выполнение поиска AQS с помощью EWS в Exchange
Узнайте, как выполнять поиск с помощью строк запроса и AQS в управляемом API EWS или приложении EWS.
Строки запросов предоставляют альтернативу фильтрам поиска для выражения условий поиска. Самое большое преимущество использования строк запроса заключается в том, что для поиска не требуется указывать одно свойство. Можно просто указать значение, и поиск будет применяться ко всем часто используемым полям элементов. Вы также можете уточнить поиск с помощью расширенного синтаксиса запросов (AQS) вместо простого значения. Однако строки запросов имеют следующие ограничения, о которых следует знать, прежде чем добавлять их на панель элементов:
Ограниченная возможность поиска определенных свойств. При поиске с простым значением в строке запроса поиск выполняется для всех индексированных свойств. Вы можете уточнить поиск по определенным свойствам, но доступные для использования свойства в строке AQS ограничены. Если свойство, которое требуется выполнить поиск, не является одним из свойств, доступных для AQS, рассмотрите возможность использования фильтра поиска.
Поиск в пользовательских свойствах не выполняется. Поиск по строке запроса выполняется по индексу, и пользовательские свойства не включаются в этот индекс. Если вам нужно выполнить поиск по пользовательским свойствам, используйте фильтр поиска.
Ограниченный элемент управления для строкового поиска. Поиск по строкам запроса всегда игнорирует регистр и всегда выполняет поиск подстроки. Если вы хотите выполнять поиск с учетом регистра, префикса или точного соответствия, используйте фильтр поиска.
Недоступно для папок или папок поиска. Операции EWS для поиска папок не поддерживают использование строки запроса. Кроме того, папки поиска не поддерживают строки запросов. В обоих случаях единственным вариантом является фильтр поиска.
Создание строки запроса
Строки запросов в управляемом API EWS и EWS интерпретируются как подмножество синтаксиса AQS. Строки AQS состоят из значений или пар "ключевое слово-значение", разделенных двоеточием (:).
keyword:value
Если значение указано без ключевого слова, выполняется поиск по всем индексированных свойствам. Если ключевое слово связано со значением, ключевое слово указывает свойство для поиска соответствующего значения.
Таблица 1. Поддерживаемые ключевые слова AQS
Ключевое слово | Тип значения | Пример |
---|---|---|
subject |
String |
subject:project |
body |
Строка |
body:sales figures |
attachment |
Строка |
attachment:report |
на |
Строка |
to:"Сэди Дэниелс" |
from |
Строка |
from:hope |
копия; |
Строка |
cc:"Ронни Стургис" |
СК. |
Строка |
bcc:mack |
participants |
Строка |
участники:сэди |
category |
String |
category:project |
importance |
String |
importance:high |
kind |
Тип элемента |
kind:meetings |
sent |
Дата |
отправлено:12/10/2013 |
received |
Дата |
получено:вчера |
hasattachment |
Boolean |
Имеет вложение:true |
isflagged |
Boolean |
isflagged:true |
isread |
Boolean |
isread:false |
size |
Числовой |
размер:>5000 |
Давайте посмотрим, как работают различные типы значений.
Использование типа строкового значения
Типы строковых значений по умолчанию выполняются как поиск по префиксной подстроке, в которых регистр не учитывается. Это означает, что поиск subject:project будет соответствовать любому из следующих субъектов:
Заметки о собрании проекта
У вас есть планы проекта?
Прогнозы продаж за декабрь
Вы можете изменить поиск, чтобы требовать целое слово, а не соответствующие префиксы, заключив строку в кавычки. При поиске subject:"project" значение "декабрьских прогнозов продаж" из списка совпадений будет удалено. Обратите внимание, что значение по-прежнему не учитывает регистр.
Если в строке запроса используется несколько слов, для сопоставления требуется, чтобы оба слова отображались в полях поиска. Например, поиск по плану subject:project будет соответствовать любому из следующих субъектов:
План проекта
У вас есть планы проекта?
Пожалуйста, отправьте мне план для нашего проекта
Вехи планирования проекта
Если заключить несколько слов в кавычки, они обрабатываются как одна фраза. Поиск по теме:"план проекта" будет соответствовать только теме "План проекта" из предыдущего списка.
Использование типа значения типа элемента
Вы можете использовать следующие значения типа элемента с ключевым словом kind , чтобы ограничить результаты поиска только определенным типом элемента, например электронной почтой или приглашением на собрание:
- contacts
- docs
- faxes
- im (соответствует мгновенным сообщениям)
- journals
- собрания (соответствует встречам и приглашениям на собрания)
- notes
- posts
- rssfeeds
- tasks
- voicemail
Использование типа значения даты
Типы значений даты можно искать различными способами. Самый простой — поиск определенной даты. Поиск с использованием received:11/12/2013 вернет все элементы, полученные 11 декабря 2013 года. Однако вы также можете быть менее конкретными. Поиск с параметром received:12/11 вернет все элементы, полученные 11 декабря текущего года.
Другой вариант — использовать названия месяцев. Вы можете выполнить поиск по параметру received:11 декабря 2013 г. или 11 декабря, чтобы получить те же результаты, что и получено:12/11 соответственно. Вы также можете выполнить поиск по параметру received:Декабрь, чтобы получить все элементы, полученные в декабре текущего года.
Также можно использовать названия дней недели. Поиск с параметром received:Tuesday вернет все элементы, полученные во вторник текущей недели.
Типы значений даты также поддерживают набор ключевых слов для поиска относительно текущего времени. Поддерживаются следующие ключевые слова:
- today
- tomorrow
- yesterday
- this week
- На прошлой неделе
- в следующем месяце
- за прошлый месяц
- ближайший год
Типы значений даты также можно сравнивать с реляционными операторами, такими как больше или меньше, или указывать как диапазон с оператором диапазона ... Например, received:>30/11/2013, sent:>=yesterday и received:12/1/2013..today являются допустимыми строками запроса.
Использование логического типа значения
Логические типы значений могут быть "true" или "false". Значения не чувствительны к регистру, поэтому isread:false даст те же результаты, что и isread:FALSE.
Использование типа числового значения
Числовые типы значений можно искать как точные совпадения, но их также можно искать с помощью реляционных операторов, таких как больше или меньше. Например, size:10000 вернет только элементы размером ровно 10 000 байт, но размер:>=10000 вернет элементы, размер которых превышает 10 000 байт или равен 10 000 байт. Диапазон также можно указать с помощью оператора диапазона ( ..). Например, size:7000..8000 вернет элементы размером от 7000 до 8000.
Использование логических операторов
Строки запроса поддерживают следующие логические операторы.
Табл. 2. Поддерживаемые логические операторы
Описание | Примеры |
---|---|
И |
проект AND от:"Сэди Дэниелс" subject:(project AND plan) |
ИЛИ |
subject:meeting OR from:"Hope Gross" from:("Сэди Дэниелс" ИЛИ "Надежда Гросс") |
NOT |
НЕ от:"Ронни Стургис" получено:NOT сегодня |
Обратите внимание, что эти операторы можно использовать для объединения нескольких критериев или для объединения нескольких значений в одной паре ключевое слово/значение. Однако при соединении нескольких значений в одной паре "ключевое слово-значение" следует использовать круглые скобки для заключения нескольких значений. Чтобы понять причину, рассмотрите возможность поиска с: "Сэди Дэниелс" или "Надежда Гросс". Этот поиск фактически интерпретируется как следующие критерии:
Элемент из Сэди Дэниелс, OR
Элемент содержит фразу "Надежда Гросс" в любом из его индексированных свойств.
В отличие от: ("Сэди Дэниелс" ИЛИ "Надежда Гросс") интерпретируется как:
Элемент из Сэди Дэниелс, OR
Элемент от Хоуп Гросс
Оператор по умолчанию, если указано несколько условий, но логический оператор не включен, — AND. Например, имеет значение attachment:true subject:project эквивалентно has:attachment:true и subject:project.
Пример. Поиск элементов с помощью строки запроса и управляемого API EWS
В этом примере определен метод SearchWithQueryString . Он принимает объект ExchangeService , объект WellKnownFolderName и строковый объект, представляющий строку запроса в качестве параметров. В этом примере предполагается, что для объекта ExchangeService выполнена инициализация с допустимыми значениями в свойствах Credentials и 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);
}
}
Этот метод можно использовать для поиска всех элементов с фразой "план проекта" в теме, как показано в этом примере.
string queryString = "subject:\"project plan\"";
SearchWithQueryString(service, WellKnownFolderName.Inbox, queryString);
Пример. Поиск элементов с помощью строки запроса и EWS
В этом примере запрос SOAP FindItem находит все элементы в папке "Входящие" с фразой "план проекта" в теме.
<?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>
В следующем примере показан ответ сервера с результатами поиска.
<?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>