У меня проблема с параметрами поиска. Я хочу передать фразу в моем запросе. Например, я ищу электронные письма, где тема «Тест 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)"
Скобки могут быть важны, если вы используете поиск по нескольким полям. И вуаля.