Search Results Quality Survey

The Search Results Quality Survey helps product and UX teams understand how well their search functionality serves users. This form captures whether users found what they were looking for, rates the relevance of results, and identifies search queries that need improvement. With conditional logic that adapts based on success or failure, you'll gather specific feedback about missing results, irrelevant matches, or confusing result ordering. Track search satisfaction over time to measure improvements.

Website & UX

Try the Form

Help us improve your search experience.
What were you searching for?
 
Search Results
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
export function searchFeedbackForm(form: FormTs) {
// Search Results Quality Survey
// Demonstrates: ThumbRating, StarRating, EmojiRating, RatingScale,
// RadioButton, SuggestionChips, Textbox, dynamic visibility, computed values
 
// ============================================
// HEADER
// ============================================
form.addRow(row => {
row.addTextPanel('header', {
label: 'Search Feedback',
computedValue: () => 'Help us improve your search experience.',
customStyles: {
backgroundColor: '#6366f1',
color: 'white',
padding: '24px',
borderRadius: '12px',
textAlign: 'center',
fontSize: '15px'
}
});
});
 
// ============================================
// SECTION 1: Search Query Context
// ============================================
const querySection = form.addSubform('query', {
title: 'What were you searching for?',
customStyles: { backgroundColor: '#eef2ff', padding: '20px', borderRadius: '10px' }
});
 
querySection.addRow(row => {
row.addTextbox('searchQuery', {
label: 'Your search term',
placeholder: 'Enter what you searched for...',
isRequired: true
});
});
 
// ============================================
// SECTION 2: Did You Find It?
// ============================================
const foundSection = form.addSubform('found', {
title: 'Search Results'
});
 
foundSection.addRow(row => {
row.addThumbRating('foundResult', {
label: 'Did you find what you were looking for?',
showLabels: true,
upLabel: 'Yes, found it!',
downLabel: 'No, didn\'t find it',
alignment: 'center',
size: 'lg'
});
});
 
// ============================================
// SECTION 3A: Successful Search Flow
// ============================================
const successSection = form.addSubform('success', {
title: 'Great! Tell us more',
isVisible: () => foundSection.thumbRating('foundResult')?.value() === 'up',
customStyles: { backgroundColor: '#ecfdf5', padding: '20px', borderRadius: '10px' }
});
 
successSection.addRow(row => {
row.addStarRating('relevanceRating', {
label: 'How relevant were the search results?',
maxStars: 5,
size: 'lg',
alignment: 'center',
filledColor: '#10b981',
showConfettiOnMax: true
});
});
 
successSection.addRow(row => {
row.addRadioButton('resultPosition', {
label: 'Where did you find your answer?',
options: [
{ id: 'first', name: 'First result' },
{ id: 'top3', name: 'In top 3 results' },
{ id: 'first-page', name: 'First page of results' },
{ id: 'second-page', name: 'Had to go to page 2 or later' },
{ id: 'refined', name: 'Had to refine my search' }
],
orientation: 'vertical',
isVisible: () => successSection.starRating('relevanceRating')?.value() !== null
});
});
 
successSection.addRow(row => {
row.addEmojiRating('searchExperience', {
label: 'How was your overall search experience?',
preset: 'satisfaction',
size: 'lg',
showLabels: true,
alignment: 'center',
isVisible: () => successSection.radioButton('resultPosition')?.value() !== null
});
});
 
// ============================================
// SECTION 3B: Unsuccessful Search Flow
// ============================================
const failSection = form.addSubform('fail', {
title: 'Help us improve',
isVisible: () => foundSection.thumbRating('foundResult')?.value() === 'down',
customStyles: { backgroundColor: '#fef2f2', padding: '20px', borderRadius: '10px' }
});
 
failSection.addRow(row => {
row.addRadioButton('whyNotFound', {
label: 'Why couldn\'t you find what you needed?',
options: [
{ id: 'no-results', name: 'No results were shown' },
{ id: 'irrelevant', name: 'Results weren\'t relevant' },
{ id: 'not-exist', name: 'Content doesn\'t exist on this site' },
{ id: 'wrong-order', name: 'Right result was buried too far down' },
{ id: 'confusing', name: 'Couldn\'t tell which result to click' },
{ id: 'broken', name: 'Search didn\'t work properly' }
],
orientation: 'vertical',
isRequired: true
});
});
 
// No results follow-up
failSection.addRow(row => {
row.addTextarea('expectedContent', {
label: 'What were you hoping to find?',
placeholder: 'Describe the information or page you were looking for...',
rows: 3,
isVisible: () => {
const reason = failSection.radioButton('whyNotFound')?.value();
return reason === 'no-results' || reason === 'not-exist';
}
});
});
 
// Irrelevant results follow-up
failSection.addRow(row => {
row.addRatingScale('resultQuality', {
label: 'How would you rate the quality of results you saw?',
preset: 'likert-5',
lowLabel: 'Completely wrong',
highLabel: 'Almost right',
alignment: 'center',
isVisible: () => {
const reason = failSection.radioButton('whyNotFound')?.value();
return reason === 'irrelevant' || reason === 'wrong-order';
}
});
});
 
failSection.addRow(row => {
row.addTextarea('whatWasWrong', {
label: 'What was wrong with the results?',
placeholder: 'Help us understand what you expected to see...',
rows: 3,
isVisible: () => {
const reason = failSection.radioButton('whyNotFound')?.value();
return reason === 'irrelevant' || reason === 'wrong-order' || reason === 'confusing';
}
});
});
 
// Technical issue follow-up
failSection.addRow(row => {
row.addTextarea('technicalIssue', {
label: 'Describe what happened',
placeholder: 'Error message, loading issue, etc...',
rows: 2,
isVisible: () => failSection.radioButton('whyNotFound')?.value() === 'broken'
});
});
 
// ============================================
// SECTION 4: Search Improvement Suggestions
// ============================================
const improvementSection = form.addSubform('improvement', {
title: 'Search Improvements',
isVisible: () => foundSection.thumbRating('foundResult')?.value() !== null
});
 
improvementSection.addRow(row => {
row.addSuggestionChips('searchFeatures', {
label: 'Which features would improve your search experience?',
suggestions: [
{ id: 'filters', name: 'Better filters' },
{ id: 'preview', name: 'Result previews' },
{ id: 'suggestions', name: 'Search suggestions' },
{ id: 'autocomplete', name: 'Autocomplete' },
{ id: 'recent', name: 'Recent searches' },
{ id: 'categories', name: 'Category filters' },
{ id: 'sorting', name: 'Better sorting options' }
],
alignment: 'center',
max: 3
});
});
 
// ============================================
// SECTION 5: Overall Assessment
// ============================================
const overallSection = form.addSubform('overall', {
title: 'Overall Search Rating',
isVisible: () => foundSection.thumbRating('foundResult')?.value() !== null,
customStyles: () => {
const found = foundSection.thumbRating('foundResult')?.value();
if (found === 'up') return { backgroundColor: '#f0fdf4', padding: '20px', borderRadius: '10px' };
return { backgroundColor: '#fefce8', padding: '20px', borderRadius: '10px' };
}
});
 
overallSection.addRow(row => {
row.addRatingScale('npsSearch', {
label: 'How likely are you to recommend our search to others?',
preset: 'nps',
showCategoryLabel: true,
showSegmentColors: true,
alignment: 'center'
});
});
 
// ============================================
// SECTION 6: Additional Comments
// ============================================
const commentsSection = form.addSubform('comments', {
title: 'Additional Feedback',
isVisible: () => foundSection.thumbRating('foundResult')?.value() !== null
});
 
commentsSection.addRow(row => {
row.addTextarea('additionalFeedback', {
label: () => {
const found = foundSection.thumbRating('foundResult')?.value();
if (found === 'up') return 'Anything else you\'d like us to know about your search experience?';
return 'Any other suggestions to improve our search?';
},
placeholder: 'Your thoughts help us improve...',
rows: 3,
autoExpand: true
});
});
 
// ============================================
// SECTION 7: Summary
// ============================================
const summarySection = form.addSubform('summary', {
title: 'Feedback Summary',
isVisible: () => foundSection.thumbRating('foundResult')?.value() !== null
});
 
summarySection.addRow(row => {
row.addTextPanel('summaryContent', {
computedValue: () => {
const query = querySection.textbox('searchQuery')?.value();
const found = foundSection.thumbRating('foundResult')?.value();
const relevance = successSection.starRating('relevanceRating')?.value();
const position = successSection.radioButton('resultPosition')?.value();
const experience = successSection.emojiRating('searchExperience')?.value();
const whyNot = failSection.radioButton('whyNotFound')?.value();
const nps = overallSection.ratingScale('npsSearch')?.value();
const features = improvementSection.suggestionChips('searchFeatures')?.value() || [];
 
if (!found) return '';
 
let summary = '🔍 Search Feedback Summary\n';
summary += `${'═'.repeat(30)}\n\n`;
 
if (query) {
summary += `📝 Search Query: "${query}"\n\n`;
}
 
if (found === 'up') {
summary += `✅ Result: Found what was needed\n`;
 
if (relevance !== null && relevance !== undefined) {
summary += `⭐ Relevance: ${'★'.repeat(relevance)}${'☆'.repeat(5 - relevance)}\n`;
}
 
if (position) {
const positionLabels: Record<string, string> = {
'first': 'First result',
'top3': 'Top 3 results',
'first-page': 'First page',
'second-page': 'Page 2+',
'refined': 'After refining search'
};
summary += `📍 Found In: ${positionLabels[position] || position}\n`;
}
 
if (experience) {
const expLabels: Record<string, string> = {
'very-bad': '😡 Very Bad',
'bad': '😕 Bad',
'neutral': '😐 Neutral',
'good': '🙂 Good',
'excellent': '😍 Excellent'
};
summary += `💫 Experience: ${expLabels[experience] || experience}\n`;
}
} else {
summary += `❌ Result: Didn't find it\n`;
 
if (whyNot) {
const reasonLabels: Record<string, string> = {
'no-results': 'No results shown',
'irrelevant': 'Results not relevant',
'not-exist': 'Content doesn\'t exist',
'wrong-order': 'Result buried too far',
'confusing': 'Unclear which to click',
'broken': 'Search didn\'t work'
};
summary += `❓ Reason: ${reasonLabels[whyNot] || whyNot}\n`;
}
}
 
if (features.length > 0) {
summary += `\n💡 Requested Features: ${features.length} selected\n`;
}
 
if (nps !== null && nps !== undefined) {
const category = overallSection.ratingScale('npsSearch')?.npsCategory();
const emoji = category === 'promoter' ? '🎉' : category === 'passive' ? '🤔' : '😟';
summary += `\n${emoji} NPS: ${nps}/10 (${category})`;
}
 
return summary;
},
customStyles: () => {
const found = foundSection.thumbRating('foundResult')?.value();
const base = {
padding: '20px',
borderRadius: '10px',
whiteSpace: 'pre-wrap',
fontFamily: 'monospace',
fontSize: '14px'
};
 
if (found === 'up') {
return { ...base, backgroundColor: '#ecfdf5', borderLeft: '4px solid #10b981' };
}
return { ...base, backgroundColor: '#fef2f2', borderLeft: '4px solid #ef4444' };
}
});
});
 
// ============================================
// FORM CONFIGURATION
// ============================================
form.configureSubmitButton({
label: () => {
const found = foundSection.thumbRating('foundResult')?.value();
if (found === 'up') return 'Submit Positive Feedback';
if (found === 'down') return 'Submit & Help Us Improve';
return 'Submit Feedback';
},
isVisible: () => foundSection.thumbRating('foundResult')?.value() !== null
});
 
form.configureCompletionScreen({
type: 'text',
title: () => {
const found = foundSection.thumbRating('foundResult')?.value();
if (found === 'up') return 'Thanks for your feedback!';
return 'Thank you for helping us improve!';
},
message: () => {
const found = foundSection.thumbRating('foundResult')?.value();
if (found === 'up') {
return 'We\'re glad our search helped you find what you needed. Your feedback helps us make it even better.';
}
return 'We\'re sorry the search didn\'t work well for you. Our team reviews all feedback to improve the search experience.';
}
});
}
 

Frequently Asked Questions

When should I show this search feedback form?

Best triggers: After a user performs a search and either clicks a result or doesn't click anything (indicating no relevant results). You can also show it when users refine their search multiple times, suggesting initial results weren't helpful.

What search metrics should I track?

Key metrics include: Search success rate (found what looking for), Relevance score (quality of top results), Zero-result rate, Query refinement rate, Click-through position (how far users scroll), and Time to first click. This form focuses on qualitative feedback to complement these metrics.

How do I identify problematic search queries?

Filter feedback by: Queries with 'not found' responses, Low relevance ratings (1-2 stars), High-volume queries with below-average satisfaction, Queries with user comments about missing results. These indicate search algorithm improvements needed.

Should I capture the actual search query?

Yes, always capture the query for context. You can auto-populate this from URL parameters or pass it programmatically. This enables query-level analysis and helps identify patterns in failing searches.

How can search feedback improve my algorithm?

Use feedback to: Add synonyms for queries that don't match expected results, Boost or bury specific results based on relevance ratings, Identify content gaps (users searching for things you don't have), Tune ranking factors like recency or popularity.

What's a good search satisfaction benchmark?

Aim for 75%+ 'Found what I was looking for' rate. E-commerce typically sees 60-70%, while documentation sites should target 80%+. Track your improvement over time rather than comparing to industry averages.