Microsoft graph Mail Search Строгое значение - PullRequest
1 голос
/ 26 марта 2019

У меня проблема с параметрами поиска. Я хочу передать фразу в моем запросе. Например, я ищу электронные письма, где тема «Тест 1». Для этого я использую этот ресурс.

https://graph.microsoft.com/v1.0/me/messages?$search="subject:Test 1"

Но поведение этого запроса таково: поиск почты, содержащей «Test» в теме ИЛИ 1 в любых других полях. Ссылаясь на синтаксис KQL

Фраза (включает два или более слов вместе, разделенных пробелами; однако слова должны быть заключены в двойные кавычки)

Итак, чтобы сделать то, что я хочу, я должен поставить двойные кавычки (") вокруг моей фразы, чтобы выполнить строгий поиск значений. Как показано ниже

subject:"Test 1"

Проблема именно в этом. Microsoft graph api уже использует двойные кавычки (") после параметров $ search.

?$search="Key words"

Так что я не могу сделать то, что упомянуто в документе KQL.

https://graph.microsoft.com/v1.0/me/messages?$search="subject:"Test 1""

выдает ошибку:

"Syntax error: character '1' is not valid at position 15 in '\"subject:\"test 1\"\"'.",

Это ожидаемое поведение. Я был почти уверен, что это не сработает.

Если у кого-то есть предложения по решению или обходному пути, я покупатель.

Что я уже пробовал:

  • Используйте простую цитату
  • Удалить кавычки сразу после $ select =
  • Удалите предметную часть $ select = "Test 1", такое же поведение, как и первый запрос, упомянутый в этом посте. Он будет искать электронные письма, содержащие «test» или «1».

С уважением.

РЕДАКТИРОВАТЬ: После ответа sasfrog: Я использовал $ filter: он хорошо работает с простым оператором AND, OR. У меня есть некоторые ошибки при использовании Not Operator. И, между прочим, вы должны использовать параметр orderby, чтобы показать результат по дате и добавить поле в параметры фильтра.

Пример 1 (работает, что я просил первым):

https://graph.microsoft.com/v1.0/me/messages/?$orderby=receivedDateTime desc &$filter=receivedDateTime ge 1900-01-01T00:00:00Z AND contains(subject,'test 1')

Пример 2 (не работает)

https://graph.microsoft.com/v1.0/me/messages/?$orderby=receivedDateTime desc &$filter=(receivedDateTime ge 1900-01-01T00:00:00Z AND contains(subject,'test 1')) NOT(contains(from/EmailAddress/address,[specific address]))

РЕДАКТИРОВАТЬ 2 После некоторого теста с параметрами фильтра. Оператор NOT все еще не работает, поэтому для обхода используйте "ne" (не равно) Пример 2 становится:

  https://graph.microsoft.com/v1.0/me/messages/?$orderby=receivedDateTime desc&$filter=(receivedDateTime ge 1900-01-01T00:00:00Z AND contains(subject,'test 1')) AND (from/EmailAddress/address ne [specific address])

ОБНОВЛЕНИЕ: ДРУГОЕ РЕШЕНИЕ С $ search

Использование $ filter - это здорово, но, похоже, иногда это было довольно медленно. Таким образом, я нашел решение моей проблемы. Это означает использование оператора AND между всеми терминами.

Пример 4: Я ищу письма, где предметом является тест 1; Пусть значение = «тест 1». Таким образом, вы должны склеить его с помощью разделителя пробелов. И после написания некоторого кода для манипулирования этим массивом, чтобы получить что-то вроде ниже.

$search="(subject:test AND subject:1)"

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

1 Ответ

1 голос
/ 27 марта 2019

Не уверен, достаточно ли этого для того, что вы делаете, но как насчет использования функции contains в запросе filter вместо:

https://graph.microsoft.com/v1.0/me/messages?$filter=contains(subject,'Test 1')

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

Обновление также, это сработало для меня, используя метод search:

https://graph.microsoft.com/v1.0/me/messages?$search="subject:'Test 1'"

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...