我有以下示例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条记录,并且在一个查询中,天蓝色搜索限制为1000条记录。 这应该带有天青搜索参数$ 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
)
);
假设,此查询将针对第一个批次/页面,因为将显示top = 15条记录。 对于下一个批次/页面,跳过将例如迭代为'skip'=> 15。
问题是我没有如何迭代此参数。还是应该迭代一下?还是有另一种方法? 天青搜索参数参考:https://docs.microsoft.com/en-us/azure/search/search-pagination-page-layout
我正在考虑附加json文件。相关搜索:Append data to a .JSON file with PHP
以前,我显示了1000条记录。但是我需要进行调整,因为我的记录已经有1000多个记录。 在前端-我通过ajax称呼它。然后形成HTML。 然后我通过jquery / javascript调整分页,将其分成每页20个记录的块(例如)。
希望我不会混淆任何人。先感谢您!欢呼!
btw:我正在使用PHP,Symfony 2。
答案 0 :(得分:0)
理想情况下,您的前端不需要一次处理10000条记录,因为用户很难管理这么大的列表,并且检索这么多记录可能非常慢。如果可能的话,您也应该直接对前端进行分页,在这种情况下,将从您的前端传递“ top”和“ skip”,并且PHP代码使用这些参数发出1个POST请求。
但是,如果这不可能,则可以对第一个请求使用不带“ skip”和“ top”的search API,然后遵循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;