UNPKG

@google-cloud/retail

Version:
887 lines 92.1 kB
"use strict"; // Copyright 2026 Google LLC // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // https://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // // ** This file is automatically generated by gapic-generator-typescript. ** // ** https://github.com/googleapis/gapic-generator-typescript ** // ** All changes to this file may be overwritten. ** Object.defineProperty(exports, "__esModule", { value: true }); exports.SearchServiceClient = void 0; const jsonProtos = require("../../protos/protos.json"); const google_gax_1 = require("google-gax"); /** * Client JSON configuration object, loaded from * `src/v2alpha/search_service_client_config.json`. * This file defines retry strategy and timeouts for all API methods in this library. */ const gapicConfig = require("./search_service_client_config.json"); const version = require('../../../package.json').version; /** * Service for search. * * This feature is only available for users who have Retail Search enabled. * Enable Retail Search on Cloud Console before using this feature. * @class * @memberof v2alpha */ class SearchServiceClient { _terminated = false; _opts; _providedCustomServicePath; _gaxModule; _gaxGrpc; _protos; _defaults; _universeDomain; _servicePath; _log = google_gax_1.loggingUtils.log('retail'); auth; descriptors = { page: {}, stream: {}, longrunning: {}, batching: {}, }; warn; innerApiCalls; locationsClient; pathTemplates; operationsClient; searchServiceStub; /** * Construct an instance of SearchServiceClient. * * @param {object} [options] - The configuration object. * The options accepted by the constructor are described in detail * in [this document](https://github.com/googleapis/gax-nodejs/blob/main/client-libraries.md#creating-the-client-instance). * The common options are: * @param {object} [options.credentials] - Credentials object. * @param {string} [options.credentials.client_email] * @param {string} [options.credentials.private_key] * @param {string} [options.email] - Account email address. Required when * using a .pem or .p12 keyFilename. * @param {string} [options.keyFilename] - Full path to the a .json, .pem, or * .p12 key downloaded from the Google Developers Console. If you provide * a path to a JSON file, the projectId option below is not necessary. * NOTE: .pem and .p12 require you to specify options.email as well. * @param {number} [options.port] - The port on which to connect to * the remote host. * @param {string} [options.projectId] - The project ID from the Google * Developer's Console, e.g. 'grape-spaceship-123'. We will also check * the environment variable GCLOUD_PROJECT for your project ID. If your * app is running in an environment which supports * {@link https://cloud.google.com/docs/authentication/application-default-credentials Application Default Credentials}, * your project ID will be detected automatically. * @param {string} [options.apiEndpoint] - The domain name of the * API remote host. * @param {gax.ClientConfig} [options.clientConfig] - Client configuration override. * Follows the structure of {@link gapicConfig}. * @param {boolean} [options.fallback] - Use HTTP/1.1 REST mode. * For more information, please check the * {@link https://github.com/googleapis/gax-nodejs/blob/main/client-libraries.md#http11-rest-api-mode documentation}. * @param {gax} [gaxInstance]: loaded instance of `google-gax`. Useful if you * need to avoid loading the default gRPC version and want to use the fallback * HTTP implementation. Load only fallback version and pass it to the constructor: * ``` * const gax = require('google-gax/build/src/fallback'); // avoids loading google-gax with gRPC * const client = new SearchServiceClient({fallback: true}, gax); * ``` */ constructor(opts, gaxInstance) { // Ensure that options include all the required fields. const staticMembers = this.constructor; if (opts?.universe_domain && opts?.universeDomain && opts?.universe_domain !== opts?.universeDomain) { throw new Error('Please set either universe_domain or universeDomain, but not both.'); } const universeDomainEnvVar = (typeof process === 'object' && typeof process.env === 'object') ? process.env['GOOGLE_CLOUD_UNIVERSE_DOMAIN'] : undefined; this._universeDomain = opts?.universeDomain ?? opts?.universe_domain ?? universeDomainEnvVar ?? 'googleapis.com'; this._servicePath = 'retail.' + this._universeDomain; const servicePath = opts?.servicePath || opts?.apiEndpoint || this._servicePath; this._providedCustomServicePath = !!(opts?.servicePath || opts?.apiEndpoint); const port = opts?.port || staticMembers.port; const clientConfig = opts?.clientConfig ?? {}; const fallback = opts?.fallback ?? (typeof window !== 'undefined' && typeof window?.fetch === 'function'); opts = Object.assign({ servicePath, port, clientConfig, fallback }, opts); // Request numeric enum values if REST transport is used. opts.numericEnums = true; // If scopes are unset in options and we're connecting to a non-default endpoint, set scopes just in case. if (servicePath !== this._servicePath && !('scopes' in opts)) { opts['scopes'] = staticMembers.scopes; } // Load google-gax module synchronously if needed if (!gaxInstance) { gaxInstance = require('google-gax'); } // Choose either gRPC or proto-over-HTTP implementation of google-gax. this._gaxModule = opts.fallback ? gaxInstance.fallback : gaxInstance; // Create a `gaxGrpc` object, with any grpc-specific options sent to the client. this._gaxGrpc = new this._gaxModule.GrpcClient(opts); // Save options to use in initialize() method. this._opts = opts; // Save the auth object to the client, for use by other methods. this.auth = this._gaxGrpc.auth; // Set useJWTAccessWithScope on the auth object. this.auth.useJWTAccessWithScope = true; // Set defaultServicePath on the auth object. this.auth.defaultServicePath = this._servicePath; // Set the default scopes in auth client if needed. if (servicePath === this._servicePath) { this.auth.defaultScopes = staticMembers.scopes; } this.locationsClient = new this._gaxModule.LocationsClient(this._gaxGrpc, opts); // Determine the client header string. const clientHeader = [ `gax/${this._gaxModule.version}`, `gapic/${version}`, ]; if (typeof process === 'object' && 'versions' in process) { clientHeader.push(`gl-node/${process.versions.node}`); } else { clientHeader.push(`gl-web/${this._gaxModule.version}`); } if (!opts.fallback) { clientHeader.push(`grpc/${this._gaxGrpc.grpcVersion}`); } else { clientHeader.push(`rest/${this._gaxGrpc.grpcVersion}`); } if (opts.libName && opts.libVersion) { clientHeader.push(`${opts.libName}/${opts.libVersion}`); } // Load the applicable protos. this._protos = this._gaxGrpc.loadProtoJSON(jsonProtos); // This API contains "path templates"; forward-slash-separated // identifiers to uniquely identify resources within the API. // Create useful helper objects for these. this.pathTemplates = { alertConfigPathTemplate: new this._gaxModule.PathTemplate('projects/{project}/alertConfig'), attributesConfigPathTemplate: new this._gaxModule.PathTemplate('projects/{project}/locations/{location}/catalogs/{catalog}/attributesConfig'), branchPathTemplate: new this._gaxModule.PathTemplate('projects/{project}/locations/{location}/catalogs/{catalog}/branches/{branch}'), catalogPathTemplate: new this._gaxModule.PathTemplate('projects/{project}/locations/{location}/catalogs/{catalog}'), completionConfigPathTemplate: new this._gaxModule.PathTemplate('projects/{project}/locations/{location}/catalogs/{catalog}/completionConfig'), controlPathTemplate: new this._gaxModule.PathTemplate('projects/{project}/locations/{location}/catalogs/{catalog}/controls/{control}'), experimentPathTemplate: new this._gaxModule.PathTemplate('projects/{project}/locations/{location}/catalogs/{catalog}/experiments/{experiment}'), loggingConfigPathTemplate: new this._gaxModule.PathTemplate('projects/{project}/loggingConfig'), merchantCenterAccountLinkPathTemplate: new this._gaxModule.PathTemplate('projects/{project}/locations/{location}/catalogs/{catalog}/merchantCenterAccountLinks/{merchant_center_account_link}'), modelPathTemplate: new this._gaxModule.PathTemplate('projects/{project}/locations/{location}/catalogs/{catalog}/models/{model}'), productPathTemplate: new this._gaxModule.PathTemplate('projects/{project}/locations/{location}/catalogs/{catalog}/branches/{branch}/products/{product}'), retailProjectPathTemplate: new this._gaxModule.PathTemplate('projects/{project}/retailProject'), servingConfigPathTemplate: new this._gaxModule.PathTemplate('projects/{project}/locations/{location}/catalogs/{catalog}/servingConfigs/{serving_config}'), }; // Some of the methods on this service return "paged" results, // (e.g. 50 results at a time, with tokens to get subsequent // pages). Denote the keys used for pagination and results. this.descriptors.page = { search: new this._gaxModule.PageDescriptor('pageToken', 'nextPageToken', 'results') }; const protoFilesRoot = this._gaxModule.protobufFromJSON(jsonProtos); // This API contains "long-running operations", which return a // an Operation object that allows for tracking of the operation, // rather than holding a request open. const lroOptions = { auth: this.auth, grpc: 'grpc' in this._gaxGrpc ? this._gaxGrpc.grpc : undefined }; if (opts.fallback) { lroOptions.protoJson = protoFilesRoot; lroOptions.httpRules = [{ selector: 'google.longrunning.Operations.GetOperation', get: '/v2alpha/{name=projects/*/locations/*/catalogs/*/branches/*/operations/*}', additional_bindings: [{ get: '/v2alpha/{name=projects/*/locations/*/catalogs/*/branches/*/places/*/operations/*}', }, { get: '/v2alpha/{name=projects/*/locations/*/catalogs/*/operations/*}', }, { get: '/v2alpha/{name=projects/*/locations/*/operations/*}', }, { get: '/v2alpha/{name=projects/*/operations/*}', }], }, { selector: 'google.longrunning.Operations.ListOperations', get: '/v2alpha/{name=projects/*/locations/*/catalogs/*}/operations', additional_bindings: [{ get: '/v2alpha/{name=projects/*/locations/*}/operations', }, { get: '/v2alpha/{name=projects/*}/operations', }], }]; } this.operationsClient = this._gaxModule.lro(lroOptions).operationsClient(opts); this.descriptors.longrunning = {}; // Put together the default options sent with requests. this._defaults = this._gaxGrpc.constructSettings('google.cloud.retail.v2alpha.SearchService', gapicConfig, opts.clientConfig || {}, { 'x-goog-api-client': clientHeader.join(' ') }); // Set up a dictionary of "inner API calls"; the core implementation // of calling the API is handled in `google-gax`, with this code // merely providing the destination and request information. this.innerApiCalls = {}; // Add a warn function to the client constructor so it can be easily tested. this.warn = this._gaxModule.warn; } /** * Initialize the client. * Performs asynchronous operations (such as authentication) and prepares the client. * This function will be called automatically when any class method is called for the * first time, but if you need to initialize it before calling an actual method, * feel free to call initialize() directly. * * You can await on this method if you want to make sure the client is initialized. * * @returns {Promise} A promise that resolves to an authenticated service stub. */ initialize() { // If the client stub promise is already initialized, return immediately. if (this.searchServiceStub) { return this.searchServiceStub; } // Put together the "service stub" for // google.cloud.retail.v2alpha.SearchService. this.searchServiceStub = this._gaxGrpc.createStub(this._opts.fallback ? this._protos.lookupService('google.cloud.retail.v2alpha.SearchService') : // eslint-disable-next-line @typescript-eslint/no-explicit-any this._protos.google.cloud.retail.v2alpha.SearchService, this._opts, this._providedCustomServicePath); // Iterate over each of the methods that the service provides // and create an API call method for each. const searchServiceStubMethods = ['search']; for (const methodName of searchServiceStubMethods) { const callPromise = this.searchServiceStub.then(stub => (...args) => { if (this._terminated) { return Promise.reject('The client has already been closed.'); } const func = stub[methodName]; return func.apply(stub, args); }, (err) => () => { throw err; }); const descriptor = this.descriptors.page[methodName] || undefined; const apiCall = this._gaxModule.createApiCall(callPromise, this._defaults[methodName], descriptor, this._opts.fallback); this.innerApiCalls[methodName] = apiCall; } return this.searchServiceStub; } /** * The DNS address for this API service. * @deprecated Use the apiEndpoint method of the client instance. * @returns {string} The DNS address for this service. */ static get servicePath() { if (typeof process === 'object' && typeof process.emitWarning === 'function') { process.emitWarning('Static servicePath is deprecated, please use the instance method instead.', 'DeprecationWarning'); } return 'retail.googleapis.com'; } /** * The DNS address for this API service - same as servicePath. * @deprecated Use the apiEndpoint method of the client instance. * @returns {string} The DNS address for this service. */ static get apiEndpoint() { if (typeof process === 'object' && typeof process.emitWarning === 'function') { process.emitWarning('Static apiEndpoint is deprecated, please use the instance method instead.', 'DeprecationWarning'); } return 'retail.googleapis.com'; } /** * The DNS address for this API service. * @returns {string} The DNS address for this service. */ get apiEndpoint() { return this._servicePath; } get universeDomain() { return this._universeDomain; } /** * The port for this API service. * @returns {number} The default port for this service. */ static get port() { return 443; } /** * The scopes needed to make gRPC calls for every method defined * in this service. * @returns {string[]} List of default scopes. */ static get scopes() { return [ 'https://www.googleapis.com/auth/cloud-platform' ]; } /** * Return the project ID used by this class. * @returns {Promise} A promise that resolves to string containing the project ID. */ getProjectId(callback) { if (callback) { this.auth.getProjectId(callback); return; } return this.auth.getProjectId(); } search(request, optionsOrCallback, callback) { request = request || {}; let options; if (typeof optionsOrCallback === 'function' && callback === undefined) { callback = optionsOrCallback; options = {}; } else { options = optionsOrCallback; } options = options || {}; options.otherArgs = options.otherArgs || {}; options.otherArgs.headers = options.otherArgs.headers || {}; options.otherArgs.headers['x-goog-request-params'] = this._gaxModule.routingHeader.fromParams({ 'placement': request.placement ?? '', }); this.initialize().catch(err => { throw err; }); const wrappedCallback = callback ? (error, values, nextPageRequest, rawResponse) => { this._log.info('search values %j', values); callback(error, values, nextPageRequest, rawResponse); // We verified callback above. } : undefined; this._log.info('search request %j', request); return this.innerApiCalls .search(request, options, wrappedCallback) ?.then(([response, input, output]) => { this._log.info('search values %j', response); return [response, input, output]; }); } /** * Equivalent to `search`, but returns a NodeJS Stream object. * @param {Object} request * The request object that will be sent. * @param {string} request.placement * Required. The resource name of the Retail Search serving config, such as * `projects/* /locations/global/catalogs/default_catalog/servingConfigs/default_serving_config` * or the name of the legacy placement resource, such as * `projects/* /locations/global/catalogs/default_catalog/placements/default_search`. * This field is used to identify the serving config name and the set * of models that are used to make the search. * @param {string} request.branch * The branch resource name, such as * `projects/* /locations/global/catalogs/default_catalog/branches/0`. * * Use "default_branch" as the branch ID or leave this field empty, to search * products under the default branch. * @param {string} request.query * Raw search query. * * If this field is empty, the request is considered a category browsing * request and returned results are based on * {@link protos.google.cloud.retail.v2alpha.SearchRequest.filter|filter} and * {@link protos.google.cloud.retail.v2alpha.SearchRequest.page_categories|page_categories}. * @param {string} request.visitorId * Required. A unique identifier for tracking visitors. For example, this * could be implemented with an HTTP cookie, which should be able to uniquely * identify a visitor on a single device. This unique identifier should not * change if the visitor logs in or out of the website. * * This should be the same identifier as * {@link protos.google.cloud.retail.v2alpha.UserEvent.visitor_id|UserEvent.visitor_id}. * * The field must be a UTF-8 encoded string with a length limit of 128 * characters. Otherwise, an INVALID_ARGUMENT error is returned. * @param {google.cloud.retail.v2alpha.UserInfo} request.userInfo * User information. * @param {number} request.pageSize * Maximum number of {@link protos.google.cloud.retail.v2alpha.Product|Product}s to * return. If unspecified, defaults to a reasonable value. The maximum allowed * value is 120. Values above 120 will be coerced to 120. * * If this field is negative, an INVALID_ARGUMENT is returned. * @param {string} request.pageToken * A page token * {@link protos.google.cloud.retail.v2alpha.SearchResponse.next_page_token|SearchResponse.next_page_token}, * received from a previous * {@link protos.google.cloud.retail.v2alpha.SearchService.Search|SearchService.Search} * call. Provide this to retrieve the subsequent page. * * When paginating, all other parameters provided to * {@link protos.google.cloud.retail.v2alpha.SearchService.Search|SearchService.Search} * must match the call that provided the page token. Otherwise, an * INVALID_ARGUMENT error is returned. * @param {number} request.offset * A 0-indexed integer that specifies the current offset (that is, starting * result location, amongst the * {@link protos.google.cloud.retail.v2alpha.Product|Product}s deemed by the API as * relevant) in search results. This field is only considered if * {@link protos.google.cloud.retail.v2alpha.SearchRequest.page_token|page_token} is * unset. * * If this field is negative, an INVALID_ARGUMENT is returned. * @param {string} request.filter * The filter syntax consists of an expression language for constructing a * predicate from one or more fields of the products being filtered. Filter * expression is case-sensitive. For more information, see * [Filter](https://cloud.google.com/retail/docs/filter-and-order#filter). * * If this field is unrecognizable, an INVALID_ARGUMENT is returned. * @param {string} request.canonicalFilter * The default filter that is applied when a user performs a search without * checking any filters on the search page. * * The filter applied to every search request when quality improvement such as * query expansion is needed. In the case a query does not have a sufficient * amount of results this filter will be used to determine whether or not to * enable the query expansion flow. The original filter will still be used for * the query expanded search. * This field is strongly recommended to achieve high search quality. * * For more information about filter syntax, see * {@link protos.google.cloud.retail.v2alpha.SearchRequest.filter|SearchRequest.filter}. * @param {string} request.orderBy * The order in which products are returned. Products can be ordered by * a field in an {@link protos.google.cloud.retail.v2alpha.Product|Product} object. Leave * it unset if ordered by relevance. OrderBy expression is case-sensitive. For * more information, see * [Order](https://cloud.google.com/retail/docs/filter-and-order#order). * * If this field is unrecognizable, an INVALID_ARGUMENT is returned. * @param {number[]} request.facetSpecs * Facet specifications for faceted search. If empty, no facets are returned. * * A maximum of 200 values are allowed. Otherwise, an INVALID_ARGUMENT error * is returned. * @param {google.cloud.retail.v2alpha.SearchRequest.DynamicFacetSpec} request.dynamicFacetSpec * Deprecated. Refer to https://cloud.google.com/retail/docs/configs#dynamic * to enable dynamic facets. Do not set this field. * * The specification for dynamically generated facets. Notice that only * textual facets can be dynamically generated. * @param {google.cloud.retail.v2alpha.SearchRequest.BoostSpec} request.boostSpec * Boost specification to boost certain products. For more information, see * [Boost results](https://cloud.google.com/retail/docs/boosting). * * Notice that if both * {@link protos.google.cloud.retail.v2alpha.ServingConfig.boost_control_ids|ServingConfig.boost_control_ids} * and * {@link protos.google.cloud.retail.v2alpha.SearchRequest.boost_spec|SearchRequest.boost_spec} * are set, the boost conditions from both places are evaluated. If a search * request matches multiple boost conditions, the final boost score is equal * to the sum of the boost scores from all matched boost conditions. * @param {google.cloud.retail.v2alpha.SearchRequest.QueryExpansionSpec} request.queryExpansionSpec * The query expansion specification that specifies the conditions under which * query expansion occurs. For more information, see [Query * expansion](https://cloud.google.com/retail/docs/result-size#query_expansion). * @param {google.cloud.retail.v2alpha.SearchRequest.RelevanceThreshold} request.relevanceThreshold * The relevance threshold of the search results. * * Defaults to * {@link protos.google.cloud.retail.v2alpha.SearchRequest.RelevanceThreshold.HIGH|RelevanceThreshold.HIGH}, * which means only the most relevant results are shown, and the least number * of results are returned. For more information, see [Adjust result * size](https://cloud.google.com/retail/docs/result-size#relevance_thresholding). * @param {string[]} request.variantRollupKeys * The keys to fetch and rollup the matching * {@link protos.google.cloud.retail.v2alpha.Product.Type.VARIANT|variant} * {@link protos.google.cloud.retail.v2alpha.Product|Product}s attributes, * {@link protos.google.cloud.retail.v2alpha.FulfillmentInfo|FulfillmentInfo} or * {@link protos.google.cloud.retail.v2alpha.LocalInventory|LocalInventory}s attributes. * The attributes from all the matching * {@link protos.google.cloud.retail.v2alpha.Product.Type.VARIANT|variant} * {@link protos.google.cloud.retail.v2alpha.Product|Product}s or * {@link protos.google.cloud.retail.v2alpha.LocalInventory|LocalInventory}s are merged * and de-duplicated. Notice that rollup attributes will lead to extra query * latency. Maximum number of keys is 30. * * For {@link protos.google.cloud.retail.v2alpha.FulfillmentInfo|FulfillmentInfo}, a * fulfillment type and a fulfillment ID must be provided in the format of * "fulfillmentType.fulfillmentId". E.g., in "pickupInStore.store123", * "pickupInStore" is fulfillment type and "store123" is the store ID. * * Supported keys are: * * * colorFamilies * * price * * originalPrice * * discount * * variantId * * inventory(place_id,price) * * inventory(place_id,original_price) * * inventory(place_id,attributes.key), where key is any key in the * {@link protos.google.cloud.retail.v2alpha.LocalInventory.attributes|Product.local_inventories.attributes} * map. * * attributes.key, where key is any key in the * {@link protos.google.cloud.retail.v2alpha.Product.attributes|Product.attributes} map. * * pickupInStore.id, where id is any * {@link protos.google.cloud.retail.v2alpha.FulfillmentInfo.place_ids|FulfillmentInfo.place_ids} * for * {@link protos.google.cloud.retail.v2alpha.FulfillmentInfo.type|FulfillmentInfo.type} * "pickup-in-store". * * shipToStore.id, where id is any * {@link protos.google.cloud.retail.v2alpha.FulfillmentInfo.place_ids|FulfillmentInfo.place_ids} * for * {@link protos.google.cloud.retail.v2alpha.FulfillmentInfo.type|FulfillmentInfo.type} * "ship-to-store". * * sameDayDelivery.id, where id is any * {@link protos.google.cloud.retail.v2alpha.FulfillmentInfo.place_ids|FulfillmentInfo.place_ids} * for * {@link protos.google.cloud.retail.v2alpha.FulfillmentInfo.type|FulfillmentInfo.type} * "same-day-delivery". * * nextDayDelivery.id, where id is any * {@link protos.google.cloud.retail.v2alpha.FulfillmentInfo.place_ids|FulfillmentInfo.place_ids} * for * {@link protos.google.cloud.retail.v2alpha.FulfillmentInfo.type|FulfillmentInfo.type} * "next-day-delivery". * * customFulfillment1.id, where id is any * {@link protos.google.cloud.retail.v2alpha.FulfillmentInfo.place_ids|FulfillmentInfo.place_ids} * for * {@link protos.google.cloud.retail.v2alpha.FulfillmentInfo.type|FulfillmentInfo.type} * "custom-type-1". * * customFulfillment2.id, where id is any * {@link protos.google.cloud.retail.v2alpha.FulfillmentInfo.place_ids|FulfillmentInfo.place_ids} * for * {@link protos.google.cloud.retail.v2alpha.FulfillmentInfo.type|FulfillmentInfo.type} * "custom-type-2". * * customFulfillment3.id, where id is any * {@link protos.google.cloud.retail.v2alpha.FulfillmentInfo.place_ids|FulfillmentInfo.place_ids} * for * {@link protos.google.cloud.retail.v2alpha.FulfillmentInfo.type|FulfillmentInfo.type} * "custom-type-3". * * customFulfillment4.id, where id is any * {@link protos.google.cloud.retail.v2alpha.FulfillmentInfo.place_ids|FulfillmentInfo.place_ids} * for * {@link protos.google.cloud.retail.v2alpha.FulfillmentInfo.type|FulfillmentInfo.type} * "custom-type-4". * * customFulfillment5.id, where id is any * {@link protos.google.cloud.retail.v2alpha.FulfillmentInfo.place_ids|FulfillmentInfo.place_ids} * for * {@link protos.google.cloud.retail.v2alpha.FulfillmentInfo.type|FulfillmentInfo.type} * "custom-type-5". * * If this field is set to an invalid value other than these, an * INVALID_ARGUMENT error is returned. * @param {string} [request.experimentId] * Optional. An ID for the experiment group this search belongs to. * @param {string[]} request.pageCategories * The categories associated with a category page. Must be set for category * navigation queries to achieve good search quality. The format should be * the same as * {@link protos.google.cloud.retail.v2alpha.UserEvent.page_categories|UserEvent.page_categories}; * * To represent full path of category, use '>' sign to separate different * hierarchies. If '>' is part of the category name, replace it with * other character(s). * * Category pages include special pages such as sales or promotions. For * instance, a special sale page may have the category hierarchy: * "pageCategories" : ["Sales > 2017 Black Friday Deals"]. * @param {google.cloud.retail.v2alpha.SearchRequest.SearchMode} request.searchMode * The search mode of the search request. If not specified, a single search * request triggers both product search and faceted search. * @param {google.cloud.retail.v2alpha.SearchRequest.PersonalizationSpec} request.personalizationSpec * The specification for personalization. * * Notice that if both * {@link protos.google.cloud.retail.v2alpha.ServingConfig.personalization_spec|ServingConfig.personalization_spec} * and * {@link protos.google.cloud.retail.v2alpha.SearchRequest.personalization_spec|SearchRequest.personalization_spec} * are set. * {@link protos.google.cloud.retail.v2alpha.SearchRequest.personalization_spec|SearchRequest.personalization_spec} * will override * {@link protos.google.cloud.retail.v2alpha.ServingConfig.personalization_spec|ServingConfig.personalization_spec}. * @param {number[]} request.labels * The labels applied to a resource must meet the following requirements: * * * Each resource can have multiple labels, up to a maximum of 64. * * Each label must be a key-value pair. * * Keys have a minimum length of 1 character and a maximum length of 63 * characters and cannot be empty. Values can be empty and have a maximum * length of 63 characters. * * Keys and values can contain only lowercase letters, numeric characters, * underscores, and dashes. All characters must use UTF-8 encoding, and * international characters are allowed. * * The key portion of a label must be unique. However, you can use the same * key with multiple resources. * * Keys must start with a lowercase letter or international character. * * For more information, see [Requirements for * labels](https://cloud.google.com/resource-manager/docs/creating-managing-labels#requirements) * in the Resource Manager documentation. * @param {google.cloud.retail.v2alpha.SearchRequest.SpellCorrectionSpec} request.spellCorrectionSpec * The spell correction specification that specifies the mode under * which spell correction will take effect. * @param {string} request.entity * The entity for customers that may run multiple different entities, domains, * sites or regions, for example, `Google US`, `Google Ads`, `Waymo`, * `google.com`, `youtube.com`, etc. * If this is set, it should be exactly matched with * {@link protos.google.cloud.retail.v2alpha.UserEvent.entity|UserEvent.entity} to get * search results boosted by entity. * @param {google.cloud.retail.v2alpha.SearchRequest.ConversationalSearchSpec} [request.conversationalSearchSpec] * Optional. This field specifies all conversational related parameters * addition to traditional retail search. * @param {google.cloud.retail.v2alpha.SearchRequest.TileNavigationSpec} [request.tileNavigationSpec] * Optional. This field specifies tile navigation related parameters. * @param {string} [request.languageCode] * Optional. The BCP-47 language code, such as "en-US" or "sr-Latn" * [list](https://www.unicode.org/cldr/charts/46/summary/root.html). For more * information, see [Standardized codes](https://google.aip.dev/143). This * field helps to better interpret the query. If a value isn't specified, the * query language code is automatically detected, which may not be accurate. * @param {string} [request.regionCode] * Optional. The Unicode country/region code (CLDR) of a location, such as * "US" and "419" * [list](https://www.unicode.org/cldr/charts/46/supplemental/territory_information.html). * For more information, see [Standardized codes](https://google.aip.dev/143). * If set, then results will be boosted based on the region_code provided. * @param {string} [request.placeId] * Optional. An id corresponding to a place, such as a store id or region id. * When specified, we use the price from the local inventory with the matching * product's * {@link protos.google.cloud.retail.v2alpha.LocalInventory.place_id|LocalInventory.place_id} * for revenue optimization. * @param {number[]} [request.userAttributes] * Optional. The user attributes that could be used for personalization of * search results. * * Populate at most 100 key-value pairs per query. * * Only supports string keys and repeated string values. * * Duplicate keys are not allowed within a single query. * * Example: * user_attributes: [ * { key: "pets" * value { * values: "dog" * values: "cat" * } * }, * { key: "state" * value { * values: "CA" * } * } * ] * @param {object} [options] * Call options. See {@link https://googleapis.dev/nodejs/google-gax/latest/interfaces/CallOptions.html|CallOptions} for more details. * @returns {Stream} * An object stream which emits an object representing {@link protos.google.cloud.retail.v2alpha.SearchResponse.SearchResult|SearchResult} on 'data' event. * The client library will perform auto-pagination by default: it will call the API as many * times as needed. Note that it can affect your quota. * We recommend using `searchAsync()` * method described below for async iteration which you can stop as needed. * Please see the {@link https://github.com/googleapis/gax-nodejs/blob/master/client-libraries.md#auto-pagination | documentation } * for more details and examples. */ searchStream(request, options) { request = request || {}; options = options || {}; options.otherArgs = options.otherArgs || {}; options.otherArgs.headers = options.otherArgs.headers || {}; options.otherArgs.headers['x-goog-request-params'] = this._gaxModule.routingHeader.fromParams({ 'placement': request.placement ?? '', }); const defaultCallSettings = this._defaults['search']; const callSettings = defaultCallSettings.merge(options); this.initialize().catch(err => { throw err; }); this._log.info('search stream %j', request); return this.descriptors.page.search.createStream(this.innerApiCalls.search, request, callSettings); } /** * Equivalent to `search`, but returns an iterable object. * * `for`-`await`-`of` syntax is used with the iterable to get response elements on-demand. * @param {Object} request * The request object that will be sent. * @param {string} request.placement * Required. The resource name of the Retail Search serving config, such as * `projects/* /locations/global/catalogs/default_catalog/servingConfigs/default_serving_config` * or the name of the legacy placement resource, such as * `projects/* /locations/global/catalogs/default_catalog/placements/default_search`. * This field is used to identify the serving config name and the set * of models that are used to make the search. * @param {string} request.branch * The branch resource name, such as * `projects/* /locations/global/catalogs/default_catalog/branches/0`. * * Use "default_branch" as the branch ID or leave this field empty, to search * products under the default branch. * @param {string} request.query * Raw search query. * * If this field is empty, the request is considered a category browsing * request and returned results are based on * {@link protos.google.cloud.retail.v2alpha.SearchRequest.filter|filter} and * {@link protos.google.cloud.retail.v2alpha.SearchRequest.page_categories|page_categories}. * @param {string} request.visitorId * Required. A unique identifier for tracking visitors. For example, this * could be implemented with an HTTP cookie, which should be able to uniquely * identify a visitor on a single device. This unique identifier should not * change if the visitor logs in or out of the website. * * This should be the same identifier as * {@link protos.google.cloud.retail.v2alpha.UserEvent.visitor_id|UserEvent.visitor_id}. * * The field must be a UTF-8 encoded string with a length limit of 128 * characters. Otherwise, an INVALID_ARGUMENT error is returned. * @param {google.cloud.retail.v2alpha.UserInfo} request.userInfo * User information. * @param {number} request.pageSize * Maximum number of {@link protos.google.cloud.retail.v2alpha.Product|Product}s to * return. If unspecified, defaults to a reasonable value. The maximum allowed * value is 120. Values above 120 will be coerced to 120. * * If this field is negative, an INVALID_ARGUMENT is returned. * @param {string} request.pageToken * A page token * {@link protos.google.cloud.retail.v2alpha.SearchResponse.next_page_token|SearchResponse.next_page_token}, * received from a previous * {@link protos.google.cloud.retail.v2alpha.SearchService.Search|SearchService.Search} * call. Provide this to retrieve the subsequent page. * * When paginating, all other parameters provided to * {@link protos.google.cloud.retail.v2alpha.SearchService.Search|SearchService.Search} * must match the call that provided the page token. Otherwise, an * INVALID_ARGUMENT error is returned. * @param {number} request.offset * A 0-indexed integer that specifies the current offset (that is, starting * result location, amongst the * {@link protos.google.cloud.retail.v2alpha.Product|Product}s deemed by the API as * relevant) in search results. This field is only considered if * {@link protos.google.cloud.retail.v2alpha.SearchRequest.page_token|page_token} is * unset. * * If this field is negative, an INVALID_ARGUMENT is returned. * @param {string} request.filter * The filter syntax consists of an expression language for constructing a * predicate from one or more fields of the products being filtered. Filter * expression is case-sensitive. For more information, see * [Filter](https://cloud.google.com/retail/docs/filter-and-order#filter). * * If this field is unrecognizable, an INVALID_ARGUMENT is returned. * @param {string} request.canonicalFilter * The default filter that is applied when a user performs a search without * checking any filters on the search page. * * The filter applied to every search request when quality improvement such as * query expansion is needed. In the case a query does not have a sufficient * amount of results this filter will be used to determine whether or not to * enable the query expansion flow. The original filter will still be used for * the query expanded search. * This field is strongly recommended to achieve high search quality. * * For more information about filter syntax, see * {@link protos.google.cloud.retail.v2alpha.SearchRequest.filter|SearchRequest.filter}. * @param {string} request.orderBy * The order in which products are returned. Products can be ordered by * a field in an {@link protos.google.cloud.retail.v2alpha.Product|Product} object. Leave * it unset if ordered by relevance. OrderBy expression is case-sensitive. For * more information, see * [Order](https://cloud.google.com/retail/docs/filter-and-order#order). * * If this field is unrecognizable, an INVALID_ARGUMENT is returned. * @param {number[]} request.facetSpecs * Facet specifications for faceted search. If empty, no facets are returned. * * A maximum of 200 values are allowed. Otherwise, an INVALID_ARGUMENT error * is returned. * @param {google.cloud.retail.v2alpha.SearchRequest.DynamicFacetSpec} request.dynamicFacetSpec * Deprecated. Refer to https://cloud.google.com/retail/docs/configs#dynamic * to enable dynamic facets. Do not set this field. * * The specification for dynamically generated facets. Notice that only * textual facets can be dynamically generated. * @param {google.cloud.retail.v2alpha.SearchRequest.BoostSpec} request.boostSpec * Boost specification to boost certain products. For more information, see * [Boost results](https://cloud.google.com/retail/docs/boosting). * * Notice that if both * {@link protos.google.cloud.retail.v2alpha.ServingConfig.boost_control_ids|ServingConfig.boost_control_ids} * and * {@link protos.google.cloud.retail.v2alpha.SearchRequest.boost_spec|SearchRequest.boost_spec} * are set, the boost conditions from both places are evaluated. If a search * request matches multiple boost conditions, the final boost score is equal * to the sum of the boost scores from all matched boost conditions. * @param {google.cloud.retail.v2alpha.SearchRequest.QueryExpansionSpec} request.queryExpansionSpec * The query expansion specification that specifies the conditions under which * query expansion occurs. For more information, see [Query * expansion](https://cloud.google.com/retail/docs/result-size#query_expansion). * @param {google.cloud.retail.v2alpha.SearchRequest.RelevanceThreshold} request.relevanceThreshold * The relevance threshold of the search results. * * Defaults to * {@link protos.google.cloud.retail.v2alpha.SearchRequest.RelevanceThreshold.HIGH|RelevanceThreshold.HIGH}, * which means only the most relevant results are shown, and the least number * of results are returned. For more information, see [Adjust result * size](https://cloud.google.com/retail/docs/result-size#relevance_thresholding). * @param {string[]} request.variantRollupKeys * The keys to fetch and rollup the matching * {@link protos.google.cloud.retail.v2alpha.Product.Type.VARIANT|variant} * {@link protos.google.cloud.retail.v2alpha.Product|Product}s attributes, * {@link protos.google.cloud.retail.v2alpha.FulfillmentInfo|FulfillmentInfo} or * {@link protos.google.cloud.retail.v2alpha.LocalInventory|LocalInventory}s attributes. * The attributes from all the matching * {@link protos.google.cloud.retail.v2alpha.Product.Type.VARIANT|variant} * {@link protos.google.cloud.retail.v2alpha.Product|Product}s or * {@link protos.google.cloud.retail.v2alpha.LocalInventory|LocalInventory}s are merged * and de-duplicated. Notice that rollup attributes will lead to extra query * latency. Maximum number of keys is 30. * * For {@link protos.google.cloud.retail.v2alpha.FulfillmentInfo|FulfillmentInfo}, a * fulfillment type and a fulfillment ID must be provided in the format of * "fulfillmentType.fulfillmentId". E.g., in "pickupInStore.store123", * "pickupInStore" is fulfillment type and "store123" is the store ID. * * Supported keys are: * * * colorFamilies * * price * * originalPrice * * discount * * variantId * * inventory(place_id,price) * * inventory(place_id,original_price) * * inventory(place_id,attributes.key), where key is any key in the * {@link protos.google.cloud.retail.v2alpha.LocalInventory.attributes|Product.local_inventories.attributes} * map. * * attributes.key, where key is any key in the * {@link protos.google.cloud.retail.v2alpha.Product.attributes|Product.attributes} map. * * pickupInStore.id, where id is any * {@link protos.google.cloud.retail.v2alpha.FulfillmentInfo.place_ids|FulfillmentInfo.place_ids} * for * {@link protos.google.cloud.retail.v2alpha.FulfillmentInfo.type|FulfillmentInfo.type} * "pickup-in-store". * * shipToStore.id, where id is any * {@link protos.google.cloud.retail.v2alpha.FulfillmentInfo.place_ids|FulfillmentInfo.place_ids} * for * {@link protos.google.cloud.retail.v2alpha.FulfillmentInfo.type|FulfillmentInfo.type} * "ship-to-store". * * sameDayDelivery.id, where id is any * {@link protos.google.cloud.retail.v2alpha.FulfillmentInfo.place_ids|FulfillmentInfo.place_ids} * for * {@link protos.google.cloud.retail.v2alpha.FulfillmentInfo.type|FulfillmentInfo.type} * "same-day-delivery". * * nextDayDelivery.id, where id is any * {@link protos.google.cloud.retail.v2alpha.FulfillmentInfo.place_ids|FulfillmentInfo.place_ids} * for * {@link protos.google.cloud.retail.v2alpha.FulfillmentInfo.type|FulfillmentInfo.type} * "next-day-delivery". * * customFulfillment1.id, where id is any * {@link protos.google.cloud.retail.v2alpha.FulfillmentInfo.place_ids|FulfillmentInfo.place_ids} * for * {@link protos.google.cloud.retail.v2alpha.FulfillmentInfo.type|FulfillmentInfo.type} * "custom-type-1". * * customFulfillment2.id, where id is any * {@link protos.google.cloud.retail.v2alpha.FulfillmentInfo.place_ids|FulfillmentInfo.place_ids} * for * {@link protos.google.cloud.retail.v2alpha.FulfillmentInfo.type|FulfillmentInfo.type} * "custom-type-2". * * customFulfillment3.id, where id is any * {@link protos.google.cloud.retail.v2alpha.FulfillmentInfo.place_ids|FulfillmentInfo.place_ids} * for * {@link protos.google.cloud.retail.v2alpha.FulfillmentInfo.type|FulfillmentInfo.type} * "custom-type-3". * * customFulfillment4.id, where id is any * {@link protos.google.cloud.retail.v2alpha.FulfillmentInfo.place_ids|FulfillmentInfo.place_ids} * for * {@link protos.google.cloud.retail.v2alpha.FulfillmentInfo.type|FulfillmentInfo.type} * "custom-type-4". * * customFulfillment5.id, where id is any * {@link protos.google.cloud.retail.v2alpha.FulfillmentInfo.place_ids|FulfillmentInfo.place_ids} * for * {@link protos.google.cloud.retail.v2alpha.FulfillmentInfo.type|FulfillmentInfo.type} * "custom-type-5". * * If this field is set to an invalid value other than these, an * INVALID_ARGUMENT error is returned. * @param {string} [request.experimentId] * Optional. An ID for the experiment group this search belongs to. * @para