or run

npx @tessl/cli init
Log in

Version

Tile

Overview

Evals

Files

Files

docs

advanced-features.mdai-recommendations.mdanalytics-export.mdcatalog-config.mdindex.mdproduct-management.mdsearch-discovery.mduser-events.md

search-discovery.mddocs/

0

# Search and Discovery

1

2

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.

3

4

## Capabilities

5

6

### Product Search

7

8

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

9

10

```python { .api }

11

class SearchServiceClient:

12

def search(self, request: SearchRequest) -> SearchResponse:

13

"""

14

Performs product search with comprehensive filtering and ranking options.

15

16

Args:

17

request: Search parameters including query, filters, facets, and personalization

18

19

Returns:

20

SearchResponse: Search results with products, facets, corrected query, and metadata

21

22

Raises:

23

InvalidArgument: If search parameters are invalid

24

PermissionDenied: If placement is not accessible

25

"""

26

```

27

28

### Query Auto-completion

29

30

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

31

32

```python { .api }

33

class CompletionServiceClient:

34

def complete_query(self, request: CompleteQueryRequest) -> CompleteQueryResponse:

35

"""

36

Provides query auto-completion suggestions based on catalog data and user behavior.

37

38

Args:

39

request: Contains catalog path, query prefix, and completion parameters

40

41

Returns:

42

CompleteQueryResponse: Completion suggestions with attribution metadata

43

44

Raises:

45

InvalidArgument: If completion parameters are invalid

46

"""

47

48

class SearchServiceAsyncClient:

49

async def search(self, request: SearchRequest) -> SearchResponse:

50

"""Async version of search."""

51

52

class CompletionServiceAsyncClient:

53

async def complete_query(self, request: CompleteQueryRequest) -> CompleteQueryResponse:

54

"""Async version of complete_query."""

55

```

56

57

## Data Types

58

59

### Search Request

60

61

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

62

63

```python { .api }

64

class SearchRequest:

65

placement: str # Placement resource name (required)

66

branch: str # Catalog branch to search

67

query: str # Search query text

68

visitor_id: str # Unique visitor identifier for personalization

69

user_info: UserInfo # User context information

70

page_size: int # Maximum results per page (default: 100, max: 1000)

71

page_token: str # Token for pagination

72

offset: int # Number of results to skip

73

filter: str # Filter expression for products

74

canonical_filter: str # Canonical filter for consistent results

75

order_by: str # Sort order specification

76

facet_specs: List[FacetSpec] # Faceting configuration

77

dynamic_facet_spec: SearchRequestDynamicFacetSpec # Dynamic facet generation

78

boost_spec: SearchRequestBoostSpec # Result boosting configuration

79

query_expansion_spec: SearchRequestQueryExpansionSpec # Query expansion settings

80

variant_rollup_keys: List[str] # Keys for variant product rollup

81

page_categories: List[str] # Page context categories

82

search_mode: SearchMode # PRODUCT_SEARCH_ONLY or FACETED_SEARCH_ONLY

83

personalization_spec: SearchRequestPersonalizationSpec # Personalization settings

84

labels: Dict[str, str] # Custom labels for analytics

85

spell_correction_spec: SearchRequestSpellCorrectionSpec # Spell correction settings

86

```

87

88

### Search Response

89

90

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

91

92

```python { .api }

93

class SearchResponse:

94

results: List[SearchResponseSearchResult] # Search results with products

95

facets: List[SearchResponseFacet] # Facet results for filtering

96

total_size: int # Total number of matching products

97

corrected_query: str # Spell-corrected version of query

98

attribution_token: str # Token for result attribution

99

next_page_token: str # Token for next page of results

100

query_expansion_info: SearchResponseQueryExpansionInfo # Query expansion details

101

redirect_uri: str # Redirect URL if applicable

102

applied_controls: List[str] # Applied business rules/controls

103

invalid_condition_boost_specs: List[SearchRequestBoostSpecConditionBoostSpec] # Invalid boost conditions

104

experiment_info: List[ExperimentInfo] # A/B test experiment information

105

personalization_info: SearchResponsePersonalizationInfo # Personalization details

106

```

107

108

### Search Result

109

110

Individual search result containing product information and metadata.

111

112

```python { .api }

113

class SearchResponseSearchResult:

114

id: str # Product ID

115

product: Product # Full product information

116

matching_variant_count: int # Number of matching variants

117

matching_variant_fields: Dict[str, FieldMask] # Matching variant field details

118

variant_rollup_values: Dict[str, Value] # Rolled-up variant values

119

personal_labels: List[str] # Personalized labels for this result

120

```

121

122

### Faceting

123

124

Configuration and results for search faceting functionality.

125

126

```python { .api }

127

class FacetSpec:

128

facet_key: FacetKeySpec # Facet key configuration

129

limit: int # Maximum facet values to return

130

excluded_filter_keys: List[str] # Filter keys to exclude from facet counts

131

enable_dynamic_position: bool # Enable dynamic facet positioning

132

133

class FacetKeySpec:

134

key: str # Facet key (attribute name or predefined key)

135

intervals: List[Interval] # Numeric intervals for numeric facets

136

restricted_values: List[str] # Restrict facet to specific values

137

prefixes: List[str] # Prefix matching for text facets

138

contains: List[str] # Substring matching for text facets

139

case_insensitive: bool # Case-insensitive matching

140

order_by: str # Facet value ordering

141

query: str # Query for facet value filtering

142

return_min_max: bool # Return min/max values for numeric facets

143

144

class SearchResponseFacet:

145

key: str # Facet key

146

values: List[SearchResponseFacetFacetValue] # Facet values and counts

147

dynamic_facet: bool # Whether this is a dynamically generated facet

148

149

class SearchResponseFacetFacetValue:

150

value: str # Facet value

151

count: int # Number of products with this facet value

152

interval: Interval # Interval for numeric facets

153

min_value: float # Minimum value for numeric facets

154

max_value: float # Maximum value for numeric facets

155

```

156

157

### Completion Request and Response

158

159

Query auto-completion configuration and results.

160

161

```python { .api }

162

class CompleteQueryRequest:

163

catalog: str # Catalog resource name (required)

164

query: str # Query prefix for completion (required)

165

visitor_id: str # Unique visitor identifier

166

language_codes: List[str] # Preferred completion languages

167

device_type: str # Device type (DESKTOP, MOBILE, TABLET)

168

dataset: str # Dataset for completion suggestions

169

max_suggestions: int # Maximum suggestions to return (default: 20)

170

171

class CompleteQueryResponse:

172

completion_results: List[CompleteQueryResponseCompletionResult] # Completion suggestions

173

attribution_token: str # Token for attribution

174

recent_search_results: List[CompleteQueryResponseRecentSearchResult] # Recent searches

175

176

class CompleteQueryResponseCompletionResult:

177

suggestion: str # Completion suggestion text

178

attributes: Dict[str, CustomAttribute] # Additional attributes

179

180

class CompleteQueryResponseRecentSearchResult:

181

recent_search: str # Recent search query

182

```

183

184

### Personalization and User Context

185

186

User information and personalization settings for search customization.

187

188

```python { .api }

189

class UserInfo:

190

user_id: str # Persistent user identifier

191

ip_address: str # User IP address for geo-targeting

192

user_agent: str # User agent string

193

direct_user_request: bool # Whether request is directly from user

194

195

class SearchRequestPersonalizationSpec:

196

mode: PersonalizationSpecMode # AUTO, DISABLED

197

198

class SearchResponsePersonalizationInfo:

199

personalization_mode: PersonalizationSpecMode # Applied personalization mode

200

user_id: str # User ID used for personalization

201

```

202

203

### Boosting and Ranking

204

205

Configuration for result boosting and custom ranking.

206

207

```python { .api }

208

class SearchRequestBoostSpec:

209

condition_boost_specs: List[SearchRequestBoostSpecConditionBoostSpec] # Conditional boosting

210

skip_boost_spec_validation: bool # Skip boost validation

211

212

class SearchRequestBoostSpecConditionBoostSpec:

213

condition: str # Boost condition expression

214

boost: float # Boost multiplier

215

```

216

217

### Query Processing

218

219

Query expansion and spell correction configuration.

220

221

```python { .api }

222

class SearchRequestQueryExpansionSpec:

223

condition: QueryExpansionSpecCondition # AUTO, DISABLED

224

pin_unexpanded_results: bool # Pin original results

225

226

class SearchRequestSpellCorrectionSpec:

227

mode: SpellCorrectionSpecMode # AUTO, DISABLED

228

229

class SearchResponseQueryExpansionInfo:

230

expanded_query: bool # Whether query was expanded

231

pinned_result_count: int # Number of pinned unexpanded results

232

```

233

234

## Usage Examples

235

236

### Basic Product Search

237

238

```python

239

from google.cloud import retail

240

241

client = retail.SearchServiceClient()

242

243

# Basic search with query

244

request = retail.SearchRequest(

245

placement="projects/my-project/locations/global/catalogs/default_catalog/placements/search",

246

query="gaming laptop",

247

page_size=20,

248

visitor_id="visitor-123"

249

)

250

251

response = client.search(request=request)

252

253

print(f"Found {response.total_size} products")

254

for result in response.results:

255

product = result.product

256

print(f"- {product.title} (${product.price_info.price})")

257

```

258

259

### Advanced Search with Filtering and Faceting

260

261

```python

262

# Advanced search with filters, facets, and personalization

263

request = retail.SearchRequest(

264

placement="projects/my-project/locations/global/catalogs/default_catalog/placements/search",

265

query="laptop",

266

filter='(categories: ANY("Electronics", "Computers")) AND (price_info.price: [200, 2000])',

267

facet_specs=[

268

retail.SearchRequest.FacetSpec(

269

facet_key=retail.SearchRequest.FacetSpec.FacetKey(

270

key="brands"

271

),

272

limit=10

273

),

274

retail.SearchRequest.FacetSpec(

275

facet_key=retail.SearchRequest.FacetSpec.FacetKey(

276

key="price_info.price",

277

intervals=[

278

retail.Interval(minimum=0, maximum=500),

279

retail.Interval(minimum=500, maximum=1000),

280

retail.Interval(minimum=1000, maximum=2000),

281

retail.Interval(minimum=2000)

282

]

283

)

284

),

285

retail.SearchRequest.FacetSpec(

286

facet_key=retail.SearchRequest.FacetSpec.FacetKey(

287

key="attributes.screen_size"

288

),

289

limit=5

290

)

291

],

292

order_by="price_info.price desc",

293

visitor_id="visitor-123",

294

user_info=retail.UserInfo(

295

user_id="user-456",

296

ip_address="192.168.1.100"

297

)

298

)

299

300

response = client.search(request=request)

301

302

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

303

print(f"Corrected query: {response.corrected_query}")

304

305

# Display products

306

for result in response.results:

307

product = result.product

308

print(f"- {product.title}")

309

print(f" Price: ${product.price_info.price}")

310

print(f" Brand: {', '.join(product.brands)}")

311

print(f" Categories: {', '.join(product.categories)}")

312

313

# Display facets

314

print("\nFacets:")

315

for facet in response.facets:

316

print(f"\n{facet.key}:")

317

for value in facet.values[:5]: # Show top 5 values

318

print(f" {value.value} ({value.count})")

319

```

320

321

### Search with Boosting

322

323

```python

324

# Search with conditional boosting for promoted products

325

boost_spec = retail.SearchRequest.BoostSpec(

326

condition_boost_specs=[

327

retail.SearchRequest.BoostSpec.ConditionBoostSpec(

328

condition='(tags: ANY("promoted"))',

329

boost=2.0 # Double the relevance score

330

),

331

retail.SearchRequest.BoostSpec.ConditionBoostSpec(

332

condition='(brands: ANY("TechBrand"))',

333

boost=1.5 # 1.5x boost for preferred brand

334

)

335

]

336

)

337

338

request = retail.SearchRequest(

339

placement="projects/my-project/locations/global/catalogs/default_catalog/placements/search",

340

query="laptop",

341

boost_spec=boost_spec,

342

visitor_id="visitor-123"

343

)

344

345

response = client.search(request=request)

346

```

347

348

### Query Auto-completion

349

350

```python

351

completion_client = retail.CompletionServiceClient()

352

353

# Get query suggestions

354

request = retail.CompleteQueryRequest(

355

catalog="projects/my-project/locations/global/catalogs/default_catalog",

356

query="gam", # User has typed "gam"

357

max_suggestions=10,

358

visitor_id="visitor-123"

359

)

360

361

response = completion_client.complete_query(request=request)

362

363

print("Completion suggestions:")

364

for result in response.completion_results:

365

print(f"- {result.suggestion}")

366

367

print("\nRecent searches:")

368

for recent in response.recent_search_results:

369

print(f"- {recent.recent_search}")

370

```

371

372

### Personalized Search

373

374

```python

375

# Search with enhanced personalization

376

personalization_spec = retail.SearchRequest.PersonalizationSpec(

377

mode=retail.SearchRequest.PersonalizationSpec.Mode.AUTO

378

)

379

380

request = retail.SearchRequest(

381

placement="projects/my-project/locations/global/catalogs/default_catalog/placements/search",

382

query="laptop",

383

visitor_id="visitor-123",

384

user_info=retail.UserInfo(

385

user_id="user-456",

386

ip_address="192.168.1.100",

387

user_agent="Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36"

388

),

389

personalization_spec=personalization_spec

390

)

391

392

response = client.search(request=request)

393

394

# Check personalization details

395

if response.personalization_info:

396

print(f"Personalization mode: {response.personalization_info.personalization_mode}")

397

print(f"User ID: {response.personalization_info.user_id}")

398

```