CtrlK
BlogDocsLog inGet started
Tessl Logo

tessl/pypi-google-cloud-retail

Python client library for Google Cloud Retail API enabling end-to-end personalized recommendation systems

Pending
Overview
Eval results
Files

search-discovery.mddocs/

Search and Discovery

Search functionality with advanced filtering, faceting, ranking, and query auto-completion capabilities. The Search Service provides intelligent product discovery with personalization, spell correction, and comprehensive result customization.

Capabilities

Product Search

Core search functionality for finding products based on user queries with advanced filtering and ranking.

class SearchServiceClient:
    def search(self, request: SearchRequest) -> SearchResponse:
        """
        Performs product search with comprehensive filtering and ranking options.
        
        Args:
            request: Search parameters including query, filters, facets, and personalization
            
        Returns:
            SearchResponse: Search results with products, facets, corrected query, and metadata
            
        Raises:
            InvalidArgument: If search parameters are invalid
            PermissionDenied: If placement is not accessible
        """

Query Auto-completion

Intelligent query suggestions and auto-completion to enhance search experience.

class CompletionServiceClient:
    def complete_query(self, request: CompleteQueryRequest) -> CompleteQueryResponse:
        """
        Provides query auto-completion suggestions based on catalog data and user behavior.
        
        Args:
            request: Contains catalog path, query prefix, and completion parameters
            
        Returns:
            CompleteQueryResponse: Completion suggestions with attribution metadata
            
        Raises:
            InvalidArgument: If completion parameters are invalid
        """

class SearchServiceAsyncClient:
    async def search(self, request: SearchRequest) -> SearchResponse:
        """Async version of search."""

class CompletionServiceAsyncClient:
    async def complete_query(self, request: CompleteQueryRequest) -> CompleteQueryResponse:
        """Async version of complete_query."""

Data Types

Search Request

Comprehensive search request with query, filtering, faceting, and personalization options.

class SearchRequest:
    placement: str  # Placement resource name (required)
    branch: str  # Catalog branch to search
    query: str  # Search query text
    visitor_id: str  # Unique visitor identifier for personalization
    user_info: UserInfo  # User context information
    page_size: int  # Maximum results per page (default: 100, max: 1000)
    page_token: str  # Token for pagination
    offset: int  # Number of results to skip
    filter: str  # Filter expression for products
    canonical_filter: str  # Canonical filter for consistent results
    order_by: str  # Sort order specification
    facet_specs: List[FacetSpec]  # Faceting configuration
    dynamic_facet_spec: SearchRequestDynamicFacetSpec  # Dynamic facet generation
    boost_spec: SearchRequestBoostSpec  # Result boosting configuration
    query_expansion_spec: SearchRequestQueryExpansionSpec  # Query expansion settings
    variant_rollup_keys: List[str]  # Keys for variant product rollup
    page_categories: List[str]  # Page context categories
    search_mode: SearchMode  # PRODUCT_SEARCH_ONLY or FACETED_SEARCH_ONLY
    personalization_spec: SearchRequestPersonalizationSpec  # Personalization settings
    labels: Dict[str, str]  # Custom labels for analytics
    spell_correction_spec: SearchRequestSpellCorrectionSpec  # Spell correction settings

Search Response

Comprehensive search results with products, facets, analytics, and metadata.

class SearchResponse:
    results: List[SearchResponseSearchResult]  # Search results with products
    facets: List[SearchResponseFacet]  # Facet results for filtering
    total_size: int  # Total number of matching products
    corrected_query: str  # Spell-corrected version of query
    attribution_token: str  # Token for result attribution
    next_page_token: str  # Token for next page of results
    query_expansion_info: SearchResponseQueryExpansionInfo  # Query expansion details
    redirect_uri: str  # Redirect URL if applicable
    applied_controls: List[str]  # Applied business rules/controls
    invalid_condition_boost_specs: List[SearchRequestBoostSpecConditionBoostSpec]  # Invalid boost conditions
    experiment_info: List[ExperimentInfo]  # A/B test experiment information
    personalization_info: SearchResponsePersonalizationInfo  # Personalization details

Search Result

Individual search result containing product information and metadata.

class SearchResponseSearchResult:
    id: str  # Product ID
    product: Product  # Full product information
    matching_variant_count: int  # Number of matching variants
    matching_variant_fields: Dict[str, FieldMask]  # Matching variant field details
    variant_rollup_values: Dict[str, Value]  # Rolled-up variant values
    personal_labels: List[str]  # Personalized labels for this result

Faceting

Configuration and results for search faceting functionality.

class FacetSpec:
    facet_key: FacetKeySpec  # Facet key configuration
    limit: int  # Maximum facet values to return
    excluded_filter_keys: List[str]  # Filter keys to exclude from facet counts
    enable_dynamic_position: bool  # Enable dynamic facet positioning
    
class FacetKeySpec:
    key: str  # Facet key (attribute name or predefined key)
    intervals: List[Interval]  # Numeric intervals for numeric facets
    restricted_values: List[str]  # Restrict facet to specific values
    prefixes: List[str]  # Prefix matching for text facets
    contains: List[str]  # Substring matching for text facets
    case_insensitive: bool  # Case-insensitive matching
    order_by: str  # Facet value ordering
    query: str  # Query for facet value filtering
    return_min_max: bool  # Return min/max values for numeric facets

class SearchResponseFacet:
    key: str  # Facet key
    values: List[SearchResponseFacetFacetValue]  # Facet values and counts
    dynamic_facet: bool  # Whether this is a dynamically generated facet

class SearchResponseFacetFacetValue:
    value: str  # Facet value
    count: int  # Number of products with this facet value
    interval: Interval  # Interval for numeric facets
    min_value: float  # Minimum value for numeric facets
    max_value: float  # Maximum value for numeric facets

Completion Request and Response

Query auto-completion configuration and results.

class CompleteQueryRequest:
    catalog: str  # Catalog resource name (required)
    query: str  # Query prefix for completion (required)
    visitor_id: str  # Unique visitor identifier
    language_codes: List[str]  # Preferred completion languages
    device_type: str  # Device type (DESKTOP, MOBILE, TABLET)
    dataset: str  # Dataset for completion suggestions
    max_suggestions: int  # Maximum suggestions to return (default: 20)

class CompleteQueryResponse:
    completion_results: List[CompleteQueryResponseCompletionResult]  # Completion suggestions
    attribution_token: str  # Token for attribution
    recent_search_results: List[CompleteQueryResponseRecentSearchResult]  # Recent searches

class CompleteQueryResponseCompletionResult:
    suggestion: str  # Completion suggestion text
    attributes: Dict[str, CustomAttribute]  # Additional attributes

class CompleteQueryResponseRecentSearchResult:
    recent_search: str  # Recent search query

Personalization and User Context

User information and personalization settings for search customization.

class UserInfo:
    user_id: str  # Persistent user identifier
    ip_address: str  # User IP address for geo-targeting
    user_agent: str  # User agent string
    direct_user_request: bool  # Whether request is directly from user

class SearchRequestPersonalizationSpec:
    mode: PersonalizationSpecMode  # AUTO, DISABLED
    
class SearchResponsePersonalizationInfo:
    personalization_mode: PersonalizationSpecMode  # Applied personalization mode
    user_id: str  # User ID used for personalization

Boosting and Ranking

Configuration for result boosting and custom ranking.

class SearchRequestBoostSpec:
    condition_boost_specs: List[SearchRequestBoostSpecConditionBoostSpec]  # Conditional boosting
    skip_boost_spec_validation: bool  # Skip boost validation

class SearchRequestBoostSpecConditionBoostSpec:
    condition: str  # Boost condition expression
    boost: float  # Boost multiplier

Query Processing

Query expansion and spell correction configuration.

class SearchRequestQueryExpansionSpec:
    condition: QueryExpansionSpecCondition  # AUTO, DISABLED
    pin_unexpanded_results: bool  # Pin original results

class SearchRequestSpellCorrectionSpec:
    mode: SpellCorrectionSpecMode  # AUTO, DISABLED

class SearchResponseQueryExpansionInfo:
    expanded_query: bool  # Whether query was expanded
    pinned_result_count: int  # Number of pinned unexpanded results

Usage Examples

Basic Product Search

from google.cloud import retail

client = retail.SearchServiceClient()

# Basic search with query
request = retail.SearchRequest(
    placement="projects/my-project/locations/global/catalogs/default_catalog/placements/search",
    query="gaming laptop",
    page_size=20,
    visitor_id="visitor-123"
)

response = client.search(request=request)

print(f"Found {response.total_size} products")
for result in response.results:
    product = result.product
    print(f"- {product.title} (${product.price_info.price})")

Advanced Search with Filtering and Faceting

# Advanced search with filters, facets, and personalization
request = retail.SearchRequest(
    placement="projects/my-project/locations/global/catalogs/default_catalog/placements/search",
    query="laptop",
    filter='(categories: ANY("Electronics", "Computers")) AND (price_info.price: [200, 2000])',
    facet_specs=[
        retail.SearchRequest.FacetSpec(
            facet_key=retail.SearchRequest.FacetSpec.FacetKey(
                key="brands"
            ),
            limit=10
        ),
        retail.SearchRequest.FacetSpec(
            facet_key=retail.SearchRequest.FacetSpec.FacetKey(
                key="price_info.price",
                intervals=[
                    retail.Interval(minimum=0, maximum=500),
                    retail.Interval(minimum=500, maximum=1000),
                    retail.Interval(minimum=1000, maximum=2000),
                    retail.Interval(minimum=2000)
                ]
            )
        ),
        retail.SearchRequest.FacetSpec(
            facet_key=retail.SearchRequest.FacetSpec.FacetKey(
                key="attributes.screen_size"
            ),
            limit=5
        )
    ],
    order_by="price_info.price desc",
    visitor_id="visitor-123",
    user_info=retail.UserInfo(
        user_id="user-456",
        ip_address="192.168.1.100"
    )
)

response = client.search(request=request)

print(f"Search Results: {len(response.results)} of {response.total_size}")
print(f"Corrected query: {response.corrected_query}")

# Display products
for result in response.results:
    product = result.product
    print(f"- {product.title}")
    print(f"  Price: ${product.price_info.price}")
    print(f"  Brand: {', '.join(product.brands)}")
    print(f"  Categories: {', '.join(product.categories)}")

# Display facets
print("\nFacets:")
for facet in response.facets:
    print(f"\n{facet.key}:")
    for value in facet.values[:5]:  # Show top 5 values
        print(f"  {value.value} ({value.count})")

Search with Boosting

# Search with conditional boosting for promoted products
boost_spec = retail.SearchRequest.BoostSpec(
    condition_boost_specs=[
        retail.SearchRequest.BoostSpec.ConditionBoostSpec(
            condition='(tags: ANY("promoted"))',
            boost=2.0  # Double the relevance score
        ),
        retail.SearchRequest.BoostSpec.ConditionBoostSpec(
            condition='(brands: ANY("TechBrand"))',
            boost=1.5  # 1.5x boost for preferred brand
        )
    ]
)

request = retail.SearchRequest(
    placement="projects/my-project/locations/global/catalogs/default_catalog/placements/search",
    query="laptop",
    boost_spec=boost_spec,
    visitor_id="visitor-123"
)

response = client.search(request=request)

Query Auto-completion

completion_client = retail.CompletionServiceClient()

# Get query suggestions
request = retail.CompleteQueryRequest(
    catalog="projects/my-project/locations/global/catalogs/default_catalog",
    query="gam",  # User has typed "gam"
    max_suggestions=10,
    visitor_id="visitor-123"
)

response = completion_client.complete_query(request=request)

print("Completion suggestions:")
for result in response.completion_results:
    print(f"- {result.suggestion}")

print("\nRecent searches:")
for recent in response.recent_search_results:
    print(f"- {recent.recent_search}")

Personalized Search

# Search with enhanced personalization
personalization_spec = retail.SearchRequest.PersonalizationSpec(
    mode=retail.SearchRequest.PersonalizationSpec.Mode.AUTO
)

request = retail.SearchRequest(
    placement="projects/my-project/locations/global/catalogs/default_catalog/placements/search",
    query="laptop",
    visitor_id="visitor-123",
    user_info=retail.UserInfo(
        user_id="user-456",
        ip_address="192.168.1.100",
        user_agent="Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36"
    ),
    personalization_spec=personalization_spec
)

response = client.search(request=request)

# Check personalization details
if response.personalization_info:
    print(f"Personalization mode: {response.personalization_info.personalization_mode}")
    print(f"User ID: {response.personalization_info.user_id}")

Install with Tessl CLI

npx tessl i tessl/pypi-google-cloud-retail

docs

advanced-features.md

ai-recommendations.md

analytics-export.md

catalog-config.md

index.md

product-management.md

search-discovery.md

user-events.md

tile.json