如何:使用PHP在Azure搜索中进行分页搜索

时间:2018-10-12 08:03:27

标签: php ajax azure azure-search

我有以下示例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。

1 个答案:

答案 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;