Azure Cognitive Search - Как фильтровать по полям, содержащим специальные символы - PullRequest
0 голосов
/ 05 февраля 2020

Мы используем 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 для всех наших полей? Тьфу ...

1 Ответ

2 голосов
/ 08 февраля 2020

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

В Azure есть три синтаксиса запроса, каждый со своими правилами кодирования:

  1. Простой синтаксис запроса (используется в параметре search; правила кодирования описаны в документах, к которым вы привязаны)
  2. Полный синтаксис запроса Lucene (также используется в search, больше или менее расширенный набор синтаксиса простого запроса)
  3. Синтаксис OData (используется в $filter, $select и $orderby; задокументировано здесь ).

Правило об удвоении одинарных кавычек взято из OData. Другие правила, которые вы применяете, относятся к простому синтаксису запросов, а не к OData.

Я написал небольшое консольное приложение для проверки этого и смог сопоставить ожидаемый документ, используя точный строковый литерал:

@"search.in(hotelName, 'Crazy Charz Inc. '' + - && ! ( ) { } [ ] ^ "" ~ * ? : \ /', '|')"

Обратите внимание, что, поскольку я использую дословную строку, необходимо экранировать только кавычки (одинарная кавычка для OData, двойная кавычка для компилятора).

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