Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Note
Поиск с использованием ИИ Azure доступна через портал Azure, REST API и Azure SDKs. Он также лежит в основе Foundry IQ — управляемого слоя знаний, который преобразует корпоративный контент в многократно используемые базы знаний с учетом разрешений доступа для агентов на портале Microsoft Foundry.
Фильтр предоставляет критерии на основе значений для включения или исключения содержимого перед выполнением запроса для поиска ключевых слов или до или после выполнения запроса для векторного поиска. Фильтры применяются к невекторным полям, но могут использоваться в векторном поиске, если документы включают невекторные поля. Например, для индексов, организованных вокруг фрагментированного содержимого, могут быть поля родительского уровня или поля метаданных, которые можно фильтровать.
В этой статье объясняется фильтрация по поиску ключевых слов. Дополнительные сведения о векторах см. в разделе "Добавление фильтра" в векторном запросе.
Фильтр указывается с помощью синтаксиса выражения фильтра OData. В отличие от поиска по ключевым словам и векторного поиска, фильтр будет успешным только при точном совпадении.
Когда следует использовать фильтр
Фильтры являются основными для нескольких интерфейсов поиска, включая "найти рядом со мной" геопространственный поиск, фасетную навигацию и фильтры безопасности, которые показывают только те документы, которые пользователь может просматривать. Если вы реализуете любой из этих интерфейсов, требуется фильтр. Это фильтр, подключенный к поисковому запросу, который предоставляет координаты географического расположения, категорию аспектов, выбранную пользователем, или идентификатор безопасности запрашивающего пользователя.
Ниже приведены распространенные сценарии.
Разделите результаты поиска в зависимости от содержимого индекса. Учитывая схему с расположением отеля, категориями и удобствами, можно создать фильтр, чтобы явно соответствовать критериям (в Сиэтле, у воды, с видом).
Реализуйте возможность поиска, которая содержит зависимость от фильтра:
- Фасетная навигация использует фильтр для передачи категории фасетов, выбранной пользователем.
- Геопространственный поиск использует фильтр для передачи координат текущего местоположения в приложениях с функцией «найти рядом», которые соответствуют определенной области или заданному расстоянию.
- Фильтры безопасности передают идентификаторы безопасности в качестве критериев фильтрации, совпадение в индексе служит посредником для определения прав доступа к документу.
Выполните поиск чисел. Числовые поля являются извлекаемыми и могут отображаться в результатах поиска, но они не доступны для поиска (при условии полнотекстового поиска) по отдельности. Если вам нужны критерии выбора на основе числовых данных, используйте фильтр.
Как выполняются фильтры
Во время запроса средство синтаксического анализа фильтра принимает условия в качестве входных данных, преобразует выражение в атомарные логические выражения, представленные в виде дерева, а затем вычисляет дерево фильтра по фильтруемым полям в индексе.
Фильтрация производится одновременно с поиском, определяя, какие документы включить в последующую обработку для извлечения и оценки релевантности документов. В сочетании со строкой поиска фильтр эффективно уменьшает набор найденных элементов последующей операции поиска. При использовании отдельно (например, если строка запроса пуста search=*), критерии фильтра являются единственными входными данными.
Определение фильтров
Фильтры применяются к текстовому и числовому (не векторному) содержимому для полей, атрибутированных как filterable.
Фильтры — это выражения OData, сформулированные в синтаксисе filter поддерживаемые Поиск с использованием ИИ Azure.
Можно указать один фильтр для каждой операции поиска , но сам фильтр может включать несколько полей, несколько критериев и, если вы используете функцию, несколько выражений полнотекстового ismatch поиска. В многокомпонентном выражении фильтра можно указать предикаты в любом порядке (в соответствии с правилами приоритета оператора). При попытке переупорядочения предикатов в определенной последовательности нет заметного повышения производительности.
Одним из ограничений выражения фильтра является максимальное ограничение размера запроса. Весь запрос включительно от фильтра может составлять не более 16 МБ для POST или 8 КБ для GET. Существует также ограничение на количество предложений в выражении фильтра. Хорошим правилом является то, что если у вас есть сотни положений, вы рискуете достичь предела. Рекомендуется разрабатывать ваше приложение способом, который не создаёт фильтры неограниченного размера.
В следующих примерах представлены определения прототипного фильтра в нескольких API.
POST https://[service name].search.windows.net/indexes/hotels/docs/search?api-version=2026-04-01
{
"search": "*",
"filter": "Rooms/any(room: room/BaseRate lt 150.0)",
"select": "HotelId, HotelName, Rooms/Description, Rooms/BaseRate"
}
options = new SearchOptions()
{
Filter = "Rating gt 4",
OrderBy = { "Rating desc" }
};
Шаблоны фильтров
В следующих примерах показано несколько шаблонов использования для сценариев фильтрации. Дополнительные идеи см. в примерах синтаксиса > выражений OData.
Автономный $filter без параметров запроса полезен, если выражение фильтра может полностью квалифицировать документы, представляющие интерес. Без строки запроса нет лексического или лингвистического анализа, ни оценки, ни ранжирования. Обратите внимание, что строка поиска — это просто звездочка, что означает "соответствие всем документам".
{ "search": "*", "filter": "Rooms/any(room: room/BaseRate ge 60 and room/BaseRate lt 300) and Address/City eq 'Honolulu" }Сочетание строки запроса и $filter, где фильтр создает подмножество, а строка запроса предоставляет вводимые термины для полнотекстового поиска по отфильтрованной подмножестве. Добавление терминов (театры в шаговой доступности) добавляет оценки релевантности в результаты, где документы, наиболее соответствующие терминам, ранжируются выше. Использование фильтра со строкой запроса является наиболее распространенным шаблоном использования.
{ "search": "walking distance theaters", "filter": "Rooms/any(room: room/BaseRate ge 60 and room/BaseRate lt 300) and Address/City eq 'Seattle'" }Составные запросы, разделенные словом «или», каждый из которых имеет собственные критерии фильтрации (например, «бигли» в «собака» или «сиамская» в «кот»). Выражения в сочетании с
orоцениваются по отдельности, при этом в ответе передается объединение документов, соответствующих каждому выражению. Этот шаблон использования достигается с помощьюsearch.ismatchscoringфункции. Кроме того, можно использовать не засчитывающуюся версию,search.ismatch.# Match on hostels rated higher than 4 OR 5-star motels. $filter=search.ismatchscoring('hostel') and Rating ge 4 or search.ismatchscoring('motel') and Rating eq 5 # Match on 'luxury' or 'high-end' in the description field OR on category exactly equal to 'Luxury'. $filter=search.ismatchscoring('luxury | high-end', 'Description') or Category eq 'Luxury'&$count=trueКроме того, можно объединить полнотекстовый поиск через
search.ismatchscoringс фильтрами, используяandвместоor, но это по сути эквивалентно использованию параметровsearchи$filterв запросе поиска. Например, следующие два запроса приводят к одному результату:$filter=search.ismatchscoring('pool') and Rating ge 4 search=pool&$filter=Rating ge 4
Требования к полям для фильтрации
В REST API фильтрация включена по умолчанию для простых полей. Фильтрация полей увеличивает размер индекса; Не забудьте задать "filterable": false поля, которые вы не планируете использовать в фильтре. Дополнительные сведения о параметрах определений полей см. в разделе "Создание индекса".
В SDK Azure фильтрация отключена off по умолчанию. Вы можете выполнить фильтрацию полей, задав для свойства IsFilterable соответствующего объекта SearchField значение true. В следующем примере атрибут задается в Rating свойстве класса модели, который сопоставляется с определением индекса.
[SearchField(IsFilterable = true, IsSortable = true, IsFacetable = true)]
public double? Rating { get; set; }
Сделать существующее поле фильтруемым
Вы не можете изменить существующие поля, чтобы сделать их фильтруемыми. Вместо этого необходимо добавить новое поле или перестроить индекс. Дополнительные сведения о перестроении индекса или повторной загрузке полей смотрите в разделе Как перестроить индекс Поиск с использованием ИИ Azure.
Основы фильтрации текста
Текстовые фильтры сравнивают строковые поля с буквальными строками, которые вы предоставляете в фильтре: $filter=Category eq 'Resort and Spa'
В отличие от полнотекстового поиска, нет лексического анализа или разбиения слов для текстовых фильтров, поэтому сравнения предназначены только для точных совпадений. Например, предположим, что поле f содержит "солнечный день", $filter=f eq 'sunny' не соответствует, но $filter=f eq 'sunny day' будет.
Текстовые строки чувствительны к регистру, что означает, что текстовые фильтры чувствительны к регистру по умолчанию. Например, $filter=f eq 'Sunny day' не найдет "солнечный день". Однако вы можете использовать нормализатор , чтобы сделать его так, чтобы фильтрация не учитывает регистр.
Подходы к фильтрации текста
| Подход | Описание | Когда следует использовать |
|---|---|---|
search.in |
Функция, которая проверяет поле по сопоставлению со списком разделённых строк. | Рекомендуется для фильтров безопасности и для любых фильтров, в которых необходимо сопоставить много необработанных текстовых значений со строковым полем. Функция search.in оптимизирована для высокой скорости и работает гораздо быстрее, чем явное сравнение поля с каждой строкой с использованием eq и or. |
search.ismatch |
Функция, которая позволяет смешивать операции полнотекстового поиска с логическими операциями фильтрации в том же выражении фильтра. | Используйте search.ismatch (или его эквивалент оценки , search.ismatchscoring), если требуется несколько сочетаний фильтров поиска в одном запросе. Вы также можете использовать его для фильтра contains, чтобы отфильтровать частичную строку внутри более крупной строки. |
$filter=field operator string |
Определяемое пользователем выражение, состоящее из полей, операторов и значений. | Используйте это, если требуется найти точные совпадения между строковым полем и строковым значением. |
Основы числовых фильтров
Числовые поля не searchable в контексте полнотекстового поиска. Только строки подвергаются полнотекстовом поиску. Например, если ввести 99,99 в качестве поискового термина, вы не получите товары стоимостью 99,99 долл. США. Вместо этого вы увидите элементы с числом 99 в строковых полях документа. Таким образом, если у вас есть числовые данные, предполагается, что они будут использоваться для фильтров, включая диапазоны, аспекты, группы и т. д.
Документы, содержащие числовые поля (цена, размер, номер SKU, идентификатор) предоставляют эти значения в результатах поиска, если поле отмечено retrievable. Здесь суть в том, что полнотекстовый поиск сам по себе не применим к числовым типам полей.
Дальнейшие действия
Сначала попробуйте Поисковый проводник на портале Azure, чтобы отправлять запросы с параметрами $filter. Индекс примера недвижимости предоставляет интересные результаты для следующих отфильтрованных запросов при вставке их в строку поиска:
# Geo-filter returning documents within 5 kilometers of Redmond, Washington state
# Use $count=true to get a number of hits returned by the query
# Use $select to trim results, showing values for named fields only
# Use search=* for an empty query string. The filter is the sole input
search=*&$count=true&$select=description,city,postCode&$filter=geo.distance(location,geography'POINT(-122.121513 47.673988)') le 5
# Numeric filters use comparison like greater than (gt), less than (lt), not equal (ne)
# Include "and" to filter on multiple fields (baths and bed)
# Full text search is on John Leclerc, matching on John or Leclerc
search=John Leclerc&$count=true&$select=source,city,postCode,baths,beds&$filter=baths gt 3 and beds gt 4
# Text filters can also use comparison operators
# Wrap text in single or double quotes and use the correct case
# Full text search is on John Leclerc, matching on John or Leclerc
search=John Leclerc&$count=true&$select=source,city,postCode,baths,beds&$filter=city gt 'Seattle'
Дополнительные примеры см. в разделе "Примеры синтаксиса выражений > фильтра OData".