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


Использование параметра запроса $search в API Microsoft Graph

Параметр $search запроса — это эффективный механизм фильтрации в Microsoft Graph, который позволяет находить определенные данные, сопоставляя условия поиска.

Поддержка этого параметра запроса зависит от сущности. Некоторые сущности, например #REF! ресурсы, производные от directoryObject, поддерживаются $search только в расширенных запросах.

В этой статье объясняется, как эффективно использовать $search параметр запроса с тремя ключевыми типами ресурсов: почтовыми сообщениями, пользователями и объектами Microsoft Entra ID (объектами каталога). Вы узнаете о конкретных требованиях к синтаксису, поддерживаемых свойствах и поведении поиска для каждого типа ресурсов.

Использование $search в коллекциях сообщений

Вы можете искать сообщения на основе определенных свойств сообщений. Результаты поиска сортируются по дате и времени отправки сообщения. Запрос $search возвращает до 1000 результатов.

При поиске сообщений без указания свойств сообщения поиск предназначен для следующих свойств по умолчанию: from, subject и body.

Следующий пример кода возвращает все сообщения из папки "Входящие" вошедшего пользователя, содержащие слово "pizza" в любом из трех свойств поиска по умолчанию:

GET https://graph.microsoft.com/v1.0/me/messages?$search="pizza"

Кроме того, можно искать сообщения, указав имена свойств сообщений, которые распознает синтаксис язык KeyQL (KQL). Эти имена свойств соответствуют свойствам, определенным в сущности message в Microsoft Graph. #REF! и другие приложения Microsoft 365, такие как #REF!, поддерживают синтаксис KQL, который предоставляет общий домен обнаружения для своих хранилищ данных.

Свойство электронных писем, по которому можно выполнять поиск Описание Пример
attachment Имена файлов, вложенных в сообщение электронной почты. GET../me/messages?$search="attachment:api-catalog.md"
bcc Поле Скрытая копия в сообщении электронной почты, где указан SMTP-адрес, отображаемое имя или псевдоним. GET../me/messages?$search="bcc:samanthab@contoso.com"&$select=subject,bccRecipients
body Текст сообщения электронной почты. GET../me/messages?$search="body:excitement"
cc Поле Копия в сообщении электронной почты, где указан SMTP-адрес, отображаемое имя или псевдоним. GET../me/messages?$search="cc:danas"&$select=subject,ccRecipients
from Отправитель сообщения электронной почты, на которого указывает SMTP-адрес, отображаемое имя или псевдоним. GET../me/messages?$search="from:randiw"&$select=subject,from

GET../me/messages?$search="from:adelev OR from:alexw OR from: allanD"&$select=subject, from
hasAttachment true Если сообщение электронной почты содержит вложение, которое не является встроенным вложением; false Иначе. GET../me/messages?$search="hasAttachments:true"
importance Важность сообщения электронной почты, которую отправитель может указать при отправке сообщения. Возможные значения: low, mediumили high. GET../me/messages?$search="importance:high"&$select=subject,importance
kind Тип сообщения. Возможные значения: contacts, docs, email, faxes, im, journals, meetings, notes, , postsrssfeeds, tasksили voicemail. GET../me/messages?$search="kind:voicemail"
participants Такие поля сообщения электронной почты, как От, Кому, Копия и Скрытая копия, где указан SMTP-адрес, отображаемое имя или псевдоним. GET../me/messages?$search="participants:danas"
received Дата получения получателем сообщения электронной почты. GET../me/messages?$search="received:07/23/2018"&$select=subject,receivedDateTime
recipients Поля to, cc и bcc сообщения электронной почты, указанные в виде SMTP-адреса, отображаемого имени или псевдонима. GET../me/messages?$search="recipients:randiq"&$select=subject,toRecipients,ccRecipients,bccRecipients
sent Дата отправки сообщения электронной почты отправителем. GET../me/messages?$search="sent:07/23/2018"&$select=subject,sentDateTime
size Размер элемента в байтах. GET../me/messages?$search="size:1..500000"
subject Текст в строке темы сообщения электронной почты. GET../me/messages?$search="subject:has"&$select=subject
to Поле Кому в сообщении электронной почты, где указан SMTP-адрес, отображаемое имя или псевдоним. GET.../me/messages?$search="to:randiw"&$select=subject,toRecipients

Дополнительные сведения о свойствах электронной почты с возможностью поиска, синтаксисе KQL, поддерживаемых операторах и советах по поиску см. в следующих статьях:

Использование $search в коллекциях пользователей

Вы можете применить к $search свойствам displayName и emailAddresses ресурса person . Запросы возвращают до 250 результатов по умолчанию.

Следующий запрос выполняет поиск "Irene McGowan" в коллекции объектов person для вошедшего пользователя. Microsoft Graph выполняет поиск свойств displayName и emailAddresses .

GET https://graph.microsoft.com/v1.0/me/people/?$search="Irene McGowen"

Ниже показан пример ответа.

HTTP/1.1 200 OK
Content-type: application/json

{
    "value": [
       {
           "id": "C0BD1BA1-A84E-4796-9C65-F8A0293741D1",
           "displayName": "Irene McGowan",
           "givenName": "Irene",
           "surname": "McGowan",
           "birthday": "",
           "personNotes": "",
           "isFavorite": false,
           "jobTitle": "Auditor",
           "companyName": null,
           "yomiCompany": "",
           "department": "Finance",
           "officeLocation": "12/1110",
           "profession": "",
           "userPrincipalName": "irenem@contoso.com",
           "imAddress": "sip:irenem@contoso.com",
           "scoredEmailAddresses": [
               {
                   "address": "irenem@contoso.com",
                   "relevanceScore": -16.446060612802224
               }
           ],
           "phones": [
               {
                   "type": "Business",
                   "number": "+1 412 555 0109"
               }
           ],
           "postalAddresses": [],
           "websites": [],
           "personType": {
               "class": "Person",
               "subclass": "OrganizationUser"
           }
       }
   ]
}

Дополнительные сведения об API People см. в этой статье.

Использование $search в коллекциях объектов каталога

Microsoft Entra ID ресурсы и их связи, производные от directoryObject, поддерживают $search параметр запроса только в расширенных запросах.

Примечание.

  • В настоящее время параметр запроса $search недоступен в клиентах #REF! AD B2C.
  • Существует известная проблема с $search объектами каталога для значений, содержащих символ амперсанда (&).

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

  • Пробелы: hello world =>hello, world
  • Разные регистры1⁾: HelloWorld или helloWORLD =>hello, world
  • Symbols2⁾: hello.world =>hello, ., world, helloworld
  • Числа: hello123world =>hello, 123, world

1⁾ Для разных регистров маркеризация в настоящее время работает только при изменении регистра со строчных регистров на прописные. Например, HELLOworld является одним токеном: helloworld, и HelloWORld является двумя маркерами: hello, world.

Логика токенизации ⁽2⁾ также объединяет слова, разделенные только символами. Например, поиск и helloworldhello-worldhello.world.

После токенизации маркеры сопоставляются независимо от исходного регистра и в любом порядке. Например, displayName 李四(David Li) соответствует строкам поиска, таким как 李四(David Li), 李四, David, Li, David), (李四, . Li 李 Изменение алфавита (например, с латинской на кириллицу или китайский) не создает новый маркер. Например, displayName 蓝色group соответствует строкам 蓝色group поиска и 蓝色 , но не group. DisplayName group蓝色 соответствует строкам group蓝色 поиска и group , но не 蓝色 или .

Поиск с маркерами работает только в полях displayName и description . В можно использовать любое поле строкового типа, но по $searchумолчанию используются $filterstartswith поля, отличные от displayName и description.

Например:

GET https://graph.microsoft.com/v1.0/groups/?$search="displayName:OneVideo" OR "mail:onevideo"
ConsistencyLevel: eventual

При этом выполняется поиск всех групп с отображаемыми именами, имеющими one маркеры и video , или почты, начинающиеся с onevideo.

Вы можете использовать $search вместе с $filter:

GET https://graph.microsoft.com/v1.0/groups/?$filter=mailEnabled eq true&$search="displayName:OneVideo"
ConsistencyLevel: eventual

При этом выполняется поиск всех групп с поддержкой почты с отображаемыми именами, похожими на OneVideo. Результаты фильтруются на основе логического сочетания (AND) $filter и всего запроса в $search.

Синтаксис поиска соответствует следующим правилам:

  • Общий формат: $search="clause1" [AND | OR] "clauseX"
  • Количество предложений: поддерживается любое количество предложений. Также поддерживаются круглые скобки для приоритета.
  • Синтаксис предложения: "<property>:<text to search>"
    • Необходимо указать имя свойства в предложении.
    • Все предложение должно быть заключено в двойные кавычки. Если он содержит двойные кавычки или обратную косую черту, экранируйте ее с помощью обратной косой черты. Все остальные специальные символы должны быть закодированы в URL-адресе.
  • Логические операторы: AND операторы и OR должны находиться вне двойных кавычек и в верхнем регистре.
  • Поведение поиска. Поиск true поддерживается только для свойств displayName и description . Любое свойство, которое можно использовать в $filter, можно также использовать в $search. Свойства, отличные от displayName и description , по умолчанию — $filter с поведением startsWith, если поиск не поддерживается.
  • Токенизация. Как строковые входные данные, так $search и свойства, доступные для поиска, разделены на части по пробелам, различным регистрам и типам символов (числам и специальным символам).

В следующей таблице приведены некоторые примеры.

Класс объекта Описание Пример
Пользователь Отображаемое имя пользователя из адресной книги. GET../users?$search="displayName:Guthr"
Пользователь Отображаемое имя пользователя или электронная почта из адресной книги. GET../users?$search="displayName:Guthr" OR "mail:Guthr"
Группа Отображаемое имя пользователя или описание из адресной книги. GET../groups?$search="description:One" AND ("displayName:Video" OR "displayName:Drive")
Группа Отображаемое имя адресной книги в группе с поддержкой почты. GET../groups?$filter=mailEnabled eq true&$search="displayName:OneVideo"