首页 > 解决方案 > 谷歌云人才解决方案:如何使用 page_token

问题描述

我正在尝试使用 GCTS 的 v4beta1 - search_jobs()

文档: https ://cloud.google.com/talent-solution/job-search/docs/reference/rest/v4beta1/projects.jobs/search

有对参数的引用,pageToken但在\google\cloud\talent_v4beta1\gapic\job_service_client.py函数定义中没有这样的参数:

def search_jobs(
    self,
    parent,
    request_metadata,
    search_mode=None,
    job_query=None,
    enable_broadening=None,
    require_precise_result_size=None,
    histogram_queries=None,
    job_view=None,
    offset=None,
    page_size=None,
    order_by=None,
    diversification_level=None,
    custom_ranking_info=None,
    disable_keyword_match=None,
    retry=google.api_core.gapic_v1.method.DEFAULT,
    timeout=google.api_core.gapic_v1.method.DEFAULT,
    metadata=None,
):

在评论page_token中提到 - 例如对于Offset参数。

如何为职位搜索指定页面令牌?

我已指定require_precise_result_size=False但返回值不包含SearchJobsResponse.estimated_total_size. 这search_jobs()是未设置为所需“模式”的线索吗?

标签: pythongoogle-cloud-talent-solution

解决方案


我相信 python 客户端库为您抽象出了 pageToken。如果您深入到源代码中 search_jobs 方法的末尾,您将看到它构建了一个知道 pageToken 和 nextPageToken 字段的迭代器:

        iterator = google.api_core.page_iterator.GRPCIterator(
        client=None,
        method=functools.partial(
            self._inner_api_calls["search_jobs"],
            retry=retry,
            timeout=timeout,
            metadata=metadata,
        ),
        request=request,
        items_field="matching_jobs",
        request_token_field="page_token",
        response_token_field="next_page_token",
    )
    return iterator

因此,您需要做的就是以下内容 - 从https://googleapis.github.io/google-cloud-python/latest/talent/gapic/v4beta1/api.html的文档中复制:

from google.cloud import talent_v4beta1

client = talent_v4beta1.JobServiceClient()
parent = client.tenant_path('[PROJECT]', '[TENANT]')

# TODO: Initialize `request_metadata`:
request_metadata = {}

# Iterate over all results
for element in client.search_jobs(parent, request_metadata):
    # process element
    pass


# Alternatively:
# Iterate over results one page at a time
for page in client.search_jobs(parent, request_metadata).pages:
    for element in page:
        # process element
        pass

默认页面大小显然是 10,您可以使用 pageSize 参数对其进行修改。页面迭代器文档可以在这里找到:

文档:https ://googleapis.github.io/google-cloud-python/latest/core/page_iterator.html

来源:https ://googleapis.github.io/google-cloud-python/latest/_modules/google/api_core/page_iterator.html#GRPCIterator

可能最简单的处理方法是使用所有结果

allResults = list(results_iterator)

如果您有大量数据并且不想一次性翻页,我会执行以下操作。“.pages”只是返回一个您可以照常使用的生成器。

resultsIterator = client.search_jobs(parent, request_metadata)
pages = resultsIterator.pages
currentPageIter = next(pages)
#do work with page
currentItem = next(currentPageIter)

currentPageIter = next(pages)
# etc...

当您用完项目或页面时,您需要捕获 StopIteration 错误:

https://anandology.com/python-practice-book/iterators.html

这就是为什么:

def _page_iter(self, increment):
    """Generator of pages of API responses.

    Args:
        increment (bool): Flag indicating if the total number of results
            should be incremented on each page. This is useful since a page
            iterator will want to increment by results per page while an
            items iterator will want to increment per item.

    Yields:
        Page: each page of items from the API.
    """
    page = self._next_page()
    while page is not None:
        self.page_number += 1
        if increment:
            self.num_results += page.num_items
        yield page
        page = self._next_page()

看看它在 yield 之后如何调用 _next_page?这将检查更多页面,然后为您执行另一个请求(如果存在)。

def _next_page(self):
    """Get the next page in the iterator.

    Returns:
        Page: The next page in the iterator or :data:`None` if
            there are no pages left.
    """
    if not self._has_next_page():
        return None

    if self.next_page_token is not None:
        setattr(self._request, self._request_token_field, self.next_page_token)

    response = self._method(self._request)

    self.next_page_token = getattr(response, self._response_token_field)
    items = getattr(response, self._items_field)
    page = Page(self, items, self.item_to_value)

    return page

如果您想要一个无会话选项,您可以使用偏移量 + 页面大小并在每个 ajax 请求上将当前偏移量传递给用户:

偏移量(整数)-</p>

可选的。一个整数,指定搜索结果中的当前偏移量(即起始结果位置,在 API 认为相关的工作中)。仅当 page_token 未设置时才考虑此字段。

例如,0 表示从第一个匹配的作业开始返回结果,10 表示从第 11 个作业返回。这可以用于分页,(例如,pageSize = 10 和 offset = 10 表示从第二页返回)。


推荐阅读