Как отфильтровать массив в Azure Search

У меня есть следующие данные в моем индексе,

{
"name" : "The 100",
"lists" : [
                "2c8540ee-85df-4f1a-b35f-00124e1d3c4a;Bellamy",
                "2c8540ee-85df-4f1a-b35f-00155c40f11c;Pike",
                "2c8540ee-85df-4f1a-b35f-00155c02e581;Clark"
          ]

}

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

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

$filter=lists/any(t: t eq '2c8540ee-85df-4f1a-b35f-00155c40f11c;Pike')

Однако я не уверен, как искать только с Пайк.

$filter=lists/any(t: t eq 'Pike')

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

В настоящее время поля списков не имеют свойства поиска, только свойство фильтрации.

1 ответ

Решение

eq Оператор ищет точные, чувствительные к регистру совпадения. Вот почему это не соответствует 'Pike', Вы должны структурировать свой индекс так, чтобы можно было легко найти такие термины, как "щука". Вы можете сделать это одним из двух способов:

  1. Отделите GUID от имен при индексировании документов. Так что вместо индексации "2c8540ee-85df-4f1a-b35f-00155c40f11c;Pike" как одну строку, вы можете индексировать их как отдельные строки в одном и том же массиве или, возможно, в двух разных полях коллекции (одно для GUID и одно для имен), если вам нужно сопоставить их по позиции.
  2. Если поле searchable Вы можете использовать новый search.ismatch функция в вашем фильтре. Предполагая, что в поле используется стандартный анализатор, полнотекстовый поиск приведет к разрыву слов в точках с запятой, поэтому вы сможете найти только "Pike" и получить совпадение. Синтаксис будет выглядеть так: $filter=search.ismatch('Pike', 'lists') (Если вы ищете "Pike", все, что делает ваш фильтр, вы можете просто использовать search а также searchFields параметры для API поиска вместо $filter.) Если поле "списки" еще не доступно для поиска, вам нужно будет либо добавить новое поле и повторно проиндексировать значения "списков", либо заново создать индекс с нуля с помощью нового определения поля.
Другие вопросы по тегам