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