Мы используем Azure Cognitive Search. NET SDK и пытаемся $filter
с помощью строкового поля, которое может содержать специальные символы поиска, такие как &
, а также одинарные кавычки.
Мы получаем нулевые результаты при фильтрации по тестовому случаю с кухонной раковиной специальных символов (мы исключили |, поскольку это наш разделитель для search.in
):
{
"FirmName": "Crazy Charz Inc. ' + - && ! ( ) { } [ ] ^ \" ~ * ? : \\ /"
...
}
Когда мы экранируем специальные символы с помощью \
как спросил здесь и рекомендуется здесь , а одинарная кавычка - двойная кавычка ''
(как показано в этом ответе , а не в документы SDK), мы получаем нулевые результаты.
Фильтр в нашем объекте SearchParameters имеет значение:
search.in(FirmName, 'Crazy Charz Inc. '' \+ \- \&\& \! \( \) \{ \} \[ \] \^ \" \~ \* \? \: \\ \/', '|')
(Так выглядит при проверке переменной в VS; он должен быть должным образом экранирован.)
Мы возвращаем ноль результатов.
Мы подтвердили, что он специфицирован c для специальных символов, потому что у нас есть много тестов с то же поле, что и другие документы, содержащие нет таких символов в их значении.
Из любопытства мы попытались запустить его в Search Explorer следующим образом:
$filter=search.in(FirmName, 'Crazy Charz Inc. '' \+ \- \&\& \! \( \) \{ \} \[ \] \^ \" \~ \* \? \: \\ \/', '|')
Когда мы это сделаем, мы получим ошибку:
"Invalid expression: Found an unbalanced bracket expression.\r\nParameter name: $filter"
Мы подтвердили, что SDK возвращает фактический ответ с нулевым результатом, а не ошибку (для подтверждения этого мы добавили фактическое несбалансированное выражение в выражение фильтра).
Как мы можем $filter
для значений со специальными символами, использующими. NET SDK? Это ошибка или мы делаем что-то не так?
Примечание: Мы предоставляем список выбора опций и делаем точное совпадение; отсюда фильтр, а не поиск, для этого варианта использования. Позже мы добавим поиск по другим полям.
Нужно ли просто URLEncode для всех наших полей? Тьфу ...