Как выполнить поиск с разбивкой по страницам в Azure Search с использованием PHP - PullRequest
0 голосов
/ 12 октября 2018

У меня есть этот пример кода 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-го пакета / страницы, так как будет показано top = 15 записей.для следующего пакета / пропуска страницы будет повторяться, например, как 'skip' => 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 Ответ

0 голосов
/ 13 октября 2018

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

Ноесли это невозможно, вы можете использовать API search без «пропуска» и «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;
...