Get personalized browse results

Browsing is a navigational search that has no query. Browsing uses navigationalmethods to display search results that match the end user's selected categoriesor filters. When used in collaboration with user engagement, you can offer youruserspersonalized browsing. Personalized browsing provides real-time,user-specific feeds based on user interaction history and content features. Itaims to optimize search results for defined KPIs while adhering to yourstrategic controls. For example, a real-estate website can get differenthomepages for its users in London, UK, and in Sydney, Australia; a shoppingwebsite can cater tailor-made results depending upon the user profile.

This page describes how to get browse results for custom search data storesand some best practices to set up your search app.

About personalized browse

The Vertex AI Search personalized browse uses neural networks torankdocuments based on predicted userengagement and conversion. For example, with personalized browsing, you canserve ranked entries in a hotel catalog or articles in a website and return themto the users based on predicted likelihood of clicks or inquiry.

At its core, personalized browse is a sophisticated model that learns theintricate relationships between user navigation patterns, the contents andfeatures of your documents, and user conversion events. Some important featuresare as follows:

  • Ranking: The model ranks items based on predicted performance against yourdefined objective that's subject to the configured search parameters, such asfilters, custom ranking, and serving controls (like boost, promote, orsynonyms).

  • Training and refining: After the initial training, the model is continuouslyrefined using live, user-event streams. The model adapts and improves over time.

  • Diversity: The model implicitly learns about diversity because it recordsnegative signals from non-interaction, such as ignored links, time spent on apage, and jump rates.

How browse differs from search

The following table presents the differences between searching and browsing.

FeatureSearchBrowse
PurposeFind specific informationExplore and discover content
ExampleSearching for "best Koreanrestaurants in Vancouver"on Google SearchBrowsing for a restaurant based on thecategories where it might belong,such as "Restaurants > Korean >Vancouver > 4 star and above"
UserIntentTypically goal-orientedExploratory
StartingpointA query or keywordtypically in a search barA specific website or platform typicallyusing a menu, breadcrumbs, links, orother navigation methods like facets
MethodEntering keywords orphrases and applyingsearch and servingconfigurationSearching with an empty query, applyingsearch and serving configuration
ResultsA list of relevant resultsAll the documents in the data store thatmatch the filters

Workflow and best practices

Personalized browse is a Google-managed service and Google handles theunderlying deep learning models and data pipelines. To get the best out of thisservice, when you develop your search app, your primary technicalresponsibilities include the following:

  • Data provisioning: Collect and supply a comprehensive data store of documentsand user events.
  • Objective definition: Specify KPIs for optimization, such as click-throughrate (CTR), high-value actions, and revenue per session with the provided userevents. Make sure that the types of user events that you collect support theobjectives.
  • Search parameters: Define and configure search parameters and servingcontrols in your search request. For example, date ranges to filter thelistings or articles that are allowed or boost controls to reorder blogsaccording to their ratings.

In a Vertex AI Search search app, to browse is to search withno query or an empty query. To get browse results, in a custom search datastore, you can call thesearch method leaving the query empty.

Broadly, these are the steps to get the best results for personalized browse:

  1. Have correct and consistent data:

    • Accurate timestamp for every user event.
    • Consistent user IDs across all user events.
    • Document IDs that match between user events and the data store. If you'reusing a sitemap, then its URLs must match the URLs in the user events.
    • Filters to serve the exact content on your browsed pages.For more information, seeFilter website search andFilter custom search for structured and unstructured data.
  2. Prepare and ingest your documents:

  3. Prepare and ingest user events:

    • Prepare at least 30 days of user events for the initial model training.You can use either or bothhistorical user events anduser events in real time..Real-time events yield better personalization results.
    • Record and share thesearch event (used to capture browse data),theview-item event, and theconversion event.
    • All user events must include the following:
      • eventType such assearch for search andbrowse,view-item, andconversion.
      • userPseudoId, which is a consistent pseudonymized useridentifier.
      • eventTime, which is an ISO 8601 timestamp (UTC) for whenthe event was recorded.
      • documents.idshown in the order they appear to the userthat matches document IDs.
      • searchInfo.searchQuery to register the user's searchquery.
      • pageInfo.pageCategory that adds a context, such as"HomepageCarousel", "Properties > VIC > Richmond".
      • filter that describes the filter logic used to generatethe impression list. This is often captured by thepageCategoryfield or through system understanding.

    For more information, seeuserEvents.

  4. Enable model training and model pipeline:

    After preparing your data and gathering the user events, contact your GoogleCustomer Engineer (CE). The CE can review your data and activate thepersonalization model for your app.

  5. Get personalized browse results

    Add more fields to your search request like filters and ranking adjustments,such as boost or custom ranking.

  6. Maintain and keep your data fresh:

    Over time, keep your the documents in your data store up-to-date and keepuploading fresh user events. This ensures the model can access the latestdocuments and user interactions for personalized results.

Get browse results for an app with website data

To use the API to get browse results for an app with website data, do thefollowing:

  1. Find your app ID. If you already have your app ID, skip to the next step.

    1. In the Google Cloud console, go to theAI Applications page.

      Go to Apps

    2. On theApps page, find the name of your app and get the app's ID fromtheID column.

  2. Call theengines.servingConfigs.search method with anempty query or no query as follows:

    REST

    Key Term: In Vertex AI Search, the termapp can be used interchangeably with the termengine in the context of APIs.
    curl-XPOST-H"Authorization: Bearer$(gcloudauthprint-access-token)"\-H"Content-Type: application/json"\"https://discoveryengine.googleapis.com/v1/projects/PROJECT_ID/locations/global/collections/default_collection/engines/APP_ID/servingConfigs/default_search:search"\-d'{"servingConfig": "projects/PROJECT_ID/locations/global/collections/default_collection/engines/APP_ID/servingConfigs/default_search","orderBy": "ORDER_BY","params": {     "searchType": "0" },"filter": "FILTER","boostSpec": "BOOST_SPEC",}'

    Replace the following:

    You should receive a JSON response similar to the following truncated response.The response contains itemized search results listed in the order that'sdetermined by the fields set in the search request.

    Response

    {"results": [  {    "id": "DOCUMENT_ID",    "document": {      "name": "projects/PROJECT_ID/locations/global/collections/default_collection/dataStores/DATA_STORE_ID/branches/0/documents/DOCUMENT_ID",      "id": "DOCUMENT_ID",      "structData": {},      "derivedStructData": {        "displayLink": "LINK_TO_BE_DISPLAYED",        "link": "DOCUMENT_URL",        …      }    }  },  {    "id": "DOCUMENT_ID",    "document": {      "name": "projects/PROJECT_ID/locations/global/collections/default_collection/dataStores/DATA_STORE_ID/branches/0/documents/DOCUMENT_ID",      "id": "DOCUMENT_ID",      "structData": {},      "derivedStructData": {        "displayLink": "LINK_TO_BE_DISPLAYED",        "link": "DOCUMENT_URL",        …      }    }  }  …]}