Introdução ao Retail Search - Consultas

 


O método search() da API Retail é usado para pesquisar no catálogo de acordo com a consulta de pesquisa e outros parâmetros, como filter, facet ou order_by.

Por padrão, a resposta da pesquisa contém o número razoável de resultados ordenados por relevância.

O Retail realiza a pesquisa com base no título do produto e em outros atributos do produto pesquisáveis.

O objeto de produto tem um system attributes predefinido, como:

  • brand
  • color_families
  • category
  • size

Também é possível definir o custom attributes e torná-lo pesquisável.

A solicitação de uma pesquisa simples contém apenas os seguintes campos obrigatórios:

  • placement: um nome de recurso da posição do mecanismo de pesquisa.
  • visitor_id: um identificador exclusivo para acompanhar visitantes.
  • query: uma frase ou consulta(palavra) de pesquisa bruta.

A resposta da pesquisa contém estes elementos:

  • results são os itens correspondentes retornados pelo serviço de pesquisa do Retail.
  • totalSize é a contagem total estimada dos itens correspondentes.
  • attributionToken é um token de pesquisa exclusivo que permite a atribuição precisa do desempenho do modelo de pesquisa.
  • nextPageToken é um token que encaminha para a próxima página na resposta da pesquisa. Por padrão, o número de produtos por página é 100. Se esse campo for omitido, não haverá páginas subsequentes.

Exemplo de código:

import google.auth
from google.cloud.retail import SearchRequest, SearchServiceClient

project_id = google.auth.default()[1]

# get search service request:
def get_search_request(query: str):
    default_search_placement = (
        "projects/"
        + project_id
        + "/locations/global/catalogs/default_catalog/placements/default_search"
    )

    search_request = SearchRequest()
    search_request.placement = default_search_placement  # Placement is used to identify the Serving Config name.
    search_request.query = query
    search_request.visitor_id = "99999"  # A unique identifier to track visitors
    search_request.page_size = 10

    print("---search request:---")
    print(search_request)

    return search_request

# call the Retail Search:
def search():
    # TRY DIFFERENT QUERY PHRASES HERE:
    query_phrase = "Casaco"

    search_request = get_search_request(query_phrase)
    search_response = SearchServiceClient().search(search_request)

    print("---search response---")
    print(search_response)
    return search_response

search()

É possível navegar entre os resultados retornados através de paginações, há três campos na solicitação de pesquisa que oferecem todas as possibilidades de navegar pelos resultados da pesquisa:

page_size  - next_page_token  - offset

Exemplo de código com paginação:

import google.auth
from google.cloud.retail import SearchRequest, SearchServiceClient

project_id = google.auth.default()[1]

# get search service request:
def get_search_request(query: str, page_size: int, offset: int, next_page_token: str):
    default_search_placement = (
        "projects/"
        + project_id
        + "/locations/global/catalogs/default_catalog/placements/default_search"
    )

    search_request = SearchRequest()
    search_request.placement = default_search_placement
    search_request.visitor_id = "999999"  # A unique identifier to track visitors
    search_request.query = query
    search_request.page_size = page_size
    search_request.offset = offset
    search_request.page_token = next_page_token

    print("---search request:---")
    print(search_request)

    return search_request

# call the Retail Search:
def search():
    # TRY DIFFERENT PAGINATION PARAMETERS HERE:
    page_size = 6
    offset = 0
    page_token = ""

    search_request_first_page = get_search_request(
        "Chinelo", page_size, offset, page_token
    )
    search_response_first_page = SearchServiceClient().search(search_request_first_page)

    print("---search response---")
    print(search_response_first_page)

    return search_response_first_page

search()

Dependendo do catálogo de produtos é possível que ao cliente navegar pelo site não encontre o produto desejado por falta de “precisão”.

Exemplo: O cliente não lembra o modelo exato de um celular(Motorola G8) e pesquisa por um similar(Motorola G7) a pesquisa retornaria somente o modelo pesquisado, podendo fazer o cliente abandonar a buscar por não achar o modelo certo. Isso pode ser resolvido ao utilizar uma Expansão de consulta, com isso também aparecerá os outros modelos similares ao pesquisado.

Exemplo de código:

import google.auth
from google.cloud.retail import SearchRequest, SearchServiceClient

project_id = google.auth.default()[1]

# get search service request:
def get_search_request(
    query: str, condition: SearchRequest.QueryExpansionSpec.Condition
):
    default_search_placement = (
        "projects/"
        + project_id
        + "/locations/global/catalogs/default_catalog/placements/default_search"
    )

    query_expansion_spec = SearchRequest().QueryExpansionSpec()
    query_expansion_spec.condition = condition

    search_request = SearchRequest()
    search_request.placement = default_search_placement  # Placement is used to identify the Serving Config name.
    search_request.query = query
    search_request.visitor_id = "99999"  # A unique identifier to track visitors
    search_request.query_expansion_spec = query_expansion_spec
    search_request.page_size = 10

    print("---search request:---")
    print(search_request)

    return search_request

# call the Retail Search:
def search():
    # TRY DIFFERENT QUERY EXPANSION CONDITION HERE:
    condition = SearchRequest.QueryExpansionSpec.Condition.AUTO

    search_request = get_search_request("Chinelo Azul", condition)
    search_response = SearchServiceClient().search(search_request)

    print("---search response---")
    print(search_response)
    return search_response

search()

Também é possível dar um “peso” em produto sobre o outro, por exemplo, o cliente está procurando por garrafas de água e deseja que as garrafas de 500ml estejam priorizadas no retorno da consulta em relação as garrafas de 2lts. Para isso podemos usar otimizações de pesquisa ou boost spec.

Exemplo de código:

import google.auth
from google.cloud.retail import SearchRequest, SearchServiceClient

project_id = google.auth.default()[1]

# get search service request:
def get_search_request(query: str, condition: str, boost_strength: float):
    default_search_placement = (
        "projects/"
        + project_id
        + "/locations/global/catalogs/default_catalog/placements/default_search"
    )

    condition_boost_spec = SearchRequest.BoostSpec.ConditionBoostSpec()
    condition_boost_spec.condition = condition
    condition_boost_spec.boost = boost_strength

    boost_spec = SearchRequest.BoostSpec()
    boost_spec.condition_boost_specs = [condition_boost_spec]

    search_request = SearchRequest()
    search_request.placement = default_search_placement  # Placement is used to identify the Serving Config name.
    search_request.query = query
    search_request.visitor_id = "9999999"  # A unique identifier to track visitors
    search_request.boost_spec = boost_spec
    search_request.page_size = 10

    print("---search request---")
    print(search_request)

    return search_request

# call the Retail Search:
def search():
    # TRY DIFFERENT CONDITIONS HERE:
    condition = '(colorFamilies: ANY("Azul"))'
    boost = 10.0

    search_request = get_search_request("Camiseta", condition, boost)
    search_response = SearchServiceClient().search(search_request)
    print("---search response---")
    print(search_response)
    return search_response

search()
# [END retail_search_product_with_boost_spec]

Referências:

https://cloud.google.com/retail/docs/search-basic?hl=pt-br#querying_tutorial