Как исправить подкачку с помощью top и пропустить в Azure Search? - PullRequest
0 голосов
/ 20 марта 2019

Согласно этому документу Всего просмотров и числа страниц , если я хочу реализовать разбиение на страницы, я должен объединить пропуск и верх в моем запросе.

Ниже приведен мой запрос POST

{
  "count": true ,
  "search": "apple",
  "searchFields": "content",
  "select": "itemID, content",
  "searchMode": "all",
  "queryType":"full",
  "skip": 100,
  "top":100

}

Он должен возвращать что-то вроде от 100 -> 200

{
"@odata.context": "https://example.search.windows.net/indexes('example-index-')/$metadata#docs(*)",
"@odata.count": 1611,
"@search.nextPageParameters": {
    "count": true,
    "search": "apple",
    "searchFields": "content",
    "select": "itemID, content",
    "searchMode": "all",
    "queryType": "full",
    "skip": 200
},

Но он просто возвращает топ 100, а не смещение на пейджинг до 100

 "@odata.context": "https://example.search.windows.net/indexes('example-index')/$metadata#docs(*)",
"@odata.count": 1611,

Есть личто-нибудь, что я должен настроить?

Ответы [ 2 ]

1 голос
/ 21 марта 2019

Краткий ответ о том, как реализовать пейджинг (из этой статьи ): установите top на нужный размер страницы, затем увеличивайте skip на этот размер страницы при каждом запросе.Вот пример того, как это будет выглядеть с REST API с использованием GET:

GET /indexes/onlineCatalog/docs?search=*$top=15&$skip=0
GET /indexes/onlineCatalog/docs?search=*$top=15&$skip=15
GET /indexes/onlineCatalog/docs?search=*$top=15&$skip=30

Документация REST API также описывает, как реализовать разбиение на страницы, а также истинную цель @odata.nextLink и @search.nextPageParameters (также рассматривается в этот связанный вопрос ).

Цитирование из справочника API:

Продолжение ответов частичного поиска

Иногда Поиск Azure не может вернуть все запрошенные результаты в одном поисковом ответе.Это может произойти по разным причинам, например, когда запрос запрашивает слишком много документов, не указав $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,и т. д.

0 голосов
/ 22 марта 2019

Следующий пример - метод Get без top.

Метод GET

https://example.search.windows.net/indexes('example-content-index-zh')/docs?api-version=2017-11-11&search=2018&$count=true&$skip=150&select=itemID

Результат:

{
"@odata.context": "https://example.search.windows.net/indexes('example-index-zh')/$metadata#docs(*)",
"@odata.count": 133063,
"value": [ //skip value ],
"@odata.nextLink": "https://example.search.windows.net/indexes('example-content-index-zh')/docs?api-version=2017-11-11&search=2018&$count=true&$skip=150"
} 

Независимо от того, что я использую post или get, только добавленные мной слова $ top = # @odata.nextLink не будут отображаться в результате.

Наконец, я выяснил, хотя @odata.nextLink или @search.nextPageParameters не будет отображаться. Но пейджинг работает, я должен считать себя.

...