ajax — Практическое руководство. Поиск по страницам в поиске Azure с использованием переполнения стека

У меня есть этот пример кода PHP:

 public function getListFromAzure($searchParam, $listCategory, $request){
$aListingManager = $this->get('recruitday.model_manager.job_listing');
$url = $jobListingManager->getAzureSearchParam($request, 'azure_search_idx');
$apiKey = $jobListingManager->getAzureSearchParam($request, 'azure_key');


$searchParam = preg_replace('/\s+/', '+', $searchParam);
$postdata = json_encode(
array(
'search' => $searchParam,
'filter' => $listCategory,
'orderby'=> 'publishedDate desc',
'facets' => array('locationName','empType', 'workSchedule','listFunction','positionLevel','industry'),
'top' => 15,
)
);



$opts = array(
'http'=>array(
'method'=>"POST",
'header'=>"Content-type: application/json\r\n" .
"api-key: ". $apiKey . "\r\n" .
"Accept: application/json",
'content'=>$postdata
)
);

$context = stream_context_create($opts);

// Open the file using the HTTP headers set above
$file = file_get_contents($url, false, $context);
$file = json_decode($file,true);
return $file;

}

Это прекрасно работает на одном запросе / странице.
Предполагая, что у меня есть 10 000 записей для извлечения, и по одному запросу, поиск Azure имеет ограничение в 1000 записей.
Для этого должны быть заданы параметры поиска Azure $ top — где указывается, сколько элементов нужно вернуть в пакете, а $ skip указывает, сколько элементов пропустить.
вставлен в эту часть кода:

$postdata = json_encode(
array(
'search' => $searchParam,
'filter' => $jobCategory,
'orderby'=> 'publishedDate desc',
'facets' => array('locationName','employmentType', 'workSchedule','jobFunction','positionLevel','industry'),
'top' => 15,
'skip' => 0,
'count' => true
)
);

при условии, что этот запрос будет для 1-го пакета / страницы, так как будет показано 15 лучших записей.
для следующего пакета / пропуска страницы будет повторяться, например, как «пропуск» => 15.

Проблема в том, что я не умею повторять этот параметр. или я должен повторить это? или есть другой способ?
Справочник по параметрам поиска Azure: https://docs.microsoft.com/en-us/azure/search/search-pagination-page-layout

Я думаю о добавлении файла JSON. релевантный поиск: Добавить данные в файл .JSON с помощью PHP

ранее мне показывали 1000 записей. но мне нужно настроить, так как мои записи уже содержат более 1000 записей.
на передней стороне — я звоню через Ajax. затем формируется в HTML.
затем я настраиваю нумерацию страниц через jquery / javascript, превращая их в куски по 20 записей (например) на страницу.

надеюсь, я никого не путаю. заранее спасибо! ура!

Кстати: я использую PHP, Symfony 2.

1

Решение

В идеале вашему внешнему интерфейсу не нужно обрабатывать 10000 записей одновременно, поскольку пользователю трудно управлять таким большим списком и он может очень медленно извлекать такое количество записей. Если возможно, вы также должны сделать внешний интерфейс напрямую разбитым на страницы, в этом случае «top» и «skip» будут переданы из внешнего интерфейса, и код PHP сделает 1 запрос POST с этими параметрами.

Но если это невозможно, вы можете использовать поиск API без «skip» и «top» для первого запроса, а затем следуйте цепочке nextPageParameters. Затем добавьте значение из каждой страницы в 1 массив и верните его в интерфейс.

// $file = file_get_contents($url, false, $context); // without "top" and "skip"// $file = json_decode($file,true);

$values = array();
while (True)
{
// get values from current page
$values = array_merge($array, $file["value"]);

// stop if there are no more pages
if (!array_key_exists("@search.nextPageParameters", $file))
{
break;
}

// get next page
$postdata = $file["@search.nextPageParameters"];
$opts = array(
'http'=>array(
'method'=>"POST",
'header'=>"Content-type: application/json\r\n" .
"api-key: ". $apiKey . "\r\n" .
"Accept: application/json",
'content'=>$postdata
)
);
$context = stream_context_create($opts);
$file = file_get_contents($url, false, $context);
$file = json_decode($file, true);
}
return $values;
0

Другие решения

Других решений пока нет …