Поиск документов (REST API поиска Azure AI)
Запрос предназначен для коллекции документов по одному индексу в службе поиска. Он включает параметры, определяющие критерии соответствия, и параметры, которые формируют ответ. Начиная с версии API 2021-04-30-Preview, вы также можете использовать псевдоним индекса для нацеливания на определенный индекс вместо самого имени индекса.
Вы можете использовать GET или POST. Параметры запроса указываются в строке запроса для запросов GET и в тексте запроса для запросов POST.
GET https://[service name].search.windows.net/indexes/[index name]/docs?[query parameters]
Content-Type: application/json
api-key: [admin or query key]
Если вы используете POST, добавьте действие "поиск" в качестве параметра URI.
POST https://[service name].search.windows.net/indexes/[index name]/docs/search?api-version=[api-version]
Content-Type: application/json
api-key: [admin or query key]
При вызове с помощью GET длина URL-адреса запроса не может превышать 8 КБ. Обычно такой длины достаточно для большинства приложений. Однако некоторые приложения создают большие запросы, особенно при использовании выражений фильтра OData. Для этих приложений http POST является лучшим выбором, так как он позволяет использовать фильтры большего размера, чем GET.
При использовании запроса POST ограничивающим фактором является количество предложений в запросе, а не необработанная строка фильтра, так как предельный размер запроса для POST ограничен примерно 16 МБ. Несмотря на то, что ограничение размера запроса POST велико, выражения фильтра не могут быть произвольными. Дополнительные сведения об ограничениях сложности фильтра см. в статье Синтаксис выражений OData для поиска ИИ Azure.
Параметры URI
Параметр | Описание |
---|---|
[имя службы] | Обязательный. Задайте уникальное, определяемое пользователем имя службы поиска. |
[имя индекса]/docs | Обязательный. Указывает коллекцию документов именованного индекса. |
[параметры запроса] | Параметры запроса указываются в URI для запросов GET и в тексте запроса для запросов POST. |
api-version | Обязательный. Текущая стабильная версия — api-version=2020-06-30 . Дополнительные версии см. в разделе Версии API . Для запросов версия API всегда указывается в качестве параметра URI для GET и POST. |
Рекомендации по кодированию URL-адресов
Не забудьте закодировать определенные параметры запроса по URL-адресу при непосредственном вызове REST API GET. Для операции поиска документов может потребоваться кодирование URL-адреса для следующих параметров запроса:
- search
- $filter
- facet
- highlightPreTag
- highlightPostTag
Кодировка URL-адреса рекомендуется только для отдельных параметров. Если вы случайно URL-кодировали всю строку запроса (все после ?
), запросы будут нарушены.
Кроме того, преобразование в кодировку URL необходимо только при непосредственном обращении к API REST с помощью запроса GET. Кодирование URL-адресов не требуется при использовании POST или клиентской библиотеки .NET для поиска ИИ Azure, которая автоматически обрабатывает кодировку.
Заголовки запросов
Таблица ниже содержит обязательные и необязательные заголовки запроса.
Поля | Описание |
---|---|
Content-Type | Обязательный. Присвойте этому параметру значение application/json. |
api-key | Необязательно, если вы используете роли Azure и в запросе предоставляется маркер носителя, в противном случае требуется ключ. Ключ API — это уникальная, созданная системой строка, которая проверяет подлинность запроса к службе поиска. Запросы к коллекции документов могут указывать ключ администратора или ключ запроса в качестве ключа API. Ключ запроса используется для операций только для чтения в коллекции документов. Дополнительные сведения см. в статье Подключение к поиску ИИ Azure с помощью проверки подлинности по ключу . |
Текст запроса
Для запроса GET: нет.
Для запроса POST:
{
"count": true | false (default),
"facets": [ "facet_expression_1", "facet_expression_2", ... ],
"filter": "odata_filter_expression",
"highlight": "highlight_field_1, highlight_field_2, ...",
"highlightPreTag": "pre_tag",
"highlightPostTag": "post_tag",
"minimumCoverage": # (% of index that must be covered to declare query successful; default 100),
"orderby": "orderby_expression",
"queryType": "simple" (default) | "full",
"scoringParameters": [ "scoring_parameter_1", "scoring_parameter_2", ... ],
"scoringProfile": "scoring_profile_name",
"scoringStatistics" : "local" | "global",
"search": "simple_query_expression",
"searchFields": "field_name_1, field_name_2, ...",
"searchMode": "any" (default) | "all",
"select": "field_name_1, field_name_2, ...",
"sessionId" : "session_id",
"skip": # (default 0),
"top": #
}
Продолжение частичных ответов поиска
Иногда поиск azure AI не может вернуть все запрошенные результаты в одном ответе поиска. Это может произойти по разным причинам, например, когда запрос запрашивает слишком много документов, не указывая $top
или указывая слишком большое значение для $top
. В таких случаях поиск ИИ Azure включает заметку @odata.nextLink в текст ответа, а также @search.nextPageParameters , если это был запрос POST. Вы можете использовать значения этих заметок, чтобы составить другой запрос на поиск для получения следующей части ответа поиска. Это называется продолжением исходного запроса на поиск, а такие аннотации обычно называются маркерами продолжения. Дополнительные сведения о синтаксисе этих заметок и их отображении в тексте ответа см. в примере ответа ниже.
Причины, по которым поиск ИИ Azure может возвращать маркеры продолжения, зависят от реализации и могут быть изменены. Надежные клиенты должны быть всегда готовы к ситуациям, когда возвращается меньше документов, чем ожидалось, и предоставляется токен продолжения, позволяющий продолжить извлечение документов. Кроме того, обратите внимание, что для продолжения необходимо использовать тот же самый метод HTTP, что и в исходном запросе. Например, если был отправлен запрос GET, все отправляемые запросы на продолжение должны также использовать GET (это справедливо и для POST).
Примечание
Целью @odata.nextLink и @search.nextPageParameters является защита службы от запросов, запрашивающих слишком много результатов, а не предоставление общего механизма для разбиения по страницам. Если вы хотите просматривать результаты по страницам, используйте $top
и $skip
вместе. Например, если вам нужны страницы размером 10, первый запрос должен иметь $top=10
и $skip=0
, второй запрос должен иметь $top=10
и $skip=10
, третий запрос должен иметь $top=10
и $skip=20
, и т. д.
Параметры запроса.
Запрос принимает несколько параметров в URL-адресе при вызове с помощью GET и в качестве свойств JSON в тексте запроса при вызове с помощью POST. Синтаксис некоторых параметров зависит от выбора запроса GET и POST. Эти различия приведены ниже.
Имя | Тип | Описание |
---|---|---|
api-version | строка | Обязательный. Версия REST API, используемая для запроса. Список поддерживаемых версий см. в разделе Версии API. Для этой операции версия API указывается в качестве параметра URI независимо от того, вызывается ли поиск документов с помощью GET или POST. |
$count |
Логическое | Необязательный элемент. Допустимые значения: true или false. Значение по умолчанию — false. При вызове с помощью POST этот параметр называется count вместо $count . Указывает, получать ли общее количество результатов. Это количество всех документов, соответствующих параметрам поиска и $filter, игнорируя $top и $skip . Установка этого значения true может снизить производительность. Счетчик является точным, если индекс стабилен, но будет добавляться к документам, которые активно добавляются, обновляются или удаляются. Если вы хотите получить только количество без документов, можно использовать $top =0. |
аспекты или аспекты | строка | Необязательный параметр. Поле для аспектов, где поле атрибутируется как "фасетная". При вызове с помощью GET facet является полем (facet: field1 ). При вызове с помощью POST этот параметр называется facets вместо facet и указывается в виде массива (facets: [field1, field2, field3] ). Строка может содержать параметры для настройки аспекта, выраженные в виде пар "имя-значение", разделенных запятыми.
Допустимые параметры: count, sort, values, interval и timeoffset. "count" — это максимальное число терминов аспекта; значение по умолчанию — 10. Верхний предел количества терминов отсутствует, но более высокие значения ухудшают производительность, особенно если фасетное поле содержит большое количество уникальных терминов. Например, "facet=category,count:5" получает пять лучших категорий в результатах аспектов. Если параметр count меньше числа уникальных терминов, результаты могут быть неточны. Это связано с особенностями распределения запросов аспектирования по сегментам. Для получения точного подсчета по всем сегментам можно задать значение count равным нулю или значению, которое больше или равно количеству уникальных значений в поле фасетной таблицы. Компромисс заключается в увеличении задержки. Для параметра sort можно задать значения count, -count, value, -value. Используйте count для сортировки по убыванию по счетчику. Используйте параметр -count для сортировки по возрастанию по числу. Используйте значение для сортировки по возрастанию по значению. Используйте параметр -value для сортировки по убыванию по значению (например, "facet=category,count:3,sort:count" получает три первые категории в фасете в порядке убывания по количеству документов с каждым названием города). Если первые три категории: Бюджет, Мотель и Роскошь, а бюджет имеет 5 попаданий, Мотель имеет 6, а Роскошь имеет 4, то контейнеры находятся в порядке Мотель, Бюджет, Роскошь. Для параметра -value "facet=rating,sort:-value" создает контейнеры для всех возможных оценок в порядке убывания по значению (например, если оценки от 1 до 5, контейнеры упорядочивается 5, 4, 3, 2, 1, независимо от количества документов, соответствующих каждой оценке). Для значений "values" можно задать числовые значения с разделителями по каналу или значения Edm.DateTimeOffset, указывающие динамический набор значений для входа аспектов (например, "facet=baseRate,values:10 | 20" производит три ведра: один для базовой ставки от 0 до, но не включая 10, один для 10 до, но не включая 20, и один для 20 и выше). Строка "facet=lastRenovationDate,values:2010-02-01T00:00:00Z" создает два контейнера: один для отелей, отремонтированных до февраля 2010 года, и один для отелей, отремонтированных 1 февраля 2010 года или позже. Чтобы получить ожидаемые результаты, значения должны быть перечислены в последовательном порядке по возрастанию. "interval" — это целочисленный интервал больше 0 для чисел или минута, час, день, неделя, месяц, квартал, год для значений даты и времени. Например, "facet=baseRate,interval:100" создает сегменты на основе диапазонов базовых ставок размером 100. Если базовые ставки находятся в интервале от 60 до 600 долларов США, то будут созданы следующие сегменты: 0–100, 100–200, 200–300, 300–400, 400–500 и 500–600. Строка "facet=lastRenovationDate,interval:year" создает один контейнер для каждого года, когда отели были отремонтированы. параметру timeoffset можно задать значение ([+-]чч:мм, [+-]чм или [+-]чч). При использовании параметр timeoffset должен сочетаться с параметром interval и только при применении к полю типа Edm.DateTimeOffset. Значение задает смещение времени UTC в учетной записи для настройки временных границ. Например, "facet=lastRenovationDate,interval:day,timeoffset:-01:00" использует границу дня, которая начинается с 01:00:00 UTC (полночь в целевом часовом поясе). Count и sort можно объединить в одной спецификации аспекта, но их нельзя объединить с интервалом или значениями, а интервал и значения нельзя объединить вместе. Аспекты интервала для даты и времени вычисляются на основе времени в формате UTC, если не указано значение timeoffset. Например, для "facet=lastRenovationDate,interval:day" граница дня начинается в 00:00:00 UTC. |
$filter | строка | Необязательный параметр. Выражение структурированного поиска в стандартном синтаксисе OData. В фильтре можно использовать только фильтруемые поля. При вызове с помощью POST этот параметр называется filter вместо $filter. Дополнительные сведения о подмножестве грамматики выражений OData, поддерживаемых поиском ИИ Azure, см. в статье Синтаксис выражений OData для поиска ИИ Azure . |
highlight | строка | Необязательный параметр. Набор имен полей, разделенных запятыми, используемых для выделения попаданий. Для выделения попаданий можно использовать только доступные для поиска поля. По умолчанию поиск ИИ Azure возвращает до 5 выделений на поле. Ограничение можно настроить для каждого поля, добавляя "-<max# выделений>" после имени поля. Например, "highlight=title-3,description-10" возвращает до 3 выделенных совпадений из поля заголовка и до 10 попаданий из поля описания. Максимальное количество выделений должно быть целым числом от 1 до 1000 включительно. |
highlightPostTag | строка | Необязательный элемент. По умолчанию — "</em>" . Строковый тег, добавляющий к выделенному термину. Необходимо задать параметр highlightPreTag. Зарезервированные символы в составе URL должно быть экранированы знаком процента (например, %23 вместо #). |
highlightPreTag | строка | Необязательный элемент. По умолчанию — "</em>" . Строковый тег, который добавляется к выделенному термину. Должен быть задан с параметром highlightPostTag. Зарезервированные символы в составе URL должно быть экранированы знаком процента (например, %23 вместо #). |
minimumCoverage | Целое число | Необязательный элемент. Допустимые значения — это число от 0 до 100, указывающее процент индекса, который должен быть доступен для обслуживания запроса, прежде чем его можно будет сообщить об успешном выполнении. Значение по умолчанию — "100".
Стопроцентное покрытие означает, что все сегменты ответили на запрос (ни проблемы работоспособности служб, ни действия по обслуживанию не сократили охват). В параметре по умолчанию значение меньше полного покрытия возвращает код состояния HTTP 503. Если возникают ошибки 503, и вы хотите увеличить вероятность успешного выполнения запроса, особенно для служб, настроенных для одного реплика, может быть полезен снижение минимальной нагрузкиCoverage. Если задано значение minimumCoverage и поиск выполнен успешно, он возвращает HTTP 200 и включает @search.coverage в ответ значение, указывающее процент индекса, включенного в запрос. В этом сценарии не все соответствующие документы гарантированно будут присутствовать в результатах поиска, но если доступность поиска важнее, чем отзыв, сокращение охвата может быть жизнеспособной стратегией устранения рисков. |
$orderby | строка | Необязательный параметр. Список выражений, разделенных запятыми, для сортировки результатов по ним. При вызове с помощью POST этот параметр называется orderby вместо $orderby. Каждое выражение может быть именем поля или вызовом функции geo.distance(). За каждым выражением может следовать "asc", чтобы указать по возрастанию, и "desc", чтобы обозначить по убыванию. Если в поле сортировки есть значения NULL, значения NULL отображаются сначала в порядке возрастания и в последнем в порядке убывания. По умолчанию результаты сортируются по возрастанию. При равенстве позиций порядок определяется по показателю совпадения документа. Если $orderby не указан, порядок сортировки по умолчанию убывания по оценке соответствия документа. Существует ограничение в 32 предложения для $orderby. |
queryType | строка | Необязательный параметр. Допустимые значения: simple или full. По умолчанию используется значение "simple".
"simple" интерпретирует строки запроса с помощью простого синтаксиса запроса , который позволяет использовать такие символы, как + , * и "" . Запросы по умолчанию оцениваются во всех доступных для поиска полях (или полях, указанных в поле searchFields) в каждом документе.
"full" интерпретирует строки запроса с помощью полного синтаксиса запроса Lucene , который позволяет выполнять поиск по конкретным полям и взвешены. Поиск по диапазону на языке запросов Lucene не поддерживается в пользу $filter, который предлагает аналогичные функции. |
scoringParameter | строка | Необязательный параметр. Указывает значения для каждого параметра, определенного в функции оценки (например, referencePointParameter) в формате "name-value1,value2,...". При вызове с помощью POST этот параметр называется scoringParameters вместо scoringParameter. Кроме того, вы указываете его в виде массива строк JSON, где каждая строка представляет собой отдельную пару "имя-значения".
Для профилей оценки, включающих функцию, отделить функцию от ее входного списка символом - . Например, функция с именем "mylocation" будет "&scoringParameter=mylocation--122.2,44.8". Первый дефис отделяет имя функции от списка значений, а второй — часть первого значения (долгота в этом примере).
Для параметров оценки, таких как повышение тегов, которые могут содержать запятые, можно экранировать любые такие значения в списке с помощью одинарных кавычек. Если одинарные кавычки содержатся в самих значениях, этот символ можно экранировать путем дублирования. Предположим, что у вас есть параметр повышения тега с именем "mytag" и вы хотите увеличить значения тегов Hello, O'Brien и Smith. Параметр строки запроса будет иметь значение "&scoringParameter=mytag-'Hello, O'''Brien',Smith". Кавычки требуются только для значений, содержащих запятые. |
scoringProfile | строка | Необязательный параметр. Имя профиля для оценки соответствующих показателей, для сопоставления документов с целью сортировки результатов. |
scoringStatistics | строка | Необязательный параметр. Допустимые значения: local или global. Значение по умолчанию — local. Укажите, следует ли вычислять статистику оценки, например частоту документов, глобально (по всем сегментам) для более согласованной оценки или локально (в текущем сегменте) для меньшей задержки. См . статью Статистика оценки в поиске ИИ Azure. Статистика оценки всегда вычисляется локально для терминов, использующих нечеткий поиск ("~"). |
search | строка | Необязательный параметр. Текст для поиска. Все доступные для поиска поля выполняются по умолчанию, если не указан параметр searchFields. В индексе текст в поле с возможностью поиска помечен, поэтому несколько терминов можно разделить пробелами (например, "search=hello world"). Чтобы вернуть совпадения по любому из условий, используйте значение * (это может быть полезно для запросов логической фильтрации). Если этот параметр опущен, по умолчанию он принимает значение * . Синтаксис поиска подробнее описан в статье Синтаксис простых запросов .
Результаты иногда могут быть неожиданными при запросе полей, доступных для поиска. Разметчик содержит логику для обработки случаев, характерных для английского языка, таких как апострофы, запятые в числах и т. д. Например, "search=123 456" будет соответствовать одному термину "123 456", а не отдельным терминам "123" и "456", так как запятые используются в качестве разделителей тысяч для больших чисел на английском языке. По этой причине мы рекомендуем использовать пробелы, а не знаки препинания для разделения терминов в параметре поиска. |
searchMode | строка | Необязательный параметр. Допустимые значения: any или all. По умолчанию используется значение any. Указывает одно или несколько совпадающих условий поиска для учета документа как подходящего. |
searchFields | строка | Необязательный параметр. Список имен полей, разделенных запятыми, для поиска указанного текста. Целевые поля должны быть помечены как доступные для поиска в схеме индекса. |
$select | строка | Необязательный параметр. Список полей, разделенных запятыми, которые необходимо включить в результирующий набор. В это предложение можно включить только поля, помеченные как доступные для извлечения. Если этот параметр не указан или содержит значение * , возвращаются все поля, помеченные в схеме как подлежащие извлечению и входящие в проекцию. При вызове с помощью POST этот параметр называется select вместо $select. |
sessionID | строка | Необязательный параметр. Использование sessionId помогает повысить согласованность оценки релевантности для служб поиска с несколькими репликами. В конфигурациях с несколькими реплика могут быть незначительные различия между оценками релевантности отдельных документов для одного запроса. При указании идентификатора сеанса служба прилагает все усилия для маршрутизации заданного запроса в тот же реплика для этого сеанса. Будьте осторожны, что многократное повторное использовать одни и те же значения идентификатора сеанса может помешать балансировке нагрузки запросов между репликами и отрицательно повлиять на производительность службы поиска. Значение, используемое как sessionId, не может начинаться с символа "_". Если у службы нет реплик, этот параметр не влияет на производительность или согласованность оценки. |
$skip | Целое число | Необязательный элемент. Количество пропускаемых результатов поиска. При вызове с помощью POST этот параметр называется skip вместо $skip . Это значение не может быть больше 100 000. Если вам нужно сканировать документы последовательно, но вы не можете использовать $skip из-за этого ограничения, рассмотрите возможность использования $orderby в поле, которое содержит уникальные значения для каждого документа в индексе (например, ключа документа) и $filter с запросом диапазона. |
$top | Целое число | Необязательный элемент. Количество получаемых результатов поиска. По умолчанию используется значение 50. При вызове с помощью POST этот параметр называется top вместо $top . Если указать значение больше 1000 и имеется более 1000 результатов, будут возвращены только первые 1000 результатов, а также ссылка на следующую страницу результатов (см. @odata.nextLink в примере ниже).
Служба поиска Azure AI использует разбиение по страницам на стороне сервера , чтобы предотвратить одновременное получение слишком большого количества документов. Размер страницы по умолчанию — 50, а максимальный размер страницы — 1000. Это означает, что по умолчанию поиск документов возвращает не более 50 результатов, если не указано $top . При наличии более 50 результатов ответ содержит сведения для получения следующей страницы не более 50 результатов (см. разделы "@odata.nextLink" и "@search.nextPageParameters" в примерах ниже. Аналогичным образом, если указать значение больше 1000 для $top и есть более 1000 результатов, возвращаются только первые 1000 результатов, а также сведения для получения следующей страницы не более 1000 результатов. |
Ответ
Код состояния: в качестве успешного ответа возвращается код "200 — ОК".
{
"@odata.count": # (if `$count`=true was provided in the query),
"@search.coverage": # (if minimumCoverage was provided in the query),
"@search.facets": { (if faceting was specified in the query)
"facet_field": [
{
"value": facet_entry_value (for non-range facets),
"from": facet_entry_value (for range facets),
"to": facet_entry_value (for range facets),
"count": number_of_documents
}
],
...
},
"@search.nextPageParameters": { (request body to fetch the next page of results if not all results could be returned in this response and Search was called with POST)
"count": ... (value from request body if present),
"facets": ... (value from request body if present),
"filter": ... (value from request body if present),
"highlight": ... (value from request body if present),
"highlightPreTag": ... (value from request body if present),
"highlightPostTag": ... (value from request body if present),
"minimumCoverage": ... (value from request body if present),
"orderby": ... (value from request body if present),
"scoringParameters": ... (value from request body if present),
"scoringProfile": ... (value from request body if present),
"scoringStatistics": ... (value from request body if present),
"search": ... (value from request body if present),
"searchFields": ... (value from request body if present),
"searchMode": ... (value from request body if present),
"select": ... (value from request body if present),
"sessionId" : ... (value from request body if present),
"skip": ... (page size plus value from request body if present),
"top": ... (value from request body if present minus page size),
},
"value": [
{
"@search.score": document_score (if a text query was provided),
"@search.highlights": {
field_name: [ subset of text, ... ],
...
},
"@search.features": {
"field_name": {
"uniqueTokenMatches": feature_score,
"similarityScore": feature_score,
"termFrequency": feature_score,
},
...
},
key_field_name: document_key,
field_name: field_value (retrievable fields or specified projection),
...
},
...
],
"@odata.nextLink": (URL to fetch the next page of results if not all results could be returned in this response; Applies to both GET and POST)
}
Примеры
Дополнительные примеры см. в статье Синтаксис выражений OData для поиска ИИ Azure.
Поиск по индексу с сортировкой по убыванию по дате.
GET /indexes/hotels/docs?search=*&$orderby=LastRenovationDate desc&api-version=2020-06-30
POST /indexes/hotels/docs/search?api-version=2020-06-30 { "search": "*", "orderby": "LastRenovationDate desc" }
В фасетном поиске выполните поиск по индексу и получите аспекты категорий, оценок, тегов и элементов с baseRate в определенных диапазонах.
GET /indexes/hotels/docs?search=*&facet=Category&facet=Rating&facet=Tags&facet=Rooms/BaseRate,values:80|150|220&api-version=2020-06-30
POST /indexes/hotels/docs/search?api-version=2020-06-30 { "search": "test", "facets": [ "Category", "Rating", "Tags", "Rooms/BaseRate,values:80|150|220" ] }
Обратите внимание, что последний аспект находится в подполе. Аспекты подсчитывают родительский документ (Отели), а не промежуточные вложенные документы (Комнаты), поэтому ответ определяет количество отелей, в которых есть все номера в каждом ценовом контейнере.
С помощью фильтра сузьте предыдущий результат фасетного запроса после того, как пользователь выберет Рейтинг 3 и категорию "Мотель".
GET /indexes/hotels/docs?search=*&facet=tags&facet=Rooms/BaseRate,values:80|150|220&$filter=Rating eq 3 and Category eq 'Motel'&api-version=2020-06-30
POST /indexes/hotels/docs/search?api-version=2020-06-30 { "search": "test", "facets": [ "tags", "Rooms/BaseRate,values:80|150|220" ], "filter": "Rating eq 3 and Category eq 'Motel'" }
Установка для результатов аспектного поиска верхнего предела на количество уникальных условий поиска, возвращаемых запросом. Значение по умолчанию — 10, но можно увеличить или уменьшить это значение с помощью параметра count в атрибуте аспекта. Этот пример возвращает аспекты для города, ограниченные значением 5.
GET /indexes/hotels/docs?search=*&facet=Address/City,count:5&api-version=2020-06-30
POST /indexes/hotels/docs/search?api-version=2020-06-30 { "search": "test", "facets": [ "Address/City,count:5" ] }
Поиск по индексу в пределах определенных полей (например, поле языка):
GET /indexes/hotels/docs?search=hôtel&searchFields=Description_fr&api-version=2020-06-30
POST /indexes/hotels/docs/search?api-version=2020-06-30 { "search": "hôtel", "searchFields": "Description_fr" }
Поиск в индексе по нескольким полям. Например, в одном индексе можно хранить и искать данные в нескольких доступных для поиска полях на разных языках. Если описания на английском и французском языках сосуществуют в одном документе, в результатах запроса можно вернуть любое или все:
GET /indexes/hotels/docs?search=hotel&searchFields=Description,Description_fr&api-version=2020-06-30
POST /indexes/hotels/docs/search?api-version=2020-06-30 { "search": "hotel", "searchFields": "Description, Description_fr" }
За раз можно запрашивать только индекс. Не создавайте несколько индексов для каждого языка, если вы не планируете запрашивать по одному за раз.
Разбиение по страницам — получение первой страницы элементов (размер страницы составляет 10):
GET /indexes/hotels/docs?search=*&$skip=0&$top=10&api-version=2020-06-30
POST /indexes/hotels/docs/search?api-version=2020-06-30 { "search": "*", "skip": 0, "top": 10 }
Разбиение по страницам — получение второй страницы элементов (размер страницы составляет 10):
GET /indexes/hotels/docs?search=*&$skip=10&$top=10&api-version=2020-06-30
POST /indexes/hotels/docs/search?api-version=2020-06-30 { "search": "*", "skip": 10, "top": 10 }
Получение определенного набора полей.
GET /indexes/hotels/docs?search=*&$select=HotelName,Description&api-version=2020-06-30
POST /indexes/hotels/docs/search?api-version=2020-06-30 { "search": "*", "select": "HotelName, Description" }
Получение документов, соответствующих определенному выражению фильтра.
GET /indexes/hotels/docs?$filter=(Rooms/BaseRate ge 60 and Rooms/BaseRate lt 300) or HotelName eq 'Fancy Stay'&api-version=2020-06-30
POST /indexes/hotels/docs/search?api-version=2020-06-30 { "filter": "(Rooms/BaseRate ge 60 and Rooms/BaseRate lt 300) or HotelName eq 'Fancy Stay'" }
Поиск по индексу и возврат фрагментов с выделением попаданий.
GET /indexes/hotels/docs?search=something&highlight=Description&api-version=2020-06-30
POST /indexes/hotels/docs/search?api-version=2020-06-30 { "search": "something", "highlight": "Description" }
Поиск по индексу и возврат документов, отсортированных по расположению от ближнего к дальнему по отношению к заданному расположению.
GET /indexes/hotels/docs?search=something&$orderby=geo.distance(Location, geography'POINT(-122.12315 47.88121)')&api-version=2020-06-30
POST /indexes/hotels/docs/search?api-version=2020-06-30 { "search": "something", "orderby": "geo.distance(Location, geography'POINT(-122.12315 47.88121)')" }
Выполните поиск по индексу, предполагая, что существует профиль оценки с именем "geo" с двумя функциями оценки расстояния, одна из них определяет параметр с именем "currentLocation", а другая — параметр lastLocation. В следующем примере currentLocation имеет разделитель одного дефиса (
-
). За ним следуют координаты долготы и широты, где долгота является отрицательным значением.GET /indexes/hotels/docs?search=something&scoringProfile=geo&scoringParameter=currentLocation--122.123,44.77233&scoringParameter=lastLocation--121.499,44.2113&api-version=2020-06-30
POST /indexes/hotels/docs/search?api-version=2020-06-30 { "search": "something", "scoringProfile": "geo", "scoringParameters": [ "currentLocation--122.123,44.77233", "lastLocation--121.499,44.2113" ] }
Поиск документов по индексу с использованием синтаксиса простого запроса. Этот запрос возвращает гостиницы, в которых поля, участвующие в поиске, содержат слова comfort и location, но не motel:
Get /indexes/hotels/docs?search=comfort +location –motel&searchMode=all&api-version=22020-06-30
POST /indexes/hotels/docs/search?api-version=2020-06-30 { "search": "comfort +location -motel", "searchMode": "all" }
Совет
Использование
searchMode=all
переопределяет значение по умолчаниюsearchMode=any
, гарантируя, что-motel
означает "AND NOT" вместо "OR NOT". Без параметраsearchMode=all
используется условие "ИЛИ НЕ", которое расширяет, а не сужает результаты поиска, что может показаться неочевидным для некоторых пользователей.Поиск документов в индексе с помощью синтаксиса запросов Lucene). Этот запрос возвращает гостиницы, у которых поле «Категория» содержит термин «бюджет», а все поля для поиска содержат фразу «недавно сделан ремонт». Документам, содержащим слова «недавно сделан ремонт», присваивается более высокая оценка в результате повышенного значения этого термина (3).
GET /indexes/hotels/docs?search=Category:budget AND \"recently renovated\"^3&searchMode=all&api-version=2020-06-30&querytype=full`
POST /indexes/hotels/docs/search?api-version=2020-06-30 { "search": "Category:budget AND \"recently renovated\"^3", "queryType": "full", "searchMode": "all" }
Поиск документов в индексе, предпочитая согласованную оценку по сравнению с более низкой задержкой. Этот запрос вычисляет частоту документов по всему индексу и делает все возможное для того, чтобы ориентироваться на один и тот же реплика для всех запросов в рамках одного и того же сеанса, что помогает создать стабильный и воспроизводимый рейтинг.
GET /indexes/hotels/docs?search=hotel&sessionId=mySessionId&scoringStatistics=global&api-version=2020-06-30
POST /indexes/hotels/docs/search?api-version=2020-06-30 { "search": "hotel", "sessionId": "mySessionId", "scoringStatistics" :"global" }